• cache in c#


    //接口
        public interface ICacheManager:IDisposable
        {
            /// <summary>
            /// 根据键获取值
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <returns></returns>
            T Get<T>(string key);
    
            /// <summary>
            /// 添加一个键值对缓存
            /// </summary>
            /// <param name="key"></param>
            /// <param name="data"></param>
            /// <param name="cacheTime"></param>
            void Set(string key, object data, int cacheTime);
    
            /// <summary>
            /// 获取键对应的值是否存在
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            bool IsSet(string key);
    
            /// <summary>
            /// 移除键值对缓存
            /// </summary>
            /// <param name="key"></param>
            void Remove(string key);
    
            void RemoveByPattern(string pattern);
    
            /// <summary>
            /// 清空所有的缓存数据
            /// </summary>
            void Clear();
        }
    View Code
    //扩展
        public static  class CacheExtensions
        {
            public static T Get<T>(this ICacheManager cacheManager, string key, Func<T> acquire)
            {
                return Get(cacheManager, key, 60, acquire);
            }
    
            public static T Get<T>(this ICacheManager cacheManager, string key, int cacheTime, Func<T> acquire)
            {
                if (cacheManager.IsSet(key))
                {
                    return cacheManager.Get<T>(key);
                }
                var result = acquire();
                if(cacheTime>0)
                    cacheManager.Set(key,result,cacheTime);
                return result;
            }
    
            /// <summary>
            /// 批量移除
            /// </summary>
            /// <param name="cacheManager">Cache manager</param>
            /// <param name="pattern">Pattern</param>
            /// <param name="keys">All keys in the cache</param>
            public static void RemoveByPattern(this ICacheManager cacheManager, string pattern, IEnumerable<string> keys)
            {
                var regex = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
                foreach (var key in keys.Where(p => regex.IsMatch(p.ToString())).ToList())
                    cacheManager.Remove(key);
            }
        }
    View Code
    //实现
        public partial  class MemoryCacheManager:ICacheManager
        {
            protected ObjectCache Cache
            {
                get { return MemoryCache.Default; }
            }
    
            #region Method
    
            public virtual T Get<T>(string key)
            {
                return (T) Cache[key];
            }
    
            public virtual void Set(string key, object data, int cacheTime)
            {
                if(data==null)
                    return;
                var policy = new CacheItemPolicy {AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime)};
                Cache.Add(new CacheItem(key, data), policy);
            }
    
            public virtual bool IsSet(string key)
            {
                return Cache.Contains(key);
            }
    
            public virtual void Remove(string key)
            {
                Cache.Remove(key);
            }
    
            public virtual void RemoveByPattern(string pattern)
            {
                this.RemoveByPattern(pattern,Cache.Select(p=>p.Key));
            }
    
            public void Clear()
            {
                foreach (var item in Cache)
                    Remove(item.Key);
            }
            #endregion
    
            public void Dispose()
            {
                throw new NotImplementedException();
            }
    
    
        }
    View Code

    //注入

    builder.RegisterType<MemoryCacheManager>()
    .As<ICacheManager>()
    .Named<ICacheManager>("cala_cache_static")
    .SingleInstance();

         //设置key
    private const string Calabash_All_key = "cala.calabash.all"; public IList<Core.Domain.Calabash> GetAll() { //cache var key = string.Format(Calabash_All_key); return _cacheManager.Get(key, () => { var query = _calabashRepository.Table.ToList(); return query; }); }

    //上一篇redis使用和cache是一样的 因为都实现了 icachemanager接口

  • 相关阅读:
    023-Spring Boot 服务的注册和发现
    022-Spring Boot 构建微服务实战
    021-Spring Boot 测试,Junit方式使用,mock方式,Controller测试
    020-Spring Boot 监控和度量
    003-Spring 中的StreamUtils
    004-微信证书问题
    019-Spring Boot 日志
    018-Spring Boot Starter开发
    017-Spring Boot AOP
    016-Spring Boot JDBC
  • 原文地址:https://www.cnblogs.com/sunzgod/p/6438544.html
Copyright © 2020-2023  润新知