.net core 实例教程(九)缓存配置、Redis配置及类库
本文源码下载地址:http://www.80cxy.com/Blog/ResourceView?arId=202403191532545995NAAqJh
系列教程地址:http://www.80cxy.com/Blog/ArticleView?arId=202403191517574161ay3s5V
本文讲解Redis缓存配置,及相关缓存操作类库,具体使用在后面的教程中随着模块的开发逐步进行讲解。
首先在SignUp.Common安装CSRedisCore包。
Install-Package CSRedisCore
新建RedisCacheService缓存操作类库,代码如下:
using Microsoft.Extensions.DependencyModel; namespace Common.CacheManager { public interface ICacheService : IDisposable { #region 基本操作 /// <summary> /// 获取缓存 /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> string Get(string key); /// <summary> /// 删除缓存 /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> bool Remove(string key); /// <summary> /// 批量删除缓存 /// </summary> /// <param name="key">缓存Key集合</param> /// <returns></returns> void RemoveAll(IEnumerable<string> keys); /// <summary> /// 验证缓存项是否存在 /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> bool Exists(string key); /// <summary> /// 设置过期时间 /// </summary> /// <param name="key">缓存Key</param> /// <param name="expireSeconds">过期时间,单位:秒</param> /// <returns></returns> bool Expire(string key, int expireSeconds = -1); #endregion #region String类型缓存 /// <summary> /// 添加String缓存 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存Value</param> /// <param name="expireSeconds">缓存时长</param> /// <returns></returns> bool Add(string key, string value, int expireSeconds = -1); /// <summary> /// 添加String缓存,前提是这个key不存在,否则不执行。 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存Value</param> /// <returns></returns> bool AddNx(string key, string value); /// <summary> /// 添加String缓存,前提是这个key不存在,否则不执行。 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存Value</param> /// <param name="expireSeconds">缓存时长</param> /// <returns></returns> bool AddNxExpire(string key, string value, int expireSeconds = -1); /// <summary> /// 添加String缓存(对象自动转换Json格式存入) /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存对象</param> /// <param name="expiresIn">缓存时长</param> /// <returns></returns> bool AddObject(string key, object value, int expireSeconds = -1); /// <summary> /// 获取缓存(Redis存储Json格式) /// </summary> /// <param name="key">缓存Key</param> /// <returns>对象</returns> T GetObject<T>(string key) where T : class; #endregion #region Hash类型缓存 /// <summary> /// 添加Hash缓存 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存Value</param> /// <param name="expiresIn">缓存时长</param> /// <returns></returns> void AddHash(string key, Dictionary<string, string> value); /// <summary> /// 添加Hash缓存 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key">缓存Key</param> /// <param name="t">缓存对象</param> void AddHash<T>(string key, T t); /// <summary> /// 获取Hash缓存 /// </summary> /// <param name="key">缓存Key</param> /// <returns>对象</returns> T GetHash<T>(string key) where T : class; #endregion #region List类型缓存 /// <summary> /// List写入head /// </summary> /// <param name="key">缓存Key</param> /// <param name="val">缓存Value</param> void LPush(string key, string val); /// <summary> /// List写入尾部 /// </summary> /// <param name="key">缓存Key</param> /// <param name="val">缓存Value</param> void RPush(string key, string val); /// <summary> /// List出队 lpop /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> object ListDequeue(string key); /// <summary> /// List出队 lpop /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> T ListDequeue<T>(string key) where T : class; /// <summary> /// 移除list中的数据,keepIndex为保留的位置到最后一个元素如list 元素为1.2.3.....100 /// 需要移除前3个数,keepindex应该为4 /// </summary> /// <param name="key">缓存Key</param> /// <param name="keepIndex"></param> void ListRemove(string key, int keepIndex); #endregion #region lua脚本 /// <summary> /// 执行lua脚本 /// </summary> /// <param name="script">脚本</param> /// <param name="key">KEYS[1]</param> /// <param name="args">ARGV[1]</param> /// <returns></returns> object Eval(string script, string key, params object[] args); #endregion } } using CSRedis; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using System.Reflection; namespace Common.CacheManager { public class RedisCacheService : ICacheService { public RedisCacheService() { IConfigurationRoot configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build(); var csredis = new CSRedisClient(configuration.GetValue<string>("Redis:ConnStr")); RedisHelper.Initialization(csredis); } #region 基本操作 /// <summary> /// 获取缓存 /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> public string Get(string key) { return RedisHelper.Get(key); } /// <summary> /// 删除缓存 /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> public bool Remove(string key) { RedisHelper.Del(key); return true; } /// <summary> /// 批量删除缓存 /// </summary> /// <param name="key">缓存Key集合</param> /// <returns></returns> public void RemoveAll(IEnumerable<string> keys) { RedisHelper.Del(keys.ToArray()); } /// <summary> /// 验证缓存项是否存在 /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> public bool Exists(string key) { if (key == null) { throw new ArgumentNullException(nameof(key)); } return RedisHelper.Exists(key); } /// <summary> /// 设置过期时间 /// </summary> /// <param name="key">缓存Key</param> /// <param name="expireSeconds">过期时间,单位:秒</param> /// <returns></returns> public bool Expire(string key, int expireSeconds = -1) { return RedisHelper.Expire(key, expireSeconds); } #endregion #region String类型缓存 /// <summary> /// 添加String缓存 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存Value</param> /// <param name="expireSeconds">缓存时长</param> /// <returns></returns> public bool Add(string key, string value, int expireSeconds = -1) { return RedisHelper.Set(key, value, expireSeconds); } /// <summary> /// 添加String缓存(对象自动转换Json格式存入) /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存对象</param> /// <param name="expireSeconds">缓存时长</param> /// <returns></returns> public bool AddObject(string key, object value, int expireSeconds = -1) { return RedisHelper.Set(key, value, expireSeconds); } /// <summary> /// 添加String缓存,前提是这个key不存在,否则不执行。 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存Value</param> /// <returns></returns> public bool AddNx(string key, string value) { return RedisHelper.SetNx(key, value); } /// <summary> /// 添加String缓存,前提是这个key不存在,否则不执行。 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存Value</param> /// <param name="expireSeconds">缓存时长</param> /// <returns></returns> public bool AddNxExpire(string key, string value, int expireSeconds = -1) { return RedisHelper.Set(key, value, expireSeconds, RedisExistence.Nx); } /// <summary> /// 获取缓存(Redis存储Json格式) /// </summary> /// <param name="key">缓存Key</param> /// <returns>对象</returns> public T GetObject<T>(string key) where T : class { return RedisHelper.Get<T>(key); } #endregion #region Hash类型缓存 /// <summary> /// 添加Hash缓存 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">字典类型</param> /// <returns></returns> public void AddHash(string key, Dictionary<string, string> value) { foreach (var item in value) { RedisHelper.HSet(key, item.Key, item.Value); } } /// <summary> /// 添加Hash缓存 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key">缓存Key</param> /// <param name="t">对象</param> public void AddHash<T>(string key, T t) { Dictionary<string, string> map = new Dictionary<string, string>(); //将对象转为Dictionary Type types = t.GetType(); PropertyInfo[] PropertyList = types.GetProperties(); foreach (var item in PropertyList) { string name = item.Name; object value = item.GetValue(t, null); if (value != null) { map.Add(name, value.ToString()); } else { map.Add(name, ""); } } //写入Redis AddHash(key, map); } /// <summary> /// 获取Hash缓存 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key">缓存Key</param> /// <returns>对象</returns> public T GetHash<T>(string key) where T : class { //获取所有键值 RedisScan<(string field, string value)> m_pair = RedisHelper.HScan(key, 0); (string field, string value)[] items = m_pair.Items; //构造新实例 T t = Activator.CreateInstance<T>(); try { //获得新实例类型 var Types = t.GetType(); //获得遍历类型的属性字段 foreach (PropertyInfo sp in Types.GetProperties()) { //遍历Hash值 for (int i = 0; i < items.Length; ++i) { //判断属性名是否相同 if (items[i].field == sp.Name) { string propertyType = sp.PropertyType.ToString(); //获得s对象属性的值复制给d对象的属性 if (propertyType.Equals("System.Guid")) sp.SetValue(t, Guid.Parse(items[i].value), null); else sp.SetValue(t, items[i].value, null); } } } } catch (Exception ex) { throw ex; } return t; } #endregion #region List类型缓存 /// <summary> /// List头部插入一个元素 /// </summary> /// <param name="key">缓存Key</param> /// <param name="val">缓存Value</param> public void LPush(string key, string val) { RedisHelper.LPush(key, val); } /// <summary> /// List尾部插入一个元素 /// </summary> /// <param name="key">缓存Key</param> /// <param name="val">缓存Value</param> public void RPush(string key, string val) { RedisHelper.RPush(key, val); } /// <summary> /// 从List尾部删除一个元素 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key">缓存Key</param> /// <returns></returns> public T ListDequeue<T>(string key) where T : class { string value = RedisHelper.RPop(key); if (string.IsNullOrEmpty(value)) return null; return JsonConvert.DeserializeObject<T>(value); } /// <summary> /// 从List尾部删除一个元素 /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> public object ListDequeue(string key) { string value = RedisHelper.RPop(key); if (string.IsNullOrEmpty(value)) return null; return value; } /// <summary> /// 移除list中的数据,keepIndex为保留的位置到最后一个元素如list 元素为1.2.3.....100 /// 需要移除前3个数,keepindex应该为4 /// </summary> /// <param name="key"></param> /// <param name="keepIndex"></param> public void ListRemove(string key, int keepIndex) { RedisHelper.LTrim(key, keepIndex, -1); } #endregion #region lua脚本 public object Eval(string script, string key, params object[] args) { return RedisHelper.Eval(script, key, args); } #endregion public void Dispose() { } } /// <summary> /// 逻辑过期时间封装 /// </summary> public class RedisDataExtens { /// <summary> /// 缓存击穿逻辑过期穿解决方案中的逻辑过期时间 /// </summary> public DateTime ExpireTime { get; set; } public object Data { get; set; } } }
为项目注入类库
#region Redis配置 services.AddSingleton<ICacheService, RedisCacheService>(); #endregion
截止目前SignUp.Common目录截图如下:
学习交流
附笔者学习 .net core开发时参考相关项目实例源码:asp.net core webapi项目实例源代码锦集下载(72个)
猜您可能还喜欢
- net core+webapi+nginx windows 服务器部署(1321)
- .Nuget Packages 太占C盘,删除后可以放到其他盘(1194)
- ASP.NET Core 配置 Swagger 显示接口注释描述信息(1094)
- vue调用接口后获取不到后端返回的Header响应头(964)
- .net core 系列实例开发教程-权限管理系统功能介绍(952)
- .net core 6.0 web API + SwaggerUI + IIS部署(912)
- .net core 实例教程(十二)配置启用Swagger中的【Authorize】按钮(831)
- .net core 实例教程(一)新建项目(797)
- .net core 实例教程(十四)配置 Swagger 显示接口注释描述信息及支持版本控制(783)
- .net 6中使用log4net写sqlserver数据库日志(756)
评论列表
发表评论
文章分类
文章归档
- 2025年3月 (1)
- 2024年6月 (2)
- 2024年5月 (2)
- 2024年4月 (4)
- 2024年3月 (30)
- 2024年1月 (4)
- 2023年12月 (2)
- 2023年11月 (4)
- 2023年10月 (4)
- 2023年9月 (6)
- 2023年3月 (2)
- 2023年2月 (1)
- 2023年1月 (1)
- 2022年12月 (1)
- 2022年9月 (21)
- 2022年8月 (10)
- 2022年7月 (3)
- 2022年4月 (1)
- 2022年3月 (13)
- 2021年8月 (1)
- 2021年3月 (1)
- 2020年12月 (42)
- 2020年11月 (7)
- 2020年10月 (5)
- 2020年8月 (1)
- 2020年6月 (1)
- 2020年3月 (2)
- 2019年12月 (8)
- 2019年11月 (3)
- 2019年9月 (1)
- 2019年4月 (1)
- 2019年3月 (6)
- 2019年2月 (1)
- 2018年7月 (7)
阅读排行
- 1.asp.net mvc内微信pc端、H5、JsApi支付方式总结(5702)
- 2.各大搜索网站网站收录提交入口地址(3201)
- 3.Windows 10休眠文件更改存储位置(3163)
- 4.ECharts仪表盘实例及参数使用详解(3095)
- 5.windows 10安装myeclipse 10破解补丁cracker.jar、run.bat闪退解决办法(2991)
- 6.HTML5 WebSocket与C#建立Socket连接实现代码(2866)
- 7.华为鸿蒙系统清除微信浏览器缓存方法(2779)
- 8.CERT_HAS_EXPIRED错误如何解决(2245)
- 9.Js异步async、await关键字详细介绍(lambda表达式中使用async和await关键字)(2188)
- 10.HBuilder编辑器格式化代码(2118)