当前位置: 代码迷 >> C# >> 个人项目框架搭建 - 缓存接口与实现
  详细解决方案

个人项目框架搭建 - 缓存接口与实现

热度:477   发布时间:2016-04-28 08:18:54.0
个人项目框架搭建 -- 缓存接口与实现

1、缓存接口

using System;using System.Collections.Generic;using System.Runtime.Caching;using System.Text.RegularExpressions;namespace EnterpriseFrame.Core.Caching{    /// <summary>    /// Represents a manager for caching between HTTP requests (long term caching)    /// </summary>    public partial class MemoryCacheManager : ICacheManager    {        protected ObjectCache Cache        {            get            {                return MemoryCache.Default;            }        }                /// <summary>        /// Gets or sets the value associated with the specified key.        /// </summary>        /// <typeparam name="T">Type</typeparam>        /// <param name="key">The key of the value to get.</param>        /// <returns>The value associated with the specified key.</returns>        public virtual T Get<T>(string key)        {            return (T)Cache[key];        }        /// <summary>        /// Adds the specified key and object to the cache.        /// </summary>        /// <param name="key">key</param>        /// <param name="data">Data</param>        /// <param name="cacheTime">Cache time</param>        public virtual void Set(string key, object data, int cacheTime)        {            if (data == null)                return;            var policy = new CacheItemPolicy();            policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);            Cache.Add(new CacheItem(key, data), policy);        }        /// <summary>        /// Gets a value indicating whether the value associated with the specified key is cached        /// </summary>        /// <param name="key">key</param>        /// <returns>Result</returns>        public virtual bool IsSet(string key)        {            return (Cache.Contains(key));        }        /// <summary>        /// Removes the value with the specified key from the cache        /// </summary>        /// <param name="key">/key</param>        public virtual void Remove(string key)        {            Cache.Remove(key);        }        /// <summary>        /// Removes items by pattern        /// </summary>        /// <param name="pattern">pattern</param>        public virtual void RemoveByPattern(string pattern)        {            var regex = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);            var keysToRemove = new List<String>();            foreach (var item in Cache)                if (regex.IsMatch(item.Key))                    keysToRemove.Add(item.Key);            foreach (string key in keysToRemove)            {                Remove(key);            }        }        /// <summary>        /// Clear all cache data        /// </summary>        public virtual void Clear()        {            foreach (var item in Cache)                Remove(item.Key);        }    }}

2、扩展

using System;namespace EnterpriseFrame.Core.Caching{    /// <summary>    /// Extensions    /// </summary>    public static class CacheExtensions    {        /// <summary>        /// 获取缓存,不存在则将acquire的结果存入缓存,默认时间60分钟        /// </summary>        /// <typeparam name="T">Type</typeparam>        /// <param name="cacheManager">Cache manager</param>        /// <param name="key">Cache key</param>        /// <param name="acquire">Function to load item if it's not in the cache yet</param>        /// <returns>Cached item</returns>        public static T Get<T>(this ICacheManager cacheManager, string key, Func<T> acquire)        {            return Get(cacheManager, key, 60, acquire);        }        /// <summary>        /// 获取缓存,如果不存在缓存中,执行结果然后将其加载和缓存        /// </summary>        /// <typeparam name="T">缓存类型</typeparam>        /// <param name="cacheManager">Cache manager</param>        /// <param name="key">Cache key</param>        /// <param name="cacheTime">缓存时间 在0分钟-不要缓存</param>        /// <param name="acquire">没有缓存则执行此表达式设置缓存</param>        /// <returns>Cached item</returns>        public static T Get<T>(this ICacheManager cacheManager, string key, int cacheTime, Func<T> acquire)         {            if (cacheManager.IsSet(key))            {                return cacheManager.Get<T>(key);            }            else            {                var result = acquire();                if (cacheTime > 0)                    cacheManager.Set(key, result, cacheTime);                return result;            }        }    }}

 

3、MemoryCacheManager实现

using System;using System.Collections.Generic;using System.Runtime.Caching;using System.Text.RegularExpressions;namespace EnterpriseFrame.Core.Caching{    /// <summary>    /// Represents a manager for caching between HTTP requests (long term caching)    /// </summary>    public partial class MemoryCacheManager : ICacheManager    {        protected ObjectCache Cache        {            get            {                return MemoryCache.Default;            }        }                /// <summary>        /// Gets or sets the value associated with the specified key.        /// </summary>        /// <typeparam name="T">Type</typeparam>        /// <param name="key">The key of the value to get.</param>        /// <returns>The value associated with the specified key.</returns>        public virtual T Get<T>(string key)        {            return (T)Cache[key];        }        /// <summary>        /// Adds the specified key and object to the cache.        /// </summary>        /// <param name="key">key</param>        /// <param name="data">Data</param>        /// <param name="cacheTime">Cache time</param>        public virtual void Set(string key, object data, int cacheTime)        {            if (data == null)                return;            var policy = new CacheItemPolicy();            policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);            Cache.Add(new CacheItem(key, data), policy);        }        /// <summary>        /// Gets a value indicating whether the value associated with the specified key is cached        /// </summary>        /// <param name="key">key</param>        /// <returns>Result</returns>        public virtual bool IsSet(string key)        {            return (Cache.Contains(key));        }        /// <summary>        /// Removes the value with the specified key from the cache        /// </summary>        /// <param name="key">/key</param>        public virtual void Remove(string key)        {            Cache.Remove(key);        }        /// <summary>        /// Removes items by pattern        /// </summary>        /// <param name="pattern">pattern</param>        public virtual void RemoveByPattern(string pattern)        {            var regex = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);            var keysToRemove = new List<String>();            foreach (var item in Cache)                if (regex.IsMatch(item.Key))                    keysToRemove.Add(item.Key);            foreach (string key in keysToRemove)            {                Remove(key);            }        }        /// <summary>        /// Clear all cache data        /// </summary>        public virtual void Clear()        {            foreach (var item in Cache)                Remove(item.Key);        }    }}

摘自:NopCommerce框(http://nopcommerce.codeplex.com/) 

  相关解决方案