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.rhkb.cn/news/220784.html

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

相关文章

产品入门第六讲:Axure中继器

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Axure》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c…

Unity | Shader基础知识(第七集:案例<让图片和外部颜色叠加显示>)

目录 一、本节介绍 1 上集回顾 2 本节介绍 二、添加图片资源 三、 常用cg数据类型 1 float 2 bool 3 sampler 四、加入图片资源 五、使用图片资源 1 在通道里加入资源 2 使用图片和颜色叠加 2.1 2D纹理采样tex2D 2.2 组合颜色 六、全部代码 七、下集介绍 相关…

git-lfs基本知识讲解

目录 1. 基本知识2. 安装 1. 基本知识 git-lfs 是 Git Large File Storage 的缩写&#xff0c;是 Git 的一个扩展&#xff0c;用于处理大文件的版本控制。 它允许你有效地管理和存储大型二进制文件&#xff0c;而不会使 Git 仓库变得过大和不稳定。以下是一些与 git-lfs 相关…

【微服务】springboot整合minio详解

目录 一、前言 二、Minio 概述 2.1 Minio简介 2.1 Minio特点 三、Minio 环境搭建 3.1 部署过程 3.1.1 拉取镜像 3.1.2 启动容器 3.1.3 访问web页面 四、Minio基本使用 4.1 基本概念 4.2 上传文件演示 4.3 用户管理 4.4 Java操作Minio 4.4.1 导入依赖 4.4.2 上传…

机器学习——支持向量机

目录 一、基于最大间隔分隔数据 二、寻找最大间隔 1. 最大间隔 2. 拉格朗日乘子法 3. 对偶问题 三、SMO高效优化算法 四、软间隔 五、SMO算法实现 1. 简化版SMO算法 2. 完整版SMO算法 3. 可视化决策结果 六、核函数 1. 线性不可分——高维可分 2. 核函数 …

调用第三方http接口 hutool工具类

1、引入依赖 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.0.M2</version> </dependency>2、请求组装 String params"<BSXml>" " <MsgHeader>&…

org.springframework.boot.autoconfigure.AutoConfiguration.imports新版自动配置

文章目录 场景 场景 springboot2.7.0之后的版本 自动配置方式有了变化, 新版兼容旧版 旧版新版META-INF/spring.factoriesMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsConfigurationAutoConfiguration

【期末复习向】长江后浪推前浪之ChatGPT概述

参考文章&#xff1a;GPT系列模型技术路径演进-CSDN博客 这篇文章讲了之前称霸NLP领域的预训练模型bert&#xff0c;它是基于预训练理念&#xff0c;采用完形填空和下一句预测任务2个预训练任务完成特征的提取。当时很多的特定领域的NLP任务&#xff08;如情感分类&#xff0c…

STM32-UART-DMA HAL库缓冲收发

文章目录 1、说明1.1、注意事项&#xff1a;1.2、接收部分1.3、发送部分 2、代码2.1、初始化2.2、缓冲接收2.3、缓冲发送2.4、格式化打印 1、说明 1.1、注意事项&#xff1a; HAL库的DMA底层基本都会默认开启中断使能&#xff0c;如果在STM32CubeMx禁用了中断相关的功能&…

基于vue+element-plus+echarts制作动态绘图页面(柱状图,饼图和折线图)

前言 我们知道echarts是一个非常强大的绘图库&#xff0c;基于这个库&#xff0c;我们可以绘制出精美的图表。对于一张图来说&#xff0c;其实比较重要的就是配置项&#xff0c;填入不同的配置内容就可以呈现出不同的效果。 当然配置项中除了样式之外&#xff0c;最重要的就是…

07-抽象工厂

意图 提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 适用性 在以下的情况可以选择使用抽象工厂模式&#xff1a; 一个系统要独立于它的产品的创建、组合和表示。一个系统要由多个产品系列中的一个来配置。要强调一系列相关的产品对象的…

linux驱动的学习 驱动开发初识

1 设备的概念 在学习驱动和其开发之前&#xff0c;首先要知道所谓驱动&#xff0c;其对象就是设备。 1.1 主设备号&次设备号&#xff1a; 在Linux中&#xff0c;各种设备都以文件的形式存在/dev目录下&#xff0c;称为设备文件。最上层的应用程序可以打开&#xff0c;关…

云原生之深入解析减少Docker镜像大小的优化技巧

一、什么是 Docker&#xff1f; Docker 是一种容器引擎&#xff0c;可以在容器内运行一段代码&#xff0c;Docker 镜像是在任何地方运行应用程序而无需担心应用程序依赖性的方式。要构建镜像&#xff0c;docker 使用一个名为 Dockerfile 的文件&#xff0c;Dockerfile 是一个包…

数据分析场景下,企业大模型选型的思路与建议

来源/作者&#xff1a;爱分析 随着大模型带来能力突破&#xff0c;让AI与数据分析相互结合&#xff0c;使分析结果更好支撑业务&#xff0c;促进企业内部数据价值释放&#xff0c;成为了当下企业用户尤为关注的话题。本次分享主要围绕数据分析场景下大模型底座的选型思路&#…

Kafka 安装与部署

目录 Kafka 下载 &#xff08;1&#xff09;将 kafka_2.11-2.4.1.tgz 上传至 /opt/software/ &#xff08;2&#xff09;解压安装包至 /opt/module/ [huweihadoop101 ~]$ cd /opt/software/ [huweihadoop101 software]$ tar -zxvf kafka_2.11-2.4.1.tgz -C ../module/&#…

什么是供应链安全及其工作原理?

6000公里长的丝绸之路将丝绸、谷物和其他货物从中国运送到帕尔米拉。尽管蒙古治下的和平保护丝绸之路免受海盗、强盗和内部盗窃的侵害&#xff0c;但商人仍然装备精良&#xff0c;并依赖于大型商队旅行和战略性放置的小型堡垒所提供的安全。 为什么供应链安全很重要&#xff1…

Content-Type是什么

目录 Content-Type是什么 获取方式 设置方式 常见类型 application/x-www-form-urlencoded multipart/form-data application/json text/xml text/html text/plain Content-Type是什么 Content-Type出现在请求标头和响应标头中&#xff0c;意思是内容类型&#xff0…

JAVA主流日志框架梳理学习及使用

前言&#xff1a;目前市面上有挺多JAVA的日志框架&#xff0c;比如JUL(JDK自带的日志框架),Log4j,Logback,Log4j2等&#xff0c;有人可能有疑问说还有slf4j&#xff0c;不过slf4j不是一种日志框架的具体实现&#xff0c;而是一种日志门面&#xff08;日志门面可以理解为是一种统…

PyTorch机器学习与深度学习

近年来&#xff0c;随着AlphaGo、无人驾驶汽车、医学影像智慧辅助诊疗、ImageNet竞赛等热点事件的发生&#xff0c;人工智能迎来了新一轮的发展浪潮。尤其是深度学习技术&#xff0c;在许多行业都取得了颠覆性的成果。另外&#xff0c;近年来&#xff0c;Pytorch深度学习框架受…

定制 Electron 窗口标题栏

Electron 是一款流行的桌面应用开发框架&#xff0c;基于 Web 技术构建&#xff0c;提供了强大的跨平台能力。在开发过程中&#xff0c;经常需要定制窗口标题栏以创造独特的用户体验。 1. 完全隐藏默认标题栏 有时候&#xff0c;我们希望创建一个自定义的标题栏&#xff0c;完…