//slidingExpiration 时间内无访问则过期
        public void Overwrite <T>(String key, T value, TimeSpan slidingExpiration)
        {
            //_client.Store(StoreMode.Set, BuildCacheKey(key), value, slidingExpiration);
            var cacheWraper = new SlidingCacheWrapper <T>(value, slidingExpiration);

            _client.Store(StoreMode.Set, BuildCacheKey(key), cacheWraper,
                          TimeSpan.FromSeconds(slidingExpiration.TotalSeconds * 1.5));
        }
        public override bool TryGet <T>(string key, out T entry)
        {
            Object  cacheEntry;
            Boolean exist = TryGetObject(key, out cacheEntry);

            if (!exist)
            {
                //不存在
                entry = default(T);
                return(false);
            }
            if (cacheEntry == null)
            {
                //存在但为 null
                entry = (T)((Object)null);
                return(true);
            }
            if (cacheEntry is T)
            {
                //存在,直接返回
                entry = (T)cacheEntry;
                return(true);
            }

            //使用与不使用 NewtonsoftJsonTranscoder 的情况下都支持
            SlidingCacheWrapper <T> slidingCache;

            if (SlidingCacheWrapper <T> .IsSlidingCache(cacheEntry, out slidingCache))
            {
                //尝试以 SlidingCacheWrapper<T> 处理
                var diffSpan = DateTime.Now.Subtract(slidingCache.SettingTime);
                //当前时间-设置时间>滑动时间, 已经过期
                if (diffSpan > slidingCache.SlidingExpiration)
                {
                    Expire(key);
                    entry = default(T);
                    return(false);
                }

                //当前时间-设置时间> 滑动时间/2, 更新缓存
                if (diffSpan.Add(diffSpan) > slidingCache.SlidingExpiration)
                {
                    Overwrite(key, slidingCache.Value, slidingCache.SlidingExpiration);
                }
                entry = slidingCache.Value;
            }
            else
            {
                //尝试以普通JSON处理
                entry = NewtonsoftJsonUtil.EnsureObjectType <T>(cacheEntry);
            }
            return(true);
        }
Exemplo n.º 3
0
        //slidingExpiration 时间内无访问则过期
        public override void Overwrite <T>(String key, T value, TimeSpan slidingExpiration)
        {
            if (_config.Readonly)
            {
                throw new InvalidOperationException();
            }
            //_client.Store(StoreMode.Set, BuildCacheKey(key), value, slidingExpiration);
            var cacheWraper = new SlidingCacheWrapper <T>(value, slidingExpiration);

            _client.Store(StoreMode.Set, BuildCacheKey(key), cacheWraper,
                          TimeSpan.FromSeconds(slidingExpiration.TotalSeconds * 1.5));
        }
Exemplo n.º 4
0
        public override bool TryGet <T>(string key, out T value)
        {
            String cacheKey = BuildCacheKey(key);
            Object cacheValue;

            var exists = _client.TryGet(cacheKey, out cacheValue);

            if (!exists)
            {
                value = default(T);
                return(false);
            }
            if (cacheValue is T)
            {
                value = (T)cacheValue;
                return(true);
            }
            if (cacheValue == null)
            {
                value = (T)((Object)null);
                return(true);
            }
            //使用与不使用 NewtonsoftJsonTranscoder 的情况下都支持
            SlidingCacheWrapper <T> slidingCache;

            if (SlidingCacheWrapper <T> .IsSlidingCache(cacheValue, out slidingCache))
            {
                //尝试以 SlidingCacheWrapper<T> 处理
                var diffSpan = DateTime.Now.Subtract(slidingCache.SettingTime);
                //当前时间-设置时间>滑动时间, 已经过期
                if (diffSpan > slidingCache.SlidingExpiration)
                {
                    Expire(key);
                    value = default(T);
                    return(false);
                }

                //当前时间-设置时间> 滑动时间/2, 更新缓存
                if (diffSpan.Add(diffSpan) > slidingCache.SlidingExpiration)
                {
                    Overwrite(key, slidingCache.Value, slidingCache.SlidingExpiration);
                }
                value = slidingCache.Value;
            }
            else
            {
                //尝试以普通JSON处理
                value = NewtonsoftJsonUtil.EnsureObjectType <T>(cacheValue);
            }
            return(true);
        }
 public static Boolean IsSlidingCache(Object obj, out SlidingCacheWrapper <T> cacheEntry)
 {
     cacheEntry = null;
     if (obj is SlidingCacheWrapper <T> )
     {
         cacheEntry = (SlidingCacheWrapper <T>)obj;
         return(true);
     }
     if (obj is JObject)
     {
         var jobj = (JObject)obj;
         if (jobj.Property(SlidingExpirationProp) != null && jobj.Property(SettingTimeProp) != null)
         {
             cacheEntry = jobj.ToObject <SlidingCacheWrapper <T> >();
             return(true);
         }
     }
     return(false);
 }