ASP.NET Core 使用 Redis 实现分布式缓存:Docker、IdistributedCache、StackExchangeRedis
前提:一台 Linux 服务器、已安装 Docker。
一,Docker 中运行 Redis
拉取 Redis 镜像
docker pull redis
查询镜像列表
docker imgaes
①运行并且设置 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
二,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 是你自定义的实例名称,创建缓存时会以此名称开头。
这样就配置好了。
使用缓存
注入缓存服务
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,Data = "key=" + key + " value=" + value }); }
在 URL 添加 QueryString 可以设置缓存内容,如果没有带参数的话,就使用默认的值。
打开 https://localhost:5001/api/values/set 可以看到设置了默认值。
或者访问 https://localhost:5001/api/values/set?setkey=key11111&setvalue=asafesfdsreg
自定义设置缓存值。
打开 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,Data = "key=" + key + " value=" + value }); }
缓存 20 秒,20秒过后此缓存将被清除。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。