/// <summary>
        /// 设置值
        /// </summary>
        public void Put(TKey key, TValue value, TimeSpan keepTime)
        {
            // 如果以前序列化失败过,直接使用备用的缓存
            if (SerializeFailedTypes.ContainsKey(typeof(TKey)) ||
                SerializeFailedTypes.ContainsKey(typeof(TValue)))
            {
                FallbackCache.Put(key, value, keepTime);
                return;
            }
            // 尝试序列化key和value,失败时使用备用的缓存
            string keyJson, valueJson;

            try {
                keyJson = JsonConvert.SerializeObject(key);
            } catch {
                SerializeFailedTypes[typeof(TKey)] = true;
                FallbackCache.Put(key, value, keepTime);
                return;
            }
            try {
                valueJson = JsonConvert.SerializeObject(value);
            } catch {
                SerializeFailedTypes[typeof(TValue)] = true;
                FallbackCache.Put(key, value, keepTime);
                return;
            }
            // 保存到Redis
            var db = RedisConnectionFactory.GetDatabase();

            db.StringSet(UniquePrefix + keyJson, valueJson, keepTime);
        }
        /// <summary>
        /// 获取值
        /// </summary>
        public bool TryGetValue(TKey key, out TValue value)
        {
            // 先从备用的缓存获取
            if (FallbackCache.TryGetValue(key, out value))
            {
                return(true);
            }
            // 不存在时尝试序列化key,失败时返回false
            string keyJson;

            try {
                keyJson = JsonConvert.SerializeObject(key);
            } catch {
                SerializeFailedTypes[typeof(TKey)] = true;
                return(false);
            }
            // 从Redis获取
            var db         = RedisConnectionFactory.GetDatabase();
            var redisValue = db.StringGet(UniquePrefix + keyJson);

            if (!redisValue.HasValue)
            {
                return(false);
            }
            // 反序列化值,失败时返回false
            try {
                value = JsonConvert.DeserializeObject <TValue>(redisValue.ToString());
            } catch {
                SerializeFailedTypes[typeof(TValue)] = true;
                return(false);
            }
            return(true);
        }
示例#3
0
        /// <summary>
        /// Returns cached item based on the provided key or null if item is not known.
        /// </summary>
        /// <param name="key">Key for item</param>
        /// <returns>Cached item or null if not found.</returns>
        public static object TryGet(object key)
        {
            Verify.ArgumentNotNull(key, "key");

            var context = HttpContext.Current;

            if (context != null)
            {
                return(context.Items[key]);
            }

            return(FallbackCache.ContainsKey(key) ? FallbackCache[key] : null);
        }
示例#4
0
        /// <summary>
        /// Checks if the cache has the provided key.
        /// </summary>
        /// <param name="key">Key for item</param>
        /// <returns>True when item exist in cache. Otherwise false.</returns>
        public static bool HasKey(object key)
        {
            Verify.ArgumentNotNull(key, "key");

            var httpContext = HttpContext.Current;

            if (httpContext != null)
            {
                return(httpContext.Items.Contains(key));
            }

            return(FallbackCache.ContainsKey(key));
        }
示例#5
0
        /// <summary>
        /// Add an item to the cache.
        /// </summary>
        /// <param name="key">Key for item. Used when retrieving/clearing item later.</param>
        /// <param name="value">The item to store.</param>
        public static void Add(object key, object value)
        {
            Verify.ArgumentNotNull(key, "key");

            var httpContext = HttpContext.Current;

            if (httpContext != null)
            {
                httpContext.Items.Add(key, value);
            }
            else
            {
                FallbackCache.Add(key, value);
            }
        }
示例#6
0
        /// <summary>
        /// Remove a named item from the cache.
        /// </summary>
        /// <param name="key">Key for item to remove</param>
        public static void Remove(object key)
        {
            Verify.ArgumentNotNull(key, "key");

            var context = HttpContext.Current;

            if (context != null)
            {
                context.Items.Remove(key);
            }
            else
            {
                FallbackCache.Remove(key);
            }
        }
        /// <summary>
        /// 删除所有缓存值
        /// </summary>
        public void Clear()
        {
            var db = RedisConnectionFactory.GetDatabase();

            foreach (var endpoint in RedisConnectionFactory.GetEndPoints())
            {
                var server = RedisConnectionFactory.GetServer(endpoint);
                foreach (var key in server.Keys())
                {
                    if (key.ToString().StartsWith(UniquePrefix))
                    {
                        db.KeyDelete(key);
                    }
                }
            }
            FallbackCache.Clear();
        }
        /// <summary>
        /// 获取缓存对象数量
        /// </summary>
        public int Count()
        {
            int count = 0;

            foreach (var endpoint in RedisConnectionFactory.GetEndPoints())
            {
                var server = RedisConnectionFactory.GetServer(endpoint);
                foreach (var key in server.Keys())
                {
                    if (key.ToString().StartsWith(UniquePrefix))
                    {
                        count += 1;
                    }
                }
            }
            count += FallbackCache.Count();
            return(count);
        }
        /// <summary>
        /// 删除值
        /// </summary>
        public void Remove(TKey key)
        {
            // 先从备用的缓存删除
            FallbackCache.Remove(key);
            // 尝试序列化key
            string keyJson;

            try {
                keyJson = JsonConvert.SerializeObject(key);
            } catch {
                SerializeFailedTypes[typeof(TKey)] = true;
                return;
            }
            // 从Redis删除
            var db = RedisConnectionFactory.GetDatabase();

            db.KeyDelete(UniquePrefix + keyJson);
        }