using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Senparc.Weixin.Containers; using ServiceStack.Redis; using ServiceStack.Redis.Generic; namespace Senparc.Weixin.Cache.Redis { /// /// Redis容器缓存策略 /// public sealed class RedisContainerCacheStrategy : IContainerCacheStragegy { private IRedisClient _client; private IRedisTypedClient _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 cache = RedisManager.GetClient(); var testKey = Guid.NewGuid().ToString(); var testValue = Guid.NewGuid().ToString(); cache.Set(testKey, testValue); var storeValue = cache.Get(testKey); if (storeValue != testValue) { throw new Exception("RedisStrategy失效,没有计入缓存!"); } cache.Remove(testKey); } public RedisContainerCacheStrategy() { //_config = RedisConfigInfo.GetConfig(); _client = RedisManager.GetClient(); _cache = _client.As(); } ~RedisContainerCacheStrategy() { _client.Dispose();//释放 //GC.SuppressFinalize(_client); } private string GetFinalKey(string key) { return String.Format("{0}:{1}", CacheSetKey, key); } /// /// 获取hash /// /// private IRedisHash GetHash() { return _cache.GetHash(CacheSetKey); } #region 实现 IContainerCacheStragegy 接口 public string CacheSetKey { get; set; } public bool CheckExisted(string key) { return _client.ContainsKey(key); } public IContainerItemCollection Get(string key) { if (string.IsNullOrEmpty(key)) { return null; } var cacheKey = GetFinalKey(key); var hash = GetHash(); return _cache.GetValueFromHash(hash, cacheKey); } public IDictionary GetAll() { var hash = GetHash(); var list = _cache.GetHashValues(hash);//.GetAllEntriesFromHash(hash); var dic = new Dictionary(); list.ForEach(z => dic[z.CacheSetKey] = z); return dic; } public long GetCount() { return _client.GetAllKeys().Count(z => z.StartsWith(CacheSetKey)); } public void InsertToCache(string key, IContainerItemCollection value) { if (string.IsNullOrEmpty(key) || value == null) { return; } var cacheKey = GetFinalKey(key); if (value is IDictionary) { //Dictionary类型 } //TODO:加了绝对过期时间就会立即失效(再次获取后为null),memcache低版本的bug var hash = GetHash(); _cache.SetEntryInHash(hash, cacheKey, value); //_cache.SetEntry(cacheKey, obj); #if DEBUG var value1 = _cache.GetFromHash(cacheKey);//正常情况下可以得到 //_cache.GetValue(cacheKey); var value2 = _cache.GetValueFromHash(hash, cacheKey);//正常情况下可以得到 var value3 = _cache.GetValue(cacheKey);//null #endif } public void RemoveFromCache(string key) { if (string.IsNullOrEmpty(key)) { return; } var cacheKey = GetFinalKey(key); var hash = GetHash(); _cache.RemoveEntryFromHash(hash, cacheKey); } public void Update(string key, IContainerItemCollection value) { var hash = GetHash(); _cache.SetEntryInHash(hash, key, value); } public void UpdateContainerBag(string key, IBaseContainerBag containerBag) { if (this.CheckExisted(key)) { var containerItemCollection = Get(key); containerItemCollection[containerBag.Key] = containerBag; var hash = GetHash(); _cache.SetEntryInHash(hash, key, containerItemCollection); } } #endregion } }