参考https://zhuanlan.zhihu.com/p/370366154

Redis配置说明

Redis中默认的notify-keyspace-events的配置值为空。
notify-keyspace-events 的参数可以是以下字符的任意组合,它指定了服务器该发送哪些类型的通知:
字符 发送的通知
K 键空间通知,所有通知以keyspace@ 为前缀
E 键事件通知,所有通知以 keyevent@ 为前缀
g DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知
$ 字符串命令的通知
l 列表命令的通知
s 集合命令的通知
h 哈希命令的通知
z 有序集合命令的通知
x 过期事件,每当有过期键被删除时发送
e 驱逐事件,每当有键因为maxmemory政策而被删除时发送
A 参数 g$lshzxe 的别名

redis.windows-service.conf配置

找到redis安装目录下的redis.windows-service.conf配置文件,用记事本打开,找到notify-keyspace-events,并配置为notify-keyspace-events Ex
![5XK(]XKC]HGN77Y4LP}7YB.png

创建项目

打开Visual Studio 2019,新建两个项目,分别为:RedisCoreDemo.App,RedisCoreDemo.WebApi
其中RedisCoreDemo.App是一个.NET Core的控制台应用程序,我们将使用这个项目来订阅Redis的回调并执行相应的回调操作。
RedisCoreDemo.WebApi是一个http://ASP.NET Core 3.1的Web应用程序,我们将使用这个项目来向Redis发送数据,解决方案结构如下图:
Z@1OPT8M10X78ELTFWMAKGP.png

发布消息

接下来打开项目RedisCoreDemo.WebApi的包管理工具,并安装Redis相应的工具包:

  • Microsoft.Extensions.Caching.Redis
  • Microsoft.Extensions.Caching.StackExchangeRedis

如下图:
909CZK%TP4M_~{ZOZ5%F@EX.png
再打开Startup.cs启动文件,添加Redis的缓存服务,如下:

  1. services.AddDistributedRedisCache(option =>
  2. {
  3. option.Configuration = Configuration["RedisCache:ConnectionString"];
  4. });

打开appsettings.json配置文件,添加Redis缓存的配置节点,如下:

  1. {
  2. "Logging": {
  3. "LogLevel": {
  4. "Default": "Information",
  5. "Microsoft": "Warning",
  6. "Microsoft.Hosting.Lifetime": "Information"
  7. }
  8. },
  9. "AllowedHosts": "*",
  10. "RedisCache": {
  11. "ConnectionString": "127.0.0.1:6379,password=123,defaultDatabase=2"
  12. }
  13. }

说明,redis连接本配置里设置了默认连接数据库为2(defaultDatabase=2),在

最后,我们在Controllers目录下创建一个名为DemoController的控制器,并添加一个Set()的操作,如下:

  1. using Microsoft.AspNetCore.Mvc;
  2. using Microsoft.Extensions.Caching.Distributed;
  3. using Microsoft.Extensions.Logging;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Threading.Tasks;
  8. namespace RedisCoreDemo.WebApi.Controllers
  9. {
  10. [ApiController]
  11. [Route("[controller]/[action]")]
  12. public class DemoController : ControllerBase
  13. {
  14. private readonly IDistributedCache _distributedCache;
  15. public DemoController(ILogger<DemoController> logger, IDistributedCache distributedCache)
  16. {
  17. _distributedCache = distributedCache;
  18. }
  19. [HttpGet("{id}")]
  20. public async Task<IActionResult> Set(int id)
  21. {
  22. await _distributedCache.SetStringAsync($"order_{id}"
  23. , id.ToString()
  24. , new DistributedCacheEntryOptions
  25. {
  26. AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10)
  27. });
  28. return Ok("success");
  29. }
  30. }
  31. }

其中,最核心的代码为:

  1. await _distributedCache.SetStringAsync($"order_{id}"
  2. , id.ToString()
  3. , new DistributedCacheEntryOptions
  4. {
  5. AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10)
  6. });

这一条语句是使用C#/.NET Core向Redis中写入缓存数据,Redis的键名为order_+订单ID。当然,为了测试方便,这个订单ID是直接从URL参数指定的。SetStringAsync()方法的第三个参数指定了一个DistributedCacheEntryOptions实例对象,并设置了AbsoluteExpiration属性为当前时间+5秒,这尤其重要,它表示设置当前的这条Redis缓存数据在写入5秒后过期。
后续测试的时候,我们通过调用这个api,我们便可向Redis中写入缓存数据。
到此,测试用的基于.NET Core 3.1的Web API和Redis的消息发布项目就完成了。接下来,我们继续实现消息订阅客户端RedisCoreDemo.App

订阅消息并处理回调

回到之前我们创建的控制台应该程序RedisCoreDemo.App,我们使用这个程序来订阅Redis的过期数据,接收并处理回调。
首先,在RedisCoreDemo.App中打开包管理工具并添加Redis工具包StackExchange.Redis
打开Program.cs文件,编写Redis的订阅事件和回调方法,如下:

  1. using StackExchange.Redis;
  2. using System;
  3. namespace RedisCoreDemo.App
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. //键事件通知,所有通知以 __keyevent@<db>__ 为前缀
  10. var EXPIRED_KEYS_CHANNEL = "__keyevent@2__:expired";
  11. //redis数据库连接的数据库与发布的数据库保持一致
  12. var host = "127.0.0.1:6379,password=123,defaultDatabase=2";
  13. var connection = ConnectionMultiplexer.Connect(host);
  14. ISubscriber subscriber = connection.GetSubscriber();
  15. subscriber.Subscribe(EXPIRED_KEYS_CHANNEL, (channel, key) =>
  16. {
  17. Console.WriteLine($"EXPIRED: {key}");
  18. }
  19. );
  20. Console.WriteLine("Listening for events...");
  21. Console.ReadKey();
  22. }
  23. }
  24. }

好了,到此我们的Redis订阅客户端测试项目也完成了。
同时运行RedisCoreDemo.App,RedisCoreDemo.WebApi这两个项目,可以先编译好RedisCoreDemo.App,先运行RedisCoreDemo.App.
$IE~R)HJND}N(J8FZ@Q1GAA.png
再运行RedisCoreDemo.WebApi,在浏览器器里分别输入
https://localhost:44334/Demo/Set/1
https://localhost:44334/Demo/Set/12
等待下,在RedisCoreDemo.App的控制台就会出现过期后的回调处理信息
![CO3O6TPE{FJ)NM9DR3W__B.png