Net core 關於緩存的實現

在不少項目中, 須要用到緩存,借鑑網上前輩們的一些經驗,本身再進行總結簡化了一些, 作出以下的緩存操做,其中包含內存緩存(IMemoryCache) 和 Redis 緩存;redis

一.前提內容, 導入兩個包:  Microsoft.Extensions.Caching.Memory   和 Microsoft.Extensions.Caching.Redis ,並在使用的類中using 一下它們.  我這裏是用2.1.0版本的; json

二. 建立 ICacheService 公共接口 ,我這裏寫的比較簡單, 如若業務須要可自行增長 異步和批量的接口方法.緩存

 1 /// <summary>
 2     /// 緩存接口
 3     /// 分別內存緩存和Redis緩存(2.1.0版本)
 4     /// </summary>
 5     public interface ICacheService
 6     { 
 7         /// <summary>
 8         ///  新增
 9         /// </summary>
10         /// <param name="key"></param>
11         /// <param name="value"></param>
12         /// <param name="ExpirtionTime"></param>
13         /// <returns></returns>
14         bool Add(string key, object value, int ExpirtionTime = 20);
15 
16 
17         /// <summary>
18         /// 獲取
19         /// </summary>
20         /// <param name="key"></param>
21         /// <returns></returns>
22         string GetValue(string key);
23         /// <summary>
24         /// 驗證緩存項是否存在
25         /// </summary>
26         /// <param name="key">緩存Key</param>
27         /// <returns></returns>
28         bool Exists(string key);
29 
30         /// <summary>
31         /// 移除
32         /// </summary>
33         /// <param name="key"></param>
34         /// <returns></returns>
35         bool Remove(string key);
36     }

三. 再分別建立 MemoryCacheService 和RedisCacheService  類, 並繼承 ICacheService 接口.app

a.  MemoryCacheService  類  , 記得using 一下 Microsoft.Extensions.Caching.Memory異步

 /// <summary>
    /// 緩存接口實現
    /// </summary>
    public class MemoryCacheService : ICacheService
    {
        protected IMemoryCache _cache;

        public MemoryCacheService(IMemoryCache cache)
        {
            _cache = cache;
        }
         
        public bool Add(string key, object value, int ExpirtionTime = 20)
        {
            if (!string.IsNullOrEmpty(key))
            {
                _cache.Set(key, value , DateTimeOffset.Now.AddMinutes(ExpirtionTime));
            }
            return true;
        }

        public bool Remove(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                return false;
            }
            if (Exists(key))
            {
                _cache.Remove(key);
                return true;
            }
            return false;
        }
         
        public string GetValue(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                return null;
            }
            if (Exists(key))
            {
                return _cache.Get(key).ToString();
            }
            return null;
        }
         
        public bool Exists(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                return false;
            }

            object cache;
            return _cache.TryGetValue(key, out cache);
        }
         
    }
View Code

b. RedisCacheService 類  , 記得using 一下 Microsoft.Extensions.Caching.Rediside

public  class RedisCacheService:ICacheService
    {
        protected RedisCache _redisCache = null;

        public RedisCacheService(RedisCacheOptions options)
        {
            _redisCache = new RedisCache(options);
        }
         

         
        public bool Add(string key, object value,int ExpirtionTime=20)
        {
            if (!string.IsNullOrEmpty(key))
            {
                _redisCache.Set(key, Encoding.UTF8.GetBytes(value.ToString()), new DistributedCacheEntryOptions()
                {
                    AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(ExpirtionTime)
                });
            }
            return true; 
        }

        public bool Remove(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                return false;
            }

            if (Exists(key))
            {
                _redisCache.Remove(key);
                return true;
            } 
            return false;
        }


        public string GetValue(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                return null;
            }
            if (Exists(key))
            {
                return _redisCache.GetString(key);
            }
            return null;
        }


        public bool Exists(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                return false;
            }
          return  !string.IsNullOrEmpty(_redisCache.GetString(key)) ? true :false;
        }
        
    }
View Code

四.  在 Startup.cs  文件中注入 Redis 和Memory.  這裏囉嗦多幾句, 由於同一個接口注入了多個實現,  那到調用的時候, 容器是怎麼知道調用哪一個類呢?   我這裏是參考了  spa

ASP.NET Core默認注入方式下如何注入多個實現(多種方式)  ,  .net

            services.AddTransient<MemoryCacheService>(); //內存緩存認證注入 
            //注入Redis
            services.AddSingleton(new RedisCacheService(new RedisCacheOptions()
            {
                InstanceName = Configuration.GetSection("Redis:InstanceName").Value,
                Configuration= Configuration.GetSection("Redis:Connection").Value
            }));

並在appsettings.json配置redis , code

 "Redis": {
    "Connection": "127.0.0.1:6379",
    "InstanceName": "Redis:"
  }

服務調用我使用了IServiceProvider  .blog

調用以下: 

 

 五.總結   

總算是寫了一篇讓本身看得懂一些的文章了.   行吧...算是一個小進步吧!

相關文章
相關標籤/搜索