net6使用StackExchangeRedis实现分布式缓存

上一篇讲解了Redis的搭建及ServiceStack.Redis 与 StackExchange.Reids 的区别https://blog.csdn.net/qq_39569480/article/details/105249607

这篇文章遗我们来说下使用Microsoft.Extensions.Caching.StackExchangeRedis来对redis进行操作及帮助类。

首先在windows上安装redis 在上边连接中有教程 .

创建webapi项目
在这里插入图片描述

在包管理器中安装Microsoft.Extensions.Caching.StackExchangeRedis
在这里插入图片描述
在appsettings.json中添加连接字符串:(redis连接字符串)

  "ConnectionStrings": {"Redis": "123.123.33.22:6379,password=123456!,ConnectTimeout=15000,SyncTimeout=5000"},

定义一个接口

public interface ICache
{#region 设置缓存 /// <summary>/// 设置缓存/// </summary>/// <param name="key">缓存Key</param>/// <param name="value">值</param>void SetCache(string key, object value);/// <summary>/// 设置缓存/// </summary>/// <param name="key">缓存Key</param>/// <param name="value">值</param>Task SetCacheAsync(string key, object value);/// <summary>/// 设置缓存/// 注:默认过期类型为绝对过期/// </summary>/// <param name="key">缓存Key</param>/// <param name="value">值</param>/// <param name="minutes">过期时间间隔 以分钟为单位</param>void SetCache(string key, object value,int minutes);/// <summary>/// 设置缓存/// 注:默认过期类型为绝对过期/// </summary>/// <param name="key">缓存Key</param>/// <param name="value">值</param>/// <param name="timeout">过期时间间隔 以分钟为单位</param>Task SetCacheAsync(string key, object value, int minutes);/// <summary>/// 设置缓存/// 注:默认过期类型为绝对过期/// </summary>/// <param name="key">缓存Key</param>/// <param name="value">值</param>/// <param name="minutes">过期时间间隔 以分钟为单位</param>/// <param name="expireType">过期类型</param>  void SetCache(string key, object value, int minutes, ExpireType expireType);/// <summary>/// 设置缓存/// 注:默认过期类型为绝对过期/// </summary>/// <param name="key">缓存Key</param>/// <param name="value">值</param>/// <param name="minutes">过期时间间隔 以分钟为单位</param>/// <param name="expireType">过期类型</param>  Task SetCacheAsync(string key, object value, int minutes, ExpireType expireType);#endregion#region 获取缓存/// <summary>/// 获取缓存/// </summary>/// <param name="key">缓存Key</param>string GetCache(string key);/// <summary>/// 获取缓存/// </summary>/// <param name="key">缓存Key</param>Task<string> GetCacheAsync(string key);/// <summary>/// 获取缓存,没有则添加/// </summary>/// <param name="key"></param>/// <param name="value"></param>/// <param name="minutes"></param>/// <param name="expireType">过期类型,默认绝对过期</param>/// <returns></returns>Task<string> GetOrAddAsync(string key, object value, int minutes, ExpireType expireType = 0);/// <summary>/// 获取缓存/// </summary>/// <param name="key">缓存Key</param>T GetCache<T>(string key);/// <summary>/// 获取缓存/// </summary>/// <param name="key">缓存Key</param>Task<T> GetCacheAsync<T>(string key);/// <summary>/// 获取泛型缓存,没有则添加/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <param name="value"></param>/// <param name="minutes"></param>/// <param name="expireType">过期类型,默认绝对过期</param>/// <returns></returns>Task<T> GetOrAddAsync<T>(string key, object value, int minutes, ExpireType expireType = 0);#endregion#region 删除缓存/// <summary>/// 清除缓存/// </summary>/// <param name="key">缓存Key</param>void RemoveCache(string key);/// <summary>/// 清除缓存/// </summary>/// <param name="key">缓存Key</param>Task RemoveCacheAsync(string key);#endregion#region 刷新缓存/// <summary>/// 刷新缓存/// </summary>/// <param name="key">缓存Key</param>void RefreshCache(string key);/// <summary>/// 刷新缓存/// </summary>/// <param name="key">缓存Key</param>Task RefreshCacheAsync(string key);#endregion
}

实现接口中定义的方法

public class CacheHelper : ICache
{readonly IDistributedCache _cache;public CacheHelper(IDistributedCache cache){_cache = cache;}protected string BuildKey(string idKey){return $"Cache_{idKey}";}public void SetCache(string key, object value){string cacheKey = BuildKey(key);_cache.SetString(cacheKey, value.ToJson());}public async Task SetCacheAsync(string key, object value){string cacheKey = BuildKey(key);await _cache.SetStringAsync(cacheKey, value.ToJson());}public void SetCache(string key, object value,int minutes){string cacheKey = BuildKey(key);_cache.SetString(cacheKey, value.ToJson(), new DistributedCacheEntryOptions{AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(minutes)});}public async Task SetCacheAsync(string key, object value, int minutes){string cacheKey = BuildKey(key);await _cache.SetStringAsync(cacheKey, value.ToJson(), new DistributedCacheEntryOptions{AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(minutes)});}public void SetCache(string key, object value, int minutes, ExpireType expireType){string cacheKey = BuildKey(key);if (expireType == ExpireType.Absolute){//这里没转换标准时间,Linux时区会有问题?_cache.SetString(cacheKey, value.ToJson(), new DistributedCacheEntryOptions{AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(minutes)});}else{_cache.SetString(cacheKey, value.ToJson(), new DistributedCacheEntryOptions{AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(minutes)});}}public async Task SetCacheAsync(string key, object value, int minutes, ExpireType expireType){string cacheKey = BuildKey(key);if (expireType == ExpireType.Absolute){//这里没转换标准时间,Linux时区会有问题?await _cache.SetStringAsync(cacheKey, value.ToJson(), new DistributedCacheEntryOptions{AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(minutes)});}else{await _cache.SetStringAsync(cacheKey, value.ToJson(), new DistributedCacheEntryOptions{AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(minutes)});}}public string GetCache(string idKey){if (idKey.IsNullOrEmpty()){return null;}string cacheKey = BuildKey(idKey);var cache = _cache.GetString(cacheKey);return cache;}public async Task<string> GetCacheAsync(string key){if (key.IsNullOrEmpty()){return null;}string cacheKey = BuildKey(key);var cache = await _cache.GetStringAsync(cacheKey);return cache;}public async Task<string> GetOrAddAsync(string key,object value,int minutes, ExpireType expireType=0){if (key.IsNullOrEmpty()) return null;string cacheKey = BuildKey(key);var cache = await _cache.GetStringAsync(cacheKey);if (cache==null&& value!=null){string json= value.ToJson();if (expireType == ExpireType.Absolute){//这里没转换标准时间,Linux时区会有问题?await _cache.SetStringAsync(cacheKey, json, new DistributedCacheEntryOptions{AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(minutes)});}else{await _cache.SetStringAsync(cacheKey, json, new DistributedCacheEntryOptions{AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(minutes)});}return json;}return cache;}public T GetCache<T>(string key){var cache = GetCache(key);if (!cache.IsNullOrEmpty()){return cache.ToObject<T>();}return default(T);}public async Task<T> GetCacheAsync<T>(string key){var cache = await GetCacheAsync(key);if (!string.IsNullOrEmpty(cache)){return cache.ToObject<T>();}return default(T);}public async Task<T> GetOrAddAsync<T>(string key, object value, int minutes, ExpireType expireType = 0){if (key.IsNullOrEmpty()) return default(T);string cacheKey = BuildKey(key);var cache = await _cache.GetStringAsync(cacheKey);if (cache == null && value != null){string json = value.ToJson();if (expireType == ExpireType.Absolute){//这里没转换标准时间,Linux时区会有问题?await _cache.SetStringAsync(cacheKey, json, new DistributedCacheEntryOptions{AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(minutes)});}else{await _cache.SetStringAsync(cacheKey, json, new DistributedCacheEntryOptions{AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(minutes)});}return json.ToObject<T>();}return cache.ToObject<T>();}public void RemoveCache(string key){_cache.Remove(BuildKey(key));}public async Task RemoveCacheAsync(string key){await _cache.RemoveAsync(BuildKey(key));}public void RefreshCache(string key){_cache.Refresh(BuildKey(key));}public async Task RefreshCacheAsync(string key){await _cache.RefreshAsync(BuildKey(key));}
}

定义一个枚举的过期类型

public enum ExpireType
{/// <summary>/// 绝对过期/// 注:即自创建一段时间后就过期/// </summary>Absolute,/// <summary>/// 相对过期/// 注:即该键未被访问后一段时间后过期,若此键一直被访问则过期时间自动延长/// </summary>Relative,
}

定义一个string的扩展方法

public static class ValueToObject
{/// <summary>/// 将Json字符串反序列化为对象/// </summary>/// <typeparam name="T">对象类型</typeparam>/// <param name="jsonStr">Json字符串</param>/// <returns></returns>public static T ToObject<T>(this string jsonStr){return JsonConvert.DeserializeObject<T>(jsonStr);}/// <summary>/// 将字符串序列化为json/// </summary>/// <param name="str"></param>/// <returns></returns>public static string ToJson(this object str){return JsonConvert.SerializeObject(str);}
}

在Program.cs文件中注入并添加redis

builder.Services.AddScoped(typeof(ICache), typeof(CacheHelper));//注入builder.Services.AddStackExchangeRedisCache(o =>
{//redis连接o.Configuration = builder.Configuration.GetConnectionString("Redis");//设置缓存key的前缀//o.InstanceName = "";
});

控制器中使用

[Route("demo")]
[ApiController]
//[Authorize]
public class DemoController : ControllerBase
{private readonly IDemoService _demo;public DemoController(IDemoService demo){_demo = demo;}/// <summary>/// 获取列表/// </summary>/// <param name="input"></param>/// <returns></returns>[HttpGet]public async Task<dynamic> Get(int id){DemoGetOutPut demo=await _cache.GetOrAddAsync<DemoGetOutPut>($"demo{id}", async () => await GetDemo(id),20);return demo;}public async Task<dynamic> Get(int id){return new { name= "张三", age= 18 };}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/232580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java JVM】运行时数据区

JVM 在执行 Java 程序的过程中会把它管理的内存分为若干个不同的数据区域, 这些区域有着各自的用途。 根据《Java虚拟机规范》中规定, JVM 所管理的内存大致包括以下几个运行时数据区域, 如图所示: 这个运行时数据区被分为了 5 大块 方法区 (Method Area)堆 (Heap)虚拟机栈 (V…

Ubuntu20.04.2 Mate 安装后基本初始设置要点笔记

序言&#xff1a; 有几款Linux比较稳定而且LTS长期支持&#xff0c;窗口也比较干净有特色&#xff0c;CentOS、Ubuntu、Debian、Mint 都是挺不错的OS&#xff0c;因为LTS&#xff0c;所以不像Rolling版那样改动频发&#xff0c;为长期应用提供了比较好的保障。下面是 Ubuntu20…

从Gitee克隆项目、启动方法

从gitee克隆VUE项目到本地后&#xff0c;不能直接运行&#xff0c;需要进行npm install安装node_modules文件夹里面的内容&#xff0c;因为在git上传的时候&#xff0c;一般都会过滤到node_modules中的依赖文件。 安装依赖以后&#xff0c;启动通过npm run serve启动项目出错。…

linux xxd命令(将文件或标准输入转换为hex(十六进制)和ASCII(美国信息交换标准代码)表示,或者从hex dump(十六进制转储)反向到二进制)

文章目录 Linux xxd命令安装xxd基本使用方法创建hex dump从hex dump恢复到二进制 命令选项疑难技术点解析在脚本中使用xxd从hex dump恢复数据 总结 Linux xxd命令 xxd是一个在Linux和UNIX系统中常用的工具&#xff0c;主要用于将文件或标准输入转换为hex&#xff08;十六进制&…

Python框架篇(6):FastApi-配置管理

提示: 微信搜索【猿码记】回复 【fastapi】即可获取源码信息~ 在这一篇文章中,对fastapi框架和pydantic进行了升级&#xff0c;然后就是各种不兼容&#xff0c;以后再也不敢轻易升级.... pydantic&#xff1a;从 1.10.11升级到 2.5.2&#xff0c;这里有坑&#xff0c;里面有很多…

蓝凌OA getLoginSessionId.html 信息泄露漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 蓝凌核心产品EKP平台定位为新一代数字化生态OA平台&#xff0c;数字化向纵深发展&#xff0c;正加速构建产业互联网&#xff0c;对企业协作能力提出更高要求&#xff0c;蓝凌新一代生态型OA平台能够支撑办公数字化…

SpringCloud微服务 【实用篇】| Docker镜像、容器、数据卷操作

目录 一&#xff1a;Docker基本操作 1. 镜像操作 镜像相关命令 2. 容器操作 容器相关命令 3. 数据卷&#xff08;容器数据管理&#xff09; 数据卷 操作数据卷 挂载数据卷 挂载的方式区别 前些天突然发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0…

【数据可视化】Pyecharts的实际使用

Pyecharts的实际使用 前言正文环境分析Prometheus数据处理Gauge图Bar图-横向如何整合进Flask中 附录 前言 一个多月前参加公司的一个产品会的时候&#xff0c;有和同事聊到日常巡检报表的一些东西&#xff0c;现在虽然项目上搭建的有监控平台、数据稽核平台、调度平台等业务系…

JavaWeb 学生信息管理系统

介绍 ServletMysqlJdbcjQuery 实现学生信息管理系统 学生 班级 教师 系统设置 登陆 软件架构 软件架构说明 基于ServletMysqlJdbcjQuery 实现学生信息的增删改查功能 文件目录声明 src/dao 数据库的增删改查功能src/filter 网页的过滤拦截功能src/model 登陆的实体对象信息…

Gazebo11更新安装

ROS Melodic版本安装的是Gazebo9&#xff0c;Gazebo 最新版本是11 dpkg -l | grep gazebo 出现的是 gazebo9 相关的插件&#xff0c;需要卸载全部插件。 sudo apt-get remove gazebo9 gazebo9-common gazebo9-plugin-base libgazebo9:amd64 libgazebo9-dev:amd64 ros-melodic…

从账户取款和存款的操作

public class Account {private double balance;public Account(double balance){super();this.balancebalance;}public Account(){super();}public void withdraw(double money) throws NotFullBalanceException{//取款if(money<balance){balance - money;}else{throw new …

flink 读取 apache paimon表,查看source的延迟时间 消费堆积情况

paimon source查看消费的数据延迟了多久 如果没有延迟 则显示0 官方文档 Metrics | Apache Paimon

Ring Co-XOR encryption based reversible data hiding for 3D mesh model

期刊&#xff1a;Signal Processing 作者&#xff1a;Lingfeng Qu et al. -- 摘要&#xff1a; 加密域可逆数据隐藏被广泛应用于云存储数字媒体的内容安全、隐私保护和便捷管理。然而&#xff0c;RDH-ED技术在三维网格模型载体中的应用研究仍处于起步阶段。为解决现有针对三…

美化Pandas数据图表

二、数据条显示 Excel条件格式里&#xff0c;有一个数据条显示方式&#xff0c;用以可视化表达数据大小。 Pandas Style方法中也有数据条的表达形式&#xff0c;用df.style.bar来实现。 还是用前面人口数据的例子&#xff0c;我们来看下如何操作数据条。 import pandas as …

初探 Reactor、Proactor 线程模型与 BIO、AIO、NIO

1 前言 工作中或者是技术上经常会遇到 I/O 、线程模型相关的问题&#xff0c;以及同步、异步、阻塞、非阻塞等各种基础问题&#xff0c;之前上学时候的概念认知总是模糊的&#xff0c;一知半解。趁这次了解希望能够更加深入的去了解这方面的知识&#xff0c;于是有了接下来这篇…

(7)nacos集群搭建方法-有状态负载

前期准备 1.准备好nacos镜像文件,上传至镜像仓库: 2.创建自己集群下-命名空间下的有状态负载: 3.填写工作负载名称、设置实例数量、选择自己的命名空间: 4.选择镜像(目前最新的是2.2.3):

yolov5单目测距+速度测量+目标跟踪(算法介绍和代码)

要在YOLOv5中添加测距和测速功能&#xff0c;您需要了解以下两个部分的原理&#xff1a; 单目测距算法 单目测距是使用单个摄像头来估计场景中物体的距离。常见的单目测距算法包括基于视差的方法&#xff08;如立体匹配&#xff09;和基于深度学习的方法&#xff08;如神经网…

[自动化运维工具]ansible简单介绍和常用模块

ansible 源操作主机功能 自动化运维&#xff08;playbook剧本yaml&#xff09; 是基于python开发的一个配置管理和应用部署工具&#xff0c;在自动化运维中&#xff0c;现在还是异军突起 ansible能批量配置&#xff0c;部署&#xff0c;管理上千台主机&#xff0c;类似于xshell…

使用vite搭建项目时,在启动vite后,浏览器显示页面:找不到localhost的网页

现象 在使用前端工具vite&#xff08;版本5&#xff09;&#xff0c;搭建vue3项目时&#xff0c;启动vite&#xff0c;浏览器显示页面&#xff1a;找不到localhost的网页, 起初怀疑是 未加参数 --host0.0.0.0,导致&#xff0c;后加上该参数后问题依旧 解决 将index.html页面…

中国的下一个风口:低代码开发

“中国的下一个风口是什么&#xff1f;低代码&#xff1f;你赞同吗&#xff1f;” 可以肯定的是&#xff0c;企业想站上未来产业的风口&#xff0c;”数字化“是必经之路。而低代码是企业向制高点突进的手段。产业的风口&#xff0c;就是产业发展的趋势&#xff0c;只有尽力站上…