//internal static IBaseCacheStrategy<TKey, TValue> GetContainerCacheStrategy<TKey, TValue>() // where TKey : class // where TValue : class //{ // return; //} /// <summary> /// 注册当前全局环境下的缓存策略,并立即启用。 /// </summary> /// <param name="func">如果为 null,将使用默认的本地缓存策略(LocalObjectCacheStrategy.Instance)</param> public static void RegisterObjectCacheStrategy(Func <IBaseObjectCacheStrategy> func) { ObjectCacheStrateFunc = func; if (func != null) { ObjectCacheStrate = func();//提前运行一次,否则第一次运行开销比较大(400毫秒以上) } }
public static async Task <IList <T> > GetAllByPrefixAsync <T>(this IBaseObjectCacheStrategy obj, string key) { if (obj is RedisObjectCacheStrategy) { var _obj = obj as RedisObjectCacheStrategy; return(await _obj.GetAllByPrefixAsync <T>(key)); } throw new Exception("未实现或缓存不支持前缀方式获取缓存!"); }
public void ExpireTest() { BaseTest.RegisterServiceCollection(); var caches = new IBaseObjectCacheStrategy[] { LocalObjectCacheStrategy.Instance, RedisObjectCacheStrategy.Instance, RedisHashSetObjectCacheStrategy.Instance//, // MemcachedObjectCacheStrategy.Instance }; RedisManager.ConfigurationOption = "localhost:6379"; var index = 0; foreach (var cache in caches) { Console.WriteLine($"开始缓存测试;{cache}"); CacheStrategyFactory.RegisterObjectCacheStrategy(() => cache); var cacheStrategy = CacheStrategyFactory.GetObjectCacheStrategyInstance(); var dt = SystemTime.Now; var key = $"RedisTest-{SystemTime.Now.Ticks}"; cacheStrategy.Set(key, new TestCustomObject() { Id = ++index, Name = "",// Newtonsoft.Json.JsonConvert.SerializeObject(this), AddTime = dt }, TimeSpan.FromMilliseconds(500)); var entity = cacheStrategy.Get(key); Assert.IsNotNull(entity); var strongEntity = cacheStrategy.Get <TestCustomObject>(key); Assert.IsNotNull(strongEntity); Assert.AreEqual(index, strongEntity.Id); Assert.AreEqual(dt, strongEntity.AddTime); Thread.Sleep(500);//让缓存过期 entity = cacheStrategy.Get(key); if (cache.GetType() == typeof(RedisHashSetObjectCacheStrategy)) { Assert.IsNotNull(entity);//RedisHashSet 不支持过期 } else { Assert.IsNull(entity); } } }
/// <summary> /// 注册 Redis 缓存信息 /// </summary> /// <param name="registerService">RegisterService</param> /// <param name="redisConfigurationString">Redis的连接字符串</param> /// <param name="redisObjectCacheStrategyInstance">缓存策略的委托,第一个参数为 redisConfigurationString</param> /// <returns></returns> public static IRegisterService RegisterCacheRedis(this IRegisterService registerService, string redisConfigurationString, Func<string, IBaseObjectCacheStrategy> redisObjectCacheStrategyInstance) { RedisManager.ConfigurationOption = redisConfigurationString; //此处先执行一次委托,直接在下方注册结果,提高每次调用的执行效率 IBaseObjectCacheStrategy objectCacheStrategy = redisObjectCacheStrategyInstance(redisConfigurationString); if (objectCacheStrategy != null) { CacheStrategyFactory.RegisterObjectCacheStrategy(() => objectCacheStrategy);//Redis } return registerService; }
public static IRegisterService RegisterCacheMemcached(this IRegisterService registerService, Dictionary <string, int> memcachedConfig, Func <Dictionary <string, int>, IBaseObjectCacheStrategy> memcachedObjectCacheStrategyInstance) { MemcachedObjectCacheStrategy.RegisterServerList(memcachedConfig); //此处先执行一次委托,直接在下方注册结果,提高每次调用的执行效率 IBaseObjectCacheStrategy objectCacheStrategy = memcachedObjectCacheStrategyInstance(memcachedConfig); if (objectCacheStrategy != null) { CacheStrategyFactory.RegisterObjectCacheStrategy(() => objectCacheStrategy);//Memcached } return(registerService); }
/// <summary> /// 获取领域缓存(指定特定 的IBaseObjectCacheStrategy 缓存策略对象) /// </summary> /// <param name="baseObjectCacheStrategy">IBaseObjectCacheStrategy 缓存策略对象</param> /// <param name="cacheStrategyDomain">缓存领域</param> /// <returns></returns> public static IDomainExtensionCacheStrategy GetDomainExtensionCacheStrategy(IBaseObjectCacheStrategy baseObjectCacheStrategy, ICacheStrategyDomain cacheStrategyDomain) { var identityName = cacheStrategyDomain.IdentityName; var mappingCollection = GetMappingCollection(identityName);//当前扩展缓存可能已经注册的所有基础缓存 if (mappingCollection.ContainsKey(baseObjectCacheStrategy)) { var item = mappingCollection[baseObjectCacheStrategy]; return(item.DomainExtensionCacheStrategy); } else { //未注册,默认情况下使用本地缓存策略(应急) var ex = new Exceptions.UnregisteredDomainCacheStrategyException(cacheStrategyDomain.GetType(), baseObjectCacheStrategy.GetType()); SenparcTrace.BaseExceptionLog(ex); throw ex; } }
public RedisContainerCacheStrategyTest() { containerCache = RedisContainerCacheStrategy.Instance; baseCache = containerCache.BaseCacheStrategy(); }