在很多项目中, 需要用到缓存,借鉴网上前辈们的一些经验,自己再进行总结简化了一些, 做出如下的缓存操作,其中包含内存缓存(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); } }
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; } }
四. 在 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 .
调用如下:
五.总结
总算是写了一篇让自己看得懂一些的文章了. 行吧...算是一个小进步吧!