net6使用StackExchangeRedis实现分布式缓存

news2024/12/25 1:55:17

上一篇讲解了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.coloradmin.cn/o/1322350.html

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

相关文章

springboot 学生信息管理

介绍 一个学生信息管理后台&#xff0c;适用于大作业&#xff0c;课设等 软件架构 springbootmybatisthymeleaf &#xff08;前后端未分离&#xff09; 安装教程 注&#xff1a;mysql数据库要8.0以上&#xff0c;&#xff0c;本地mysql新建一个名为 student 的空数据库&am…

关于“Python”的核心知识点整理大全29

目录 11.2.4 方法 setUp() 注意 11.3 小结 第二部分 项目1 外星人入侵 第&#xff11;2 章 武装飞船 注意 12.1 规划项目 12.2 安装 Pygame 注意 12.2.1 使用 pip 安装 Python 包 注意 如果你启动终端会话时使用的是命令python3&#xff0c;那么在这里应使用命令…

论文Rebuttal常见格式与模板之下篇

论文Rebuttal常见格式与模板之下篇 前言7. Rebuttal 常见表达一些推荐阅读总体感谢表示感谢和赞同表示不同意或澄清尾句模板 Rebuttal模板的好文 前言 这里承接上一篇笔记&#xff1a;论文Rebuttal常见格式与模板之中篇 其中篇的内容主要讲述可能遇到Rebuttal问题&#xff08;…

5. Prism系列之区域管理器

Prism系列之区域管理器 文章目录 Prism系列之区域管理器一、区域管理器二、区域创建与视图的注入1. ViewDiscovery2. ViewInjection 三、激活与失效视图1. Activate和Deactivate2. 监控视图激活状态3. Add和Remove 四、自定义区域适配器1. 创建自定义适配器2. 注册映射3. 创建区…

Postgresql中PL/pgSQL代码块的语法与使用-声明与赋值、IF语句、CASE语句、循环语句

场景 PostGresSQL简介与Windows上的安装教程&#xff1a; PostGresSQL简介与Windows上的安装教程_postgressql windows安装免费吗?-CSDN博客 除了标准 SQL 语句之外&#xff0c;PostgreSQL 还支持使用各种过程语言&#xff08;例如 PL/pgSQL、C、PL/Tcl、PL/Python、PL/Per…

fiddler的下载、安装

在官网下载fiddler 点击Download For Windows 下载完成 安装fiddler 点击.exe文件&#xff0c;进行傻瓜式安装&#xff0c;即可安装成功 配置fiddler 点击OK后&#xff0c;重启fiddler, 即可抓包

Next.js 学习笔记(三)——路由

路由 路由基础知识 每个应用程序的骨架都是路由。本页将向你介绍互联网路由的基本概念以及如何在 Next.js 中处理路由。 术语 首先&#xff0c;你将在整个文档中看到这些术语的使用情况。以下是一个快速参考&#xff1a; 树&#xff08;Tree&#xff09;&#xff1a;用于可…

XXE利用的工作原理,利用方法及防御的案例讲解

XXE&#xff08;XML外部实体注入&#xff09;利用是一种网络安全攻击手段&#xff0c;其中攻击者利用XML解析器处理外部实体的方式中的漏洞。这种攻击主要针对的是那些使用XML来处理数据的应用程序&#xff0c;尤其是当这些应用程序没有正确限制外部实体的处理时。通过XXE利用&…

2018年第七届数学建模国际赛小美赛D题速度扼杀爱情解题全过程文档及程序

2018年第七届数学建模国际赛小美赛 D题 速度扼杀爱情 原题再现&#xff1a; 在网上约会的时代&#xff0c;有比鱼更多的浪漫选择&#xff0c;好吧&#xff0c;你知道的。例如&#xff0c;在命名恰当的网站Plenty of Fish上&#xff0c;你可以仔细查看数百或数千名潜在伴侣的档…

云原生之深入解析强大的镜像构建工具Earthly

一、Earthly 简介 Earthly 是一个更加高级的 Docker 镜像构建工具&#xff0c;Earthly 通过自己定义的 Earthfile 来代替传统的 Dockerfile 完成镜像构建&#xff1b;Earthfile 就如同 Earthly 官方所描述: Makefile Dockerfile Earthfile在使用 Earthly 进行构建镜像时目前…

护肤品类小红书素人达人的推广报价是多少?

小红书是一款集社交和电商于一体的平台&#xff0c;用户可以在上面分享生活点滴、购物心得、旅游攻略等。近年来&#xff0c;随着护肤美妆市场的不断扩大&#xff0c;越来越多的品牌和商家选择在小红书上投放广告&#xff0c;借助素人达人的影响力为产品引流。那么&#xff0c;…

Java第十七章总结

数据库基础 SQL语言 1、select 语句 select 语句用于从数据中检索数据。语法如下&#xff1a; SELECT 搜选字段列表 FROM 数据表名 WHERE 条件表达式 GROUP BY 字段名 HAVING 条件表达式(指定分组的条件) ORDER BY 字段名[ASC|DESC] 2、insert 语句 insert 语句用于向表中插入…

2024年G2电站锅炉司炉证考试题库及G2电站锅炉司炉试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年G2电站锅炉司炉证考试题库及G2电站锅炉司炉试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲…

Spring学习?这一篇文章就够,史上最全!

文章目录 前言一、IOC概述及底层原理1.概述和原理 二、思路分析三、IOC操作bean管理&#xff08;基于xml&#xff0c;使用的是IDEA2022.3.3&#xff0c;maven仓库&#xff09;1.xml实现bean管理&#xff08;1&#xff09;创建对象&#xff08;2&#xff09;注入属性&#xff08…

SQL Server 查询处理过程

查询处理--由 SQL Server 中的关系引擎执行&#xff0c;它获取编写的 T-SQL 语句并将其转换为可以向存储引擎发出请求并检索所需结果的过程。 SQL Server 需要四个步骤来处理查询&#xff1a;分析、代化、优化和执行。 前三个步骤都由关系引擎执行&#xff1b;第三步输出的是…

一文解释JS如何获取当前系统电量

在前端浏览器中我们可以通过使用JavaScript的navigator.getBattery()方法来获取当前系统的电池情况。 这个API可以监测设备的电池状态&#xff0c;包括是否在充电、当前电量以及放电或充电所需的时间。本文将介绍如何使用这个API以及它在实际应用中的使用。 API使用 首先让我…

SD-WAN组网:企业网络的首选

在互联网技术不断更新、发展的背景之下&#xff0c;企业在面对日益复杂的网络组网需求时迫切需要一种创新的解决方案。传统的MPLS-VPN组网方式由于其高成本的特点令企业难以破局&#xff0c; SD-WAN正逐渐代替它们&#xff0c;成为企业网络组网的首选。 本文将深入探讨SD-WAN技…

广州华锐互动VRAR:利用VR开展新能源汽车触电安全演练,降低培训成本和风险

随着新能源汽车行业的快速发展&#xff0c;相关的安全培训也变得越来越重要。其中&#xff0c;触电急救培训对于保障驾驶员和乘客的安全具有重要意义。传统培训方式存在一些不足&#xff0c;而利用VR技术进行培训则具有很多优势。 利用VR技术开展新能源汽车触电安全演练可以在模…

电脑风扇控制软件Macs Fan Control mac支持多个型号

Macs Fan Control mac是一款专门为 Mac 用户设计的软件&#xff0c;它可以帮助用户控制和监控 Mac 设备的风扇速度和温度。这款软件允许用户手动调整风扇速度&#xff0c;以提高设备的散热效果&#xff0c;减少过热造成的风险。 Macs Fan Control 可以在菜单栏上显示当前系统温…

linux | sed 命令使用 | xargs命令 使用

##################################################### sed命令来自英文词组stream editor的缩写&#xff0c;其功能是利用语法/脚本对文本文件进行批量的编辑操作。sed命令最初由贝尔实验室开发&#xff0c;后被众多Linux系统集成&#xff0c;能够通过正则表达式对文件进行批…