//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("未实现或缓存不支持前缀方式获取缓存!");
 }
Exemple #3
0
        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);
                }
            }
        }
Exemple #4
0
        /// <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);
        }
Exemple #6
0
        /// <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();
 }