using ServiceStack.Redis; using ServiceStack.Redis.Generic; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace VueWebCoreApi.Tools { public class RedisHelper { /// /// redis获取连接配置字符串 /// private static readonly string RedisIpConnString = AppSetting.GetAppSetting("RedisConnIp"); private static readonly string RedisPortConnString = AppSetting.GetAppSetting("RedisConnPort"); private static readonly string RedisKeyTimeCont = AppSetting.GetAppSetting("RedisKeyTimeCont"); private static RedisClient Redis = new RedisClient(RedisIpConnString, Convert.ToInt32(RedisPortConnString)); //缓存池 static PooledRedisClientManager prcm = new PooledRedisClientManager(); //默认缓存过期时间单位秒 public int secondsTimeOut = Convert.ToInt32(RedisKeyTimeCont); private static readonly Dictionary pools = new Dictionary(); /// /// 缓冲池 /// /// /// /// private static void CreateManager(string[] readWriteHosts, string[] readOnlyHosts) { for (int i = 0; i <= 15; i++) { PooledRedisClientManager prc = new PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig { MaxWritePoolSize = readWriteHosts.Length * 512, //最大写链接数 MaxReadPoolSize = readOnlyHosts.Length * 512, //最大读链接数 AutoStart = true, //自动重启 }, i, 200, 10);// { RedisClientFactory = (IRedisClientFactory)RedisCacheClientFactory.Instance.CreateRedisClient("127.0.0.1", 6379) }; pools.Add(i, prc); } } public static PooledRedisClientManager ChooseRedisInstance(int database) { if (database > 16) return pools[0]; return pools[database]; } /// /// 构造函数 /// /// 是否开启缓冲池 static RedisHelper() { //CreateManager(new string[] { "127.0.0.1:6379" }, new string[] { "127.0.0.1:6379" }); CreateManager(new string[] { RedisIpConnString + ":" + RedisPortConnString }, new string[] { RedisIpConnString + ":" + RedisPortConnString }); //Redis = prcm.GetClient() as RedisClient; } #region Key/Value存储 /// /// 设置缓存 /// /// /// 缓存建 /// 缓存值 /// 过期时间,单位秒,-1:不过期,0:默认过期时间 /// public bool Set(string key, T t, int timeout = 0, int db = 0) { Redis = (RedisClient)ChooseRedisInstance(db).GetClient(); var values = Redis.Add(key, t); if (timeout >= 0) { if (timeout > 0) { secondsTimeOut = timeout; } Redis.Expire(key, secondsTimeOut); } Redis.Dispose(); return values; } /// /// 设置失效时间 /// /// /// /// public bool KeyExpire(string key, int expiry) { return Redis.Expire(key, expiry); } /// /// 获取 /// /// /// /// public T Get(string key, int db = 0) { Redis = (RedisClient)ChooseRedisInstance(db).GetClient(); var values = Redis.Get(key); Redis.Dispose(); return values; } /// /// 删除 /// /// /// public bool Remove(string key, int db = 0) { Redis = (RedisClient)ChooseRedisInstance(db).GetClient(); Redis.Dispose(); return Redis.Remove(key); } //public static bool Add(string key, T t, int timeout) //{ // var values = Redis.Add(key, t); // if (timeout >= 0) // { // if (timeout > 0) // { // secondsTimeOut = timeout; // } // Redis.Expire(key, secondsTimeOut); // } // return values; //} #endregion #region 链表操作 /// /// 根据IEnumerable数据添加链表 /// /// /// /// /// public void AddList(string listId, IEnumerable values, int timeout = 0) { Redis.Expire(listId, 60); IRedisTypedClient iredisClient = Redis.As(); if (timeout >= 0) { if (timeout > 0) { secondsTimeOut = timeout; } Redis.Expire(listId, secondsTimeOut); } var redisList = iredisClient.Lists[listId]; redisList.AddRange(values); iredisClient.Save(); Redis.Dispose(); } /// /// 添加单个实体到链表中 /// /// /// /// /// public void AddEntityToList(string listId, T Item, int timeout = 0, int db = 0) { Redis = (RedisClient)ChooseRedisInstance(db).GetClient(); IRedisTypedClient iredisClient = Redis.As(); if (timeout >= 0) { if (timeout > 0) { secondsTimeOut = timeout; } Redis.Expire(listId, secondsTimeOut); } var redisList = iredisClient.Lists[listId]; redisList.Add(Item); iredisClient.Save(); Redis.Dispose(); } /// /// 获取链表 /// /// /// /// public IEnumerable GetList(string listId, int db = 0) { Redis = (RedisClient)ChooseRedisInstance(db).GetClient(); IRedisTypedClient iredisClient = Redis.As(); Redis.Dispose(); return iredisClient.Lists[listId]; } /// /// 在链表中删除单个实体 /// /// /// /// public void RemoveEntityFromList(string listId, T t, int db = 0) { Redis = (RedisClient)ChooseRedisInstance(db).GetClient(); IRedisTypedClient iredisClient = Redis.As(); var redisList = iredisClient.Lists[listId]; redisList.RemoveValue(t); iredisClient.Save(); Redis.Dispose(); } /// /// 根据lambada表达式删除符合条件的实体 /// /// /// /// public void RemoveEntityFromList(string listId, Func func) { //using (IRedisTypedClient iredisClient = Redis.As()) //{ // var redisList = iredisClient.Lists[listId]; // T value = redisList.Where(func).FirstOrDefault(); // redisList.RemoveValue(value); // iredisClient.Save(); //} // 使用using 报错: // using 语句中使用的类型必须可隐式转换为“System.IDisposable” // using会自动调用System.IDisposable下的Dispose方法来释放非托管资源, // IRedisTypedClient没有继承System.IDisposable的接口,所以不能用 IRedisTypedClient iredisClient = Redis.As(); var redisList = iredisClient.Lists[listId]; T value = redisList.Where(func).FirstOrDefault(); redisList.RemoveValue(value); iredisClient.Save(); Redis.Dispose(); } public void test() { string s1 = Redis.GetClient(); List> s2 = Redis.GetClientsInfo(); List s3 = Redis.GetAllKeys(); string s4 = Redis.GetHostString(); long s5 = Redis.Db; } #endregion //释放资源 public void Dispose() { if (Redis != null) { Redis.Dispose(); Redis = null; } GC.Collect(); } } }