博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Net core 关于缓存的实现
阅读量:4971 次
发布时间:2019-06-12

本文共 4694 字,大约阅读时间需要 15 分钟。

在很多项目中, 需要用到缓存,借鉴网上前辈们的一些经验,自己再进行总结简化了一些, 做出如下的缓存操作,其中包含内存缓存(IMemoryCache) 和 Redis 缓存;

一.前提内容, 导入两个包:  Microsoft.Extensions.Caching.Memory   和 Microsoft.Extensions.Caching.Redis ,并在使用的类中using 一下它们.  我这里是用2.1.0版本的; 

二. 创建 ICacheService 公共接口 ,我这里写的比较简单, 如若业务需要可自行增加 异步和批量的接口方法.

1 ///  2     /// 缓存接口 3     /// 分别内存缓存和Redis缓存(2.1.0版本) 4     ///  5     public interface ICacheService 6     {  7         ///  8         ///  新增 9         /// 10         /// 11         /// 12         /// 13         /// 
14 bool Add(string key, object value, int ExpirtionTime = 20);15 16 17 /// 18 /// 获取19 /// 20 /// 21 ///
22 string GetValue(string key);23 /// 24 /// 验证缓存项是否存在25 /// 26 /// 缓存Key27 ///
28 bool Exists(string key);29 30 /// 31 /// 移除32 /// 33 /// 34 ///
35 bool Remove(string key);36 }

三. 再分别创建 MemoryCacheService 和RedisCacheService  类, 并继承 ICacheService 接口.

a.  MemoryCacheService  类  , 记得using 一下 Microsoft.Extensions.Caching.Memory

///     /// 缓存接口实现    ///     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.Redis

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.  这里啰嗦多几句, 因为同一个接口注入了多个实现,  那到调用的时候, 容器是怎么知道调用哪个类呢?   我这里是参考了  

  ,  

services.AddTransient
(); //内存缓存认证注入 //注入Redis services.AddSingleton(new RedisCacheService(new RedisCacheOptions() { InstanceName = Configuration.GetSection("Redis:InstanceName").Value, Configuration= Configuration.GetSection("Redis:Connection").Value }));

并在appsettings.json配置redis , 

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

服务调用我使用了IServiceProvider  .

调用如下: 

 

 五.总结   

总算是写了一篇让自己看得懂一些的文章了.   行吧...算是一个小进步吧!

 

转载于:https://www.cnblogs.com/mylinx/p/10443494.html

你可能感兴趣的文章
Binary compatibility 二进制兼容
查看>>
SQL-删除重复数据
查看>>
8.8.3 抽象类
查看>>
IOS网络请求框架AFNetworking和ASIHttpRequest对比
查看>>
中国顶级黑客,马云天价请不动
查看>>
2019 Multi-University Training Contest 4
查看>>
修改AD FS
查看>>
C函数篇(strcat函数)
查看>>
洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX
查看>>
苹果的AR赌注仍然有很多需要证明的
查看>>
spring mvc 的配置 及interceptor filter listener servlet 配置
查看>>
C# Path 有关于文件路径等问题类(转)
查看>>
虚拟机安装禅道
查看>>
Python 常用函数
查看>>
WebApi简单使用
查看>>
Spring Boot的配置文件
查看>>
计算可迭代对象的shape 老是忘~方便记法
查看>>
PHP学习笔记四【类型运算】
查看>>
vdbench-自动化测试脚本
查看>>
rpmdb: unable to join the environment的解决办法
查看>>