• 【无私分享:ASP.NET CORE 项目实战(第十一章)】Asp.net Core 缓存 MemoryCache 和 Redis


    目录索引 

    【无私分享:ASP.NET CORE 项目实战】目录索引

     

    简介

      

      经过 N 久反复的尝试,翻阅了网上无数的资料,GitHub上下载了十几个源码参考, Memory 和 Redis 终于写出一个 简陋 的 封装,为了统一和易用,我们两种缓存都统一实现了一个接口 ICacheService,微软也有很多是通过IDistributedCache,大家可以参考 https://docs.asp.net/en/latest/performance/caching/distributed.html ,GitHub上也有很多很好的封装,这里我们就不一一介绍了,大家自行参考,现在搞 Asp.net Core的还是不是很多,中文的资料也少的可怜,而且基本都是千篇一律照搬,对于只认识 ABCDEFG的我来说,过程是十分艰辛的,一篇文章往往要看四五遍,逐行逐句翻译,说多了都是泪,不说了,我们开始。期间,得到了很多朋友的帮助,在此表示感谢!

      

    缓存接口 ICacheService

       缓存也好,数据库也好,我们就是进行CRUD操作,接口没什么好解释的,注释我写的很明白,这里就列给大家:

      #  验证缓存项是否存在

    复制代码
     1         /// <summary>
     2         /// 验证缓存项是否存在
     3         /// </summary>
     4         /// <param name="key">缓存Key</param>
     5         /// <returns></returns>
     6         bool Exists(string key);
     7 
     8         /// <summary>
     9         /// 验证缓存项是否存在(异步方式)
    10         /// </summary>
    11         /// <param name="key">缓存Key</param>
    12         /// <returns></returns>
    13         Task<bool> ExistsAsync(string key);  
    复制代码

      # 添加缓存

    复制代码
     1  /// <summary>
     2         /// 添加缓存
     3         /// </summary>
     4         /// <param name="key">缓存Key</param>
     5         /// <param name="value">缓存Value</param>
     6         /// <returns></returns>
     7         bool Add(string key, object value);
     8 
     9         /// <summary>
    10         /// 添加缓存(异步方式)
    11         /// </summary>
    12         /// <param name="key">缓存Key</param>
    13         /// <param name="value">缓存Value</param>
    14         /// <returns></returns>
    15         Task<bool> AddAsync(string key, object value);
    16 
    17         /// <summary>
    18         /// 添加缓存
    19         /// </summary>
    20         /// <param name="key">缓存Key</param>
    21         /// <param name="value">缓存Value</param>
    22         /// <param name="expiresSliding">滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
    23         /// <param name="expiressAbsoulte">绝对过期时长</param>
    24         /// <returns></returns>
    25         bool Add(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte);
    26 
    27         /// <summary>
    28         /// 添加缓存(异步方式)
    29         /// </summary>
    30         /// <param name="key">缓存Key</param>
    31         /// <param name="value">缓存Value</param>
    32         /// <param name="expiresSliding">滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
    33         /// <param name="expiressAbsoulte">绝对过期时长</param>
    34         /// <returns></returns>
    35         Task<bool> AddAsync(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte);
    36 
    37         /// <summary>
    38         /// 添加缓存
    39         /// </summary>
    40         /// <param name="key">缓存Key</param>
    41         /// <param name="value">缓存Value</param>
    42         /// <param name="expiresIn">缓存时长</param>
    43         /// <param name="isSliding">是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
    44         /// <returns></returns>
    45         bool Add(string key, object value, TimeSpan expiresIn, bool isSliding = false);
    46 
    47         /// <summary>
    48         /// 添加缓存(异步方式)
    49         /// </summary>
    50         /// <param name="key">缓存Key</param>
    51         /// <param name="value">缓存Value</param>
    52         /// <param name="expiresIn">缓存时长</param>
    53         /// <param name="isSliding">是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
    54         /// <returns></returns>
    55         Task<bool> AddAsync(string key, object value, TimeSpan expiresIn, bool isSliding = false);
    复制代码

       # 删除缓存

    复制代码
     1  /// <summary>
     2         /// 删除缓存
     3         /// </summary>
     4         /// <param name="key">缓存Key</param>
     5         /// <returns></returns>
     6         bool Remove(string key);
     7 
     8         /// <summary>
     9         /// 删除缓存(异步方式)
    10         /// </summary>
    11         /// <param name="key">缓存Key</param>
    12         /// <returns></returns>
    13         Task<bool> RemoveAsync(string key);
    14 
    15         /// <summary>
    16         /// 批量删除缓存
    17         /// </summary>
    18         /// <param name="key">缓存Key集合</param>
    19         /// <returns></returns>
    20         void RemoveAll(IEnumerable<string> keys);
    21 
    22         /// <summary>
    23         /// 批量删除缓存(异步方式)
    24         /// </summary>
    25         /// <param name="key">缓存Key集合</param>
    26         /// <returns></returns>
    27         Task RemoveAllAsync(IEnumerable<string> keys);
    复制代码

         # 获取缓存

    复制代码
     1 /// <summary>
     2         /// 获取缓存
     3         /// </summary>
     4         /// <param name="key">缓存Key</param>
     5         /// <returns></returns>
     6         T Get<T>(string key) where T : class;
     7 
     8         /// <summary>
     9         /// 获取缓存(异步方式)
    10         /// </summary>
    11         /// <param name="key">缓存Key</param>
    12         /// <returns></returns>
    13         Task<T> GetAsync<T>(string key) where T : class;
    14 
    15         /// <summary>
    16         /// 获取缓存
    17         /// </summary>
    18         /// <param name="key">缓存Key</param>
    19         /// <returns></returns>
    20         object Get(string key);
    21 
    22         /// <summary>
    23         /// 获取缓存(异步方式)
    24         /// </summary>
    25         /// <param name="key">缓存Key</param>
    26         /// <returns></returns>
    27         Task<object> GetAsync(string key);
    28 
    29         /// <summary>
    30         /// 获取缓存集合
    31         /// </summary>
    32         /// <param name="keys">缓存Key集合</param>
    33         /// <returns></returns>
    34         IDictionary<string, object> GetAll(IEnumerable<string> keys);
    35 
    36         /// <summary>
    37         /// 获取缓存集合(异步方式)
    38         /// </summary>
    39         /// <param name="keys">缓存Key集合</param>
    40         /// <returns></returns>
    41         Task<IDictionary<string, object>> GetAllAsync(IEnumerable<string> keys);
    复制代码

      # 修改缓存 

    复制代码
     1 /// <summary>
     2         /// 修改缓存
     3         /// </summary>
     4         /// <param name="key">缓存Key</param>
     5         /// <param name="value">新的缓存Value</param>
     6         /// <returns></returns>
     7         bool Replace(string key, object value);
     8 
     9         /// <summary>
    10         /// 修改缓存(异步方式)
    11         /// </summary>
    12         /// <param name="key">缓存Key</param>
    13         /// <param name="value">新的缓存Value</param>
    14         /// <returns></returns>
    15         Task<bool> ReplaceAsync(string key, object value);
    16 
    17         /// <summary>
    18         /// 修改缓存
    19         /// </summary>
    20         /// <param name="key">缓存Key</param>
    21         /// <param name="value">新的缓存Value</param>
    22         /// <param name="expiresSliding">滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
    23         /// <param name="expiressAbsoulte">绝对过期时长</param>
    24         /// <returns></returns>
    25         bool Replace(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte);
    26 
    27         /// <summary>
    28         /// 修改缓存(异步方式)
    29         /// </summary>
    30         /// <param name="key">缓存Key</param>
    31         /// <param name="value">新的缓存Value</param>
    32         /// <param name="expiresSliding">滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
    33         /// <param name="expiressAbsoulte">绝对过期时长</param>
    34         /// <returns></returns>
    35         Task<bool> ReplaceAsync(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte);
    36 
    37         /// <summary>
    38         /// 修改缓存
    39         /// </summary>
    40         /// <param name="key">缓存Key</param>
    41         /// <param name="value">新的缓存Value</param>
    42         /// <param name="expiresIn">缓存时长</param>
    43         /// <param name="isSliding">是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
    44         /// <returns></returns>
    45         bool Replace(string key, object value, TimeSpan expiresIn, bool isSliding = false);
    46 
    47         /// <summary>
    48         /// 修改缓存(异步方式)
    49         /// </summary>
    50         /// <param name="key">缓存Key</param>
    51         /// <param name="value">新的缓存Value</param>
    52         /// <param name="expiresIn">缓存时长</param>
    53         /// <param name="isSliding">是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
    54         /// <returns></returns>
    55         Task<bool> ReplaceAsync(string key, object value, TimeSpan expiresIn, bool isSliding = false);
    复制代码

    缓存实现类 MemoryCache

      MemoryCache 这个比较简单,有微软比较完善的文档和一些比较好的文章,这个大家都用好久了。

      我们新建一个缓存实现类 MemoryCacheService 实现接口 ICacheService

      public class MemoryCacheService :ICacheService { }

      通过构造器注入 IMemoryCache:

      protected IMemoryCache _cache;

      public MemoryCacheService(IMemoryCache cache)
      {
        _cache = cache;
      }

      

      实现接口的方法,我们的方法都带有 异步 和 同步 两种,我们节约篇章和时间,异步的就不大家写了,大家自己添加一下就好。

      #  验证缓存项是否存在

      在MemoryCache中,我们是通过 TryGetValue 来检测 Key是否存在的

      

    复制代码
     1 /// <summary>
     2         /// 验证缓存项是否存在
     3         /// </summary>
     4         /// <param name="key">缓存Key</param>
     5         /// <returns></returns>
     6         public bool Exists(string key)
     7         {
     8             if (key == null)
     9             {
    10                 throw new ArgumentNullException(nameof(key));
    11             }
    12             object cached;
    13             return _cache.TryGetValue(key,out cached);
    14         }
    复制代码

      # 添加缓存

      三个添加方法 :

      

    复制代码
     1 /// <summary>
     2         /// 添加缓存
     3         /// </summary>
     4         /// <param name="key">缓存Key</param>
     5         /// <param name="value">缓存Value</param>
     6         /// <returns></returns>
     7         public bool Add(string key, object value)
     8         {
     9             if (key == null)
    10             {
    11                 throw new ArgumentNullException(nameof(key));
    12             }
    13             if (value == null)
    14             {
    15                 throw new ArgumentNullException(nameof(value));
    16             }
    17             _cache.Set(key, value);
    18             return Exists(key);
    19         }
    20 /// <summary>
    21         /// 添加缓存
    22         /// </summary>
    23         /// <param name="key">缓存Key</param>
    24         /// <param name="value">缓存Value</param>
    25         /// <param name="expiresSliding">滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
    26         /// <param name="expiressAbsoulte">绝对过期时长</param>
    27         /// <returns></returns>
    28         public bool Add(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
    29         {
    30             if (key == null)
    31             {
    32                 throw new ArgumentNullException(nameof(key));
    33             }
    34             if (value == null)
    35             {
    36                 throw new ArgumentNullException(nameof(value));
    37             }
    38             _cache.Set(key, value,
    39                     new MemoryCacheEntryOptions()
    40                     .SetSlidingExpiration(expiresSliding)
    41                     .SetAbsoluteExpiration(expiressAbsoulte)
    42                     );
    43 
    44             return Exists(key);
    45         }
    46  /// <summary>
    47         /// 添加缓存
    48         /// </summary>
    49         /// <param name="key">缓存Key</param>
    50         /// <param name="value">缓存Value</param>
    51         /// <param name="expiresIn">缓存时长</param>
    52         /// <param name="isSliding">是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
    53         /// <returns></returns>
    54         public bool Add(string key, object value, TimeSpan expiresIn,bool isSliding = false)
    55         {
    56             if (key == null)
    57             {
    58                 throw new ArgumentNullException(nameof(key));
    59             }
    60             if (value == null)
    61             {
    62                 throw new ArgumentNullException(nameof(value));
    63             }
    64             if (isSliding)
    65             _cache.Set(key, value,
    66                 new MemoryCacheEntryOptions()
    67                 .SetSlidingExpiration(expiresIn)
    68                 );
    69             else
    70                 _cache.Set(key, value,
    71                 new MemoryCacheEntryOptions()
    72                 .SetAbsoluteExpiration(expiresIn)
    73                 );
    74 
    75             return Exists(key);
    76         }
    复制代码

      # 删除缓存

      单个删除 和 批量删除

    复制代码
     1 /// <summary>
     2         /// 删除缓存
     3         /// </summary>
     4         /// <param name="key">缓存Key</param>
     5         /// <returns></returns>
     6         public bool Remove(string key)
     7         {
     8             if (key == null)
     9             {
    10                 throw new ArgumentNullException(nameof(key));
    11             }
    12             _cache.Remove(key);
    13 
    14             return !Exists(key);
    15         }
    16 /// <summary>
    17         /// 批量删除缓存
    18         /// </summary>
    19         /// <param name="key">缓存Key集合</param>
    20         /// <returns></returns>
    21         public void RemoveAll(IEnumerable<string> keys)
    22         {
    23             if (keys == null)
    24             {
    25                 throw new ArgumentNullException(nameof(keys));
    26             }
    27 
    28             keys.ToList().ForEach(item => _cache.Remove(item));
    29         }
    复制代码

      # 获取缓存

    复制代码
     1 /// <summary>
     2         /// 获取缓存
     3         /// </summary>
     4         /// <param name="key">缓存Key</param>
     5         /// <returns></returns>
     6         public T Get<T>(string key) where T : class
     7         {
     8             if (key == null)
     9             {
    10                 throw new ArgumentNullException(nameof(key));
    11             }
    12             return _cache.Get(key) as T;
    13         }
    14 /// <summary>
    15         /// 获取缓存
    16         /// </summary>
    17         /// <param name="key">缓存Key</param>
    18         /// <returns></returns>
    19         public object Get(string key)
    20         {
    21             if (key == null)
    22             {
    23                 throw new ArgumentNullException(nameof(key));
    24             }
    25             return _cache.Get(key);
    26         }
    27 /// <summary>
    28         /// 获取缓存集合
    29         /// </summary>
    30         /// <param name="keys">缓存Key集合</param>
    31         /// <returns></returns>
    32         public IDictionary<string, object> GetAll(IEnumerable<string> keys)
    33         {
    34             if (keys == null)
    35             {
    36                 throw new ArgumentNullException(nameof(keys));
    37             }
    38 
    39             var dict = new Dictionary<string, object>();
    40 
    41             keys.ToList().ForEach(item => dict.Add(item, _cache.Get(item)));
    42 
    43             return dict;
    44         }
    复制代码

      # 修改缓存

    复制代码
     1  /// <summary>
     2         /// 修改缓存
     3         /// </summary>
     4         /// <param name="key">缓存Key</param>
     5         /// <param name="value">新的缓存Value</param>
     6         /// <returns></returns>
     7         public bool Replace(string key, object value)
     8         {
     9             if (key == null)
    10             {
    11                 throw new ArgumentNullException(nameof(key));
    12             }
    13             if (value == null)
    14             {
    15                 throw new ArgumentNullException(nameof(value));
    16             }
    17             if (Exists(key))
    18                 if (!Remove(key)) return false;
    19 
    20             return Add(key, value);
    21 
    22         }
    23 /// <summary>
    24         /// 修改缓存
    25         /// </summary>
    26         /// <param name="key">缓存Key</param>
    27         /// <param name="value">新的缓存Value</param>
    28         /// <param name="expiresSliding">滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
    29         /// <param name="expiressAbsoulte">绝对过期时长</param>
    30         /// <returns></returns>
    31         public bool Replace(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
    32         {
    33             if (key == null)
    34             {
    35                 throw new ArgumentNullException(nameof(key));
    36             }
    37             if (value == null)
    38             {
    39                 throw new ArgumentNullException(nameof(value));
    40             }
    41             if (Exists(key))
    42                 if (!Remove(key)) return false;
    43 
    44             return Add(key, value, expiresSliding, expiressAbsoulte);
    45         }
    46 /// <summary>
    47         /// 修改缓存
    48         /// </summary>
    49         /// <param name="key">缓存Key</param>
    50         /// <param name="value">新的缓存Value</param>
    51         /// <param name="expiresIn">缓存时长</param>
    52         /// <param name="isSliding">是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
    53         /// <returns></returns>
    54         public bool Replace(string key, object value, TimeSpan expiresIn, bool isSliding = false)
    55         {
    56             if (key == null)
    57             {
    58                 throw new ArgumentNullException(nameof(key));
    59             }
    60             if (value == null)
    61             {
    62                 throw new ArgumentNullException(nameof(value));
    63             }
    64             if (Exists(key))
    65                 if (!Remove(key)) return false;
    66 
    67             return Add(key, value, expiresIn, isSliding);
    68         }
    复制代码

      最后 释放:

      public void Dispose()
      {
        if (_cache != null)
          _cache.Dispose();
        GC.SuppressFinalize(this);
      }

    缓存实现类 Redis

      Redis一般都是运行的Liunx的,我们在 【(第十章)】发布项目到 Linux 上运行 Core 项目 中介绍了,如何在Linux上开发运行Core项目,当然,我相信,很多朋友还是在 Windows 上做开发、测试的,这里给大家一个windows 上的Redis和管理软件,如果没有或者不知道怎么找的朋友可以下载下来,在windows上测试 Redis :连接可能失效  百度网盘 提取码:uglb    百度网盘 提取码:gl0e

      安装第一个后,启动Redis服务就行了,管理软件的界面也很简洁

      

      

      我们先来看我们的 RedisCacheService:

      为了统一管理和切换使用,我们的 RedisCacheService 同样实现接口 ICacheService

      public class RedisCacheService : ICacheService { }

      同样,我们通过构造器注入:

      

      protected IDatabase _cache;

      private ConnectionMultiplexer _connection;

      private readonly string _instance;


      public RedisCacheService(RedisCacheOptions options, int database = 0)
      {
        _connection = ConnectionMultiplexer.Connect(options.Configuration);
        _cache = _connection.GetDatabase(database);
        _instance = options.InstanceName;
      }

      

      说明一下:我们需要添加一个Redis包:Microsoft.Extensions.Caching.Redis,这是官方的,但是不知道是我程序的原因还是什么原因,总是还原失败,命令强行还原包也不行,所以 我用的是移植的包: Microsoft.Extensions.Caching.Redis.Core,如果你们可以,最好还是用官方的包。

      这里我们写了个方法,来组合Key值和实例名,就是Key值转为 实例名+Key   

      public string GetKeyForRedis(string key)
      {
        return _instance + key;
      }

      # 验证缓存项是否存在

    复制代码
     1 /// <summary>
     2         /// 验证缓存项是否存在
     3         /// </summary>
     4         /// <param name="key">缓存Key</param>
     5         /// <returns></returns>
     6         public bool Exists(string key)
     7         {
     8             if (key == null)
     9             {
    10                 throw new ArgumentNullException(nameof(key));
    11             }
    12             return _cache.KeyExists(GetKeyForRedis(key));
    13         }
    复制代码

      # 添加缓存

      注意:我翻阅了很多资料,没有找到Redis支持滑动和绝对过期,但是都是继承的统一接口,所以这里添加方法 滑动过期时没有用的。

    复制代码
     1 /// <summary>
     2         /// 添加缓存
     3         /// </summary>
     4         /// <param name="key">缓存Key</param>
     5         /// <param name="value">缓存Value</param>
     6         /// <returns></returns>
     7         public bool Add(string key, object value)
     8         {
     9             if (key == null)
    10             {
    11                 throw new ArgumentNullException(nameof(key));
    12             }
    13            return _cache.StringSet(GetKeyForRedis(key), Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)));
    14         }
    15 /// <summary>
    16         /// 添加缓存
    17         /// </summary>
    18         /// <param name="key">缓存Key</param>
    19         /// <param name="value">缓存Value</param>
    20         /// <param name="expiresSliding">滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间,Redis中无效)</param>
    21         /// <param name="expiressAbsoulte">绝对过期时长</param>
    22         /// <returns></returns>
    23         public bool Add(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
    24         {
    25             if (key == null)
    26             {
    27                 throw new ArgumentNullException(nameof(key));
    28             }
    29             return  _cache.StringSet(GetKeyForRedis(key), Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)),expiressAbsoulte);
    30         }
    31 /// <summary>
    32         /// 添加缓存
    33         /// </summary>
    34         /// <param name="key">缓存Key</param>
    35         /// <param name="value">缓存Value</param>
    36         /// <param name="expiresIn">缓存时长</param>
    37         /// <param name="isSliding">是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间,Redis中无效)</param>
    38         /// <returns></returns>
    39         public bool Add(string key, object value, TimeSpan expiresIn, bool isSliding = false)
    40         {
    41             if (key == null)
    42             {
    43                 throw new ArgumentNullException(nameof(key));
    44             }
    45 
    46 
    47             return _cache.StringSet(GetKeyForRedis(key), Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)), expiresIn);
    48         }
    复制代码

      # 删除缓存

    复制代码
     1 /// <summary>
     2         /// 删除缓存
     3         /// </summary>
     4         /// <param name="key">缓存Key</param>
     5         /// <returns></returns>
     6         public bool Remove(string key)
     7         {
     8             if (key == null)
     9             {
    10                 throw new ArgumentNullException(nameof(key));
    11             }
    12             return _cache.KeyDelete(GetKeyForRedis(key));
    13         }
    14 /// <summary>
    15         /// 批量删除缓存
    16         /// </summary>
    17         /// <param name="key">缓存Key集合</param>
    18         /// <returns></returns>
    19         public void RemoveAll(IEnumerable<string> keys)
    20         {
    21             if (keys == null)
    22             {
    23                 throw new ArgumentNullException(nameof(keys));
    24             }
    25 
    26             keys.ToList().ForEach(item => Remove(GetKeyForRedis(item)));
    27         }
    复制代码

      # 获取缓存

    复制代码
     1 /// <summary>
     2         /// 获取缓存
     3         /// </summary>
     4         /// <param name="key">缓存Key</param>
     5         /// <returns></returns>
     6         public T Get<T>(string key) where T : class
     7         {
     8             if (key == null)
     9             {
    10                 throw new ArgumentNullException(nameof(key));
    11             }
    12 
    13             var value = _cache.StringGet(GetKeyForRedis(key));
    14 
    15             if (!value.HasValue)
    16             {
    17                 return default(T);
    18             }
    19 
    20             return JsonConvert.DeserializeObject<T>(value);
    21         }
    22 /// <summary>
    23         /// 获取缓存
    24         /// </summary>
    25         /// <param name="key">缓存Key</param>
    26         /// <returns></returns>
    27         public object Get(string key)
    28         {
    29             if (key == null)
    30             {
    31                 throw new ArgumentNullException(nameof(key));
    32             }
    33 
    34             var value = _cache.StringGet(GetKeyForRedis(key));
    35 
    36             if(!value.HasValue)
    37             {
    38                 return null;
    39             }
    40 /// <summary>
    41         /// 获取缓存集合
    42         /// </summary>
    43         /// <param name="keys">缓存Key集合</param>
    44         /// <returns></returns>
    45         public IDictionary<string, object> GetAll(IEnumerable<string> keys)
    46         {
    47             if (keys == null)
    48             {
    49                 throw new ArgumentNullException(nameof(keys));
    50             }
    51             var dict = new Dictionary<string, object>();
    52 
    53             keys.ToList().ForEach(item => dict.Add(item, Get(GetKeyForRedis(item))));
    54 
    55             return dict;
    56         }
    57 
    58             return JsonConvert.DeserializeObject(value);
    59         }
    复制代码

      # 修改缓存

    复制代码
     1 /// <summary>
     2         /// 修改缓存
     3         /// </summary>
     4         /// <param name="key">缓存Key</param>
     5         /// <param name="value">新的缓存Value</param>
     6         /// <returns></returns>
     7         public bool Replace(string key, object value)
     8         {
     9             if (key == null)
    10             {
    11                 throw new ArgumentNullException(nameof(key));
    12             }
    13 
    14             if(Exists(key))
    15                 if (!Remove(key))
    16                     return false;
    17 
    18             return Add(key, value);
    19 
    20         }
    21 /// <summary>
    22         /// 修改缓存
    23         /// </summary>
    24         /// <param name="key">缓存Key</param>
    25         /// <param name="value">新的缓存Value</param>
    26         /// <param name="expiresSliding">滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
    27         /// <param name="expiressAbsoulte">绝对过期时长</param>
    28         /// <returns></returns>
    29         public bool Replace(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
    30         {
    31             if (key == null)
    32             {
    33                 throw new ArgumentNullException(nameof(key));
    34             }
    35 
    36             if (Exists(key))
    37                 if (!Remove(key))
    38                     return false;
    39 
    40             return Add(key, value, expiresSliding, expiressAbsoulte);
    41         }
    42 /// <summary>
    43         /// 修改缓存
    44         /// </summary>
    45         /// <param name="key">缓存Key</param>
    46         /// <param name="value">新的缓存Value</param>
    47         /// <param name="expiresIn">缓存时长</param>
    48         /// <param name="isSliding">是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
    49         /// <returns></returns>
    50         public bool Replace(string key, object value, TimeSpan expiresIn, bool isSliding = false)
    51         {
    52             if (key == null)
    53             {
    54                 throw new ArgumentNullException(nameof(key));
    55             }
    56 
    57             if (Exists(key))
    58                 if (!Remove(key)) return false;
    59 
    60             return Add(key, value, expiresIn, isSliding);
    61         }
    复制代码

      同样,释放:

      public void Dispose()
      {
        if (_connection != null)
          _connection.Dispose();
        GC.SuppressFinalize(this);
      }

    Startup.cs 和 缓存配置

      我们在 【(第八章)】读取配置文件(二) 读取自定义配置文件 中讲到了如何读取自定义配置文件,同样,我们把缓存的配置 也放在 我们的自定义配置文件siteconfig.json中:

      

      

      我们写一个类,来获取配置几个配置:

      CacheProvider: _isUseRedis        --- 是否使用Redis

              _connectionString   --- Redis连接       

              _instanceName     ---Redis实例名称   

      在 Startup.cs 的 ConfigureServices(IServiceCollection services) 中:

      首先添加:services.AddMemoryCache();

      判断是否使用Redis,如果不使用 Redis就默认使用 MemoryCache:  

      if (_cacheProvider._isUseRedis)
      {
        //Use Redis
        services.AddSingleton(typeof(ICacheService), new RedisCacheService(new RedisCacheOptions
        {
          Configuration = _cacheProvider._connectionString,
          InstanceName = _cacheProvider._instanceName
        },0));
      }
      else
      {
        //Use MemoryCache
        services.AddSingleton<IMemoryCache>(factory =>
        {
          var cache = new MemoryCache(new MemoryCacheOptions());
          return cache;
          });
        services.AddSingleton<ICacheService, MemoryCacheService>();
      }

      

      OK,完成了,因为也是研究Core不到一个月,所以这里面肯定会有些地方写的不好,希望大家指出来,如果有更高的方案或者方法,也麻烦告知一声,在此表示感谢!

    希望跟大家一起学习Asp.net Core 

    刚开始接触,水平有限,很多东西都是自己的理解和翻阅网上大神的资料,如果有不对的地方和不理解的地方,希望大家指正!

    虽然Asp.net Core 现在很火热,但是网上的很多资料都是前篇一律的复制,所以有很多问题我也暂时没有解决,希望大家能共同帮助一下!

    原创文章 转载请尊重劳动成果 http://yuangang.cnblogs.com

  • 相关阅读:
    HTML超链接标签—链接QQ在线聊天
    超链接标签-QQ邮箱链接经验分享
    数据类型转换的事项和注释
    关键字、标识符、常量、变量的(定义)
    WendosiDOS命令的一些使用命令
    Map集合
    Set集合 HashSet集合 LInkHathSet集合
    增强for循环
    22_迭代器
    包装类
  • 原文地址:https://www.cnblogs.com/syg1/p/5801832.html
Copyright © 2020-2023  润新知