using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Senparc.Weixin.Containers; using StackExchange.Redis; using StackExchange.Redis.KeyspaceIsolation; namespace Senparc.Weixin.Cache.Redis { /// /// Redis容器缓存策略 /// public sealed class RedisContainerCacheStrategy : IContainerCacheStragegy { private ConnectionMultiplexer _client; private IDatabase _cache; #region 单例 //静态SearchCache public static RedisContainerCacheStrategy Instance { get { return Nested.instance;//返回Nested类中的静态成员instance } } class Nested { static Nested() { } //将instance设为一个初始化的BaseCacheStrategy新实例 internal static readonly RedisContainerCacheStrategy instance = new RedisContainerCacheStrategy(); } #endregion static RedisContainerCacheStrategy() { var manager = RedisManager.Manager; var cache = manager.GetDatabase(); var testKey = Guid.NewGuid().ToString(); var testValue = Guid.NewGuid().ToString(); cache.StringSet(testKey, testValue); var storeValue = cache.StringGet(testKey); if (storeValue != testValue) { throw new Exception("RedisStrategy失效,没有计入缓存!"); } cache.StringSet(testKey, (string)null); } public RedisContainerCacheStrategy() { _client = RedisManager.Manager; _cache = _client.GetDatabase(); } ~RedisContainerCacheStrategy() { _client.Dispose();//释放 //_client.Dispose();//释放 //GC.SuppressFinalize(_client); } private string GetFinalKey(string key) { //return String.Format("{0}:{1}", CacheSetKey, key); return String.Format("{0}{1}", CacheSetKey, key); } private IServer GetServer() { //https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/KeysScan.md var server = _client.GetServer(_client.GetEndPoints()[0]); return server; } #region 实现 IContainerCacheStragegy 接口 public string CacheSetKey { get; set; } public bool CheckExisted(string key) { return _cache.KeyExists(key); } public IContainerItemCollection Get(string key) { if (string.IsNullOrEmpty(key)) { return null; } var cacheKey = GetFinalKey(key); return _cache.HashGetAll(cacheKey).ConvertFromRedis(); } public IDictionary GetAll() { var keys = GetServer().Keys(); var dic = new Dictionary(); foreach (var redisKey in keys) { dic[redisKey] = Get(redisKey); } return dic; } public long GetCount() { var count = GetServer().Keys().Count(); return count; } public void InsertToCache(string key, IContainerItemCollection value) { if (string.IsNullOrEmpty(key) || value == null) { return; } var cacheKey = GetFinalKey(key); //if (value is IDictionary) //{ // //Dictionary类型 //} _cache.HashSet(cacheKey, value.ToHashEntries()); //_cache.SetEntry(cacheKey, obj); #if DEBUG var value1 = _cache.HashGetAll(cacheKey);//正常情况下可以得到 //_cache.GetValue(cacheKey); #endif } public void RemoveFromCache(string key) { if (string.IsNullOrEmpty(key)) { return; } var cacheKey = GetFinalKey(key); _cache.HashDelete(cacheKey, RedisValue.Null); } public void Update(string key, IContainerItemCollection value) { _cache.HashSet(key, value.ToHashEntries()); } public void UpdateContainerBag(string key, IBaseContainerBag containerBag) { if (this.CheckExisted(key)) { var containerItemCollection = Get(key); containerItemCollection[containerBag.Key] = containerBag; _cache.HashSet(key, containerItemCollection.ToHashEntries()); } } #endregion } }