using System; using System.Collections.Generic; using ServiceStack.Redis; using CP.Cache.Redis.Config; using Newtonsoft.Json; using ServiceStack.Text; namespace CP.Cache.Redis { public class RedisManager : ICache { static PooledRedisClientManager pooledRedis; static RedisManager() { RedisConfig redis = RedisConfigPool.GetRedisConfig(); List readWriteHosts = new List(); var readOnlyHosts = new List(); redis.ReadWriteHosts.ForEach(p => { readWriteHosts.Add(p.Host); }); redis.ReadOnlyHosts.ForEach(p => { readOnlyHosts.Add(p.Host); }); pooledRedis = new PooledRedisClientManager(readWriteHosts.ToArray(), readOnlyHosts.ToArray(), redis.RedisClientManagerConfig); } public static IRedisClient GetClient() { RedisConfig redisConfig = RedisConfigPool.GetRedisConfig(); IRedisClient redis = pooledRedis.GetClient(); if (redisConfig.ConnectTimeout > 0) { redis.ConnectTimeout = redisConfig.ConnectTimeout; } if (redisConfig.RetryCount > 0) { redis.RetryCount = redisConfig.RetryCount; } if (redisConfig.RetryTimeout > 0) { redis.RetryTimeout = redisConfig.RetryTimeout; } if (redisConfig.SendTimeout > 0) { redis.SendTimeout = redisConfig.SendTimeout; } redis.Password = redisConfig.Password; return redis; } public bool IsExist(string key) { using (IRedisClient redis = GetClient()) { return redis.ContainsKey(key); } } /// /// 添加实体集合到缓存中 /// /// 缓存键 /// 实体类型 /// 实体集合 /// 成功返回True,失败返回False public void AddObject(string key, T t, int expires = 0) { using (IRedisClient redis = GetClient()) { if (expires > 0) redis.Set(key, t, DateTime.Now.AddMinutes(expires)); else redis.Set(key, t); } } /// /// 返回T /// /// /// /// public T GetObject(string key) { var tp = typeof(T); if (tp.IsArray) { return JsonConvert.DeserializeObject(GetString(key)); } using (IRedisClient redis = GetClient()) { return redis.Get(key); } } /// /// 获取文本 /// /// 缓存键名 /// 返回对应的键值或者string.Empty public string GetString(string key) { return GetObject(key); } /// /// 获取所有键 /// /// 返回所有缓存键 public List GetKeys() { using (IRedisClient redis = GetClient()) { return redis.GetAllKeys(); } } /// /// 删除指定键缓存 /// /// 键名 /// 成功返回True,失败返回False public void RemoveObject(string key) { using (IRedisClient redis = GetClient()) { redis.Remove(key); } } /// /// 批量移出类型key的对像 /// /// public void RemoveObjectByRegex(string key) { var list = GetKeys(); if (list != null && list.Count > 0) { foreach(string item in list) { if (item.IndexOf(key, StringComparison.CurrentCultureIgnoreCase) != -1) RemoveObject(key); } } } /// /// 删除指定键缓存 /// /// 键名 public void RemoveAll() { using (IRedisClient redis = GetClient()) { List keys = GetKeys(); redis.RemoveAll(keys); } } } }