ASP.NET Core 使用Redis实现分布式缓存:Docker、 IDistributedCache、StackExchan geRedis

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: ASP.NET Core 使用Redis实现分布式缓存:Docker、 IDistributedCache、StackExchan geRedis

前提:一台 Linux 服务器、已安装 Docker。


一,Docker 中运行 Redis


拉取 Redis 镜像


docker pull redis


查询镜像列表


docker imgaes


运行 Redis的几种方法


①运行并且设置 Redis 端口


docker run -p 6379:6379 -d redis:latest redis-server



docker run -p 6379:6379 -d {镜像id} redis-server


③持久化

将 Docker 里的 Redis 数据持久化到物理机


docker run -p 6379:6379 -v {物理机路径}:/data  -d redis:latest redis-server --appendonly yes


下载 Windows 版的 Redis 管理器

Windows 版本的 Redis Desktop Manager 64位 2019.1(中文版) 下载地址 https://www.7down.com/soft/233274.html

官方正版最新版本下载地址 https://redisdesktop.com/download


另附 Redis 学习教程:

Redis 中文网 https://www.redis.net.cn/

.NET 使用 Redis 学习 地址(貌似这个教程版本过时了) https://www.cnblogs.com/cang12138/p/8884362.html

搭建 Master/Slaver 模式的 Redis 集群 https://blog.csdn.net/lupengfei1009/article/details/88323561#_154

使用 Redis Desktop Manager 连接 Redis


微信图片_20220502145841.png


二,ASP.NET Core 使用分布式缓存


ASP.NET Core 中,支持使用多种数据库进行缓存,ASP.NET Core 提供了统一的接口给开发者使用。


IDistributedCache

ASP.NET Core 中,使用 IDistributedCache 为开发者提供统一的缓存使用接口,而不必关注使用的是何种数据库。


IDistributedCache]接口提供了以下方法操作的分布式的缓存实现中的项:

  • GetAsync –接受字符串键和检索缓存的项作为byte[]数组如果在缓存中找到。
  • SetAsync –中添加项 (作为byte[]数组) 到使用字符串键的缓存。
  • RefreshAsync –刷新缓存基于其密钥,重置其滑动到期超时值 (如果有) 中的项。
  • RemoveAsync –移除缓存项根据其字符串键值。


IDistributedCache 提供的常用方法如下:


方法 说明
Get(String) 获取Key(键)的值
GetAsync(String, CancellationToken) 异步获取键的值
Refresh(String) 刷新缓存
RefreshAsync(String, CancellationToken) Refreshes a value in the cache based on its key, resetting its sliding expiration timeout (if any).
Remove(String) 移除某个值
RemoveAsync(String, CancellationToken) Removes the value with the given key.
[Set(String, Byte], DistributedCacheEntryOptions) Sets a value with the given key.
[SetAsync(String, Byte], DistributedCacheEntryOptions, CancellationToken) Sets the value with the given key.


官方文档很详细https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.extensions.caching.distributed.idistributedcache?view=aspnetcore-2.2


ASP.NET Core 中配置缓存

新建一个 ASP.NET Core WebApi 项目

Nuget 管理器安装


Microsoft.Extensions.Caching.StackExchangeRedis


ConfigureServices 中使用服务


services.AddDistributedMemoryCache();


配置 Redis 服务器


services.AddStackExchangeRedisCache(options =>
            {
                options.Configuration = "localhost:6379";
                options.InstanceName = "mvc";
            });


InstanceName 是你自定义的实例名称,创建缓存时会以此名称开头。

这样就配置好了。


使用缓存

修改默认生成的 ValuesController.cs。

注入缓存服务


private readonly IDistributedCache _cache;
        public ValuesController(IDistributedCache cache)
        {
            _cache = cache;
        }


设置缓存和使用缓存:


await _cache.GetAsync("{键名}");
_cache.SetAsync("键名", {值}, {设置});


删除原来的方法,添加以下代码:


[HttpGet("Set")]
        public async Task<JsonResult> SetCache(string setkey, string setvalue)
        {
            string key = "key1";
            if (!string.IsNullOrEmpty(setkey))
                key = setkey;
            string value = DateTime.Now.ToLongTimeString();
            if (!string.IsNullOrEmpty(setvalue))
                value = setvalue;
            await _cache.SetStringAsync(key, value);
            return new JsonResult(new { Code = 200, Message = "设置缓存成功", Data = "key=" + key + "    value=" + value });
        }
        [HttpGet("Get")]
        public async Task<JsonResult> GetCache(string setkey)
        {
            string key = "key1";
            if (!string.IsNullOrEmpty(setkey))
                key = setkey;
            var value = await _cache.GetStringAsync(key);
            return new JsonResult(new { Code = 200, Message = "设置缓存成功", Data = "key=" + key + "    value=" + value });
        }


在 URL 添加 QueryString 可以设置缓存内容,如果没有带参数的话,就使用默认的值。

打开 https://localhost:5001/api/values/set 可以看到设置了默认值。


或者访问 https://localhost:5001/api/values/set?setkey=key11111&setvalue=asafesfdsreg

自定义设置缓存值。


微信图片_20220502145846.png

打开 https://localhost:5001/api/values/get?setkey=key11111

可以获取缓存值。


设置缓存过期时间

使用 DistributedCacheEntryOptions 可以设置缓存过期时间

DistributedCacheEntryOptions 有三个属性,表示相对时间、绝对时间。

使用方法


[HttpGet("Set")]
        public async Task<JsonResult> SetCache(string setkey, string setvalue)
        {
            string key = "key1";
            if (!string.IsNullOrEmpty(setkey))
                key = setkey;
            string value = DateTime.Now.ToLongTimeString();
            if (!string.IsNullOrEmpty(setvalue))
                value = setvalue;
            var options = new DistributedCacheEntryOptions()
            .SetSlidingExpiration(TimeSpan.FromSeconds(20));
            await _cache.SetStringAsync(key, value, options);
            return new JsonResult(new { Code = 200, Message = "设置缓存成功", Data = "key=" + key + "    value=" + value });
        }


缓存 20 秒,20秒过后此缓存将被清除。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
1月前
|
缓存 NoSQL 安全
【Redis】缓存穿透
【Redis】缓存穿透
25 0
|
1月前
|
NoSQL 算法 安全
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
147 0
|
1月前
|
NoSQL 关系型数据库 MySQL
分布式锁(redis/mysql)
分布式锁(redis/mysql)
52 1
|
18天前
|
NoSQL Java Redis
如何通俗易懂的理解Redis分布式锁
在多线程并发的情况下,我们如何保证一个代码块在同一时间只能由一个线程访问呢?
30 2
|
7天前
|
存储 缓存 NoSQL
Java手撸一个缓存类似Redis
`LocalExpiringCache`是Java实现的一个本地缓存类,使用ConcurrentHashMap存储键值对,并通过ScheduledExecutorService定时清理过期的缓存项。类中包含`put`、`get`、`remove`等方法操作缓存,并有`clearCache`方法来清除过期的缓存条目。初始化时,会注册一个定时任务,每500毫秒检查并清理一次过期缓存。单例模式确保了类的唯一实例。
10 0
|
27天前
|
缓存 NoSQL Java
spring cache整合redis实现springboot项目中的缓存功能
spring cache整合redis实现springboot项目中的缓存功能
42 1
|
29天前
|
缓存 NoSQL 数据库
[Redis]——数据一致性,先操作数据库,还是先更新缓存?
[Redis]——数据一致性,先操作数据库,还是先更新缓存?
|
30天前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
C#/.NET/.NET Core拾遗补漏合集(持续更新)
|
1月前
|
缓存 NoSQL Java
【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存
【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存
31 0