架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 14196|回复: 6

[资料] .NET 使用 Redis 缓存之过期通知

[复制链接]
发表于 2020-8-22 10:34:59 | 显示全部楼层 |阅读模式
在执行某些定时操作的时候,我们需要一个结果的反馈。例如:订单过期自动删除、订单几天后自动好评、未支付订单15分钟后关闭等等,这些都可以使用一些定时任务的框架或轮询的方式来完成需求。本文使用 Redis 高级特性缓存过期事件通知机制,结合 .NET/C# 代码来完成业务需求。

引言

使用场景:1.支付业务中,未支付订单自动关闭 2.缓存过期提醒

一般情况下,对于未支付订单自动关闭的处理中,我们可以使用定时服务来实现,比如每分钟调用一次接口来处理未支付并且已经过期的订单,但是这样的话,一是会比较损耗计算机性能,即使没有订单的时候也会每分钟进行处理,二是订单处理时间的精确度最大延迟会是 59s ,而且也要保证定时服务一直可用

那我们想只针对当有未支付并过期的订单并且低延迟处理要怎么办呢,我们可以通过 redis 的缓存过期机制来进行订阅推送处理。

Redis 订阅

修改配置文件redis.conf中的:notify-keyspace-events Ex

为了节约cup资源,事件通知默认是没有开启的,默认为notify-keyspace-events ""

# K    键空间通知,以__keyspace@<db>__为前缀
# E    键事件通知,以__keysevent@<db>__为前缀
# g    del , expipre , rename 等类型无关的通用命令的通知, ...
# $    String命令
# l    List命令
# s    Set命令
# h    Hash命令
# z    有序集合命令
# x    过期事件(每次key过期时生成)
# e    驱逐事件(当key在内存满了被清除时生成)
# A    g$lshzxe的别名,因此”AKE”意味着所有的事件


notify-keyspace-events "kx" 表示想监控某个 key 的失效事件。将参数设为字符串 AKE 表示发送所有类型的通知。

我本机把redis安装成了服务,修改 redis.windows.conf 配置文件,需要重启redis服务配置才能生效。

.NET/C# 代码示例

封装如下:



调用



我们通过redis-cli来随便写入一个缓存试一下。



ca3895e0-c6de-4d7a-9c8d-394b44c333d8.jpg

其实也可以通过redis-cli执行如下命令订阅缓存过期通知:




当有N个客户端订阅缓存过期事件通知的时候,redis会把同一条过期消息通知给N个用户,并不会只通知其中一个客户端,如下图:

a378914d-4369-401a-aa7a-c89134cb9292.jpg

c#源代码下载:

https://down.itsvse.com/item/17856.html

总结

Redis pub/sub 是一种并不可靠的消息机制,他不会做信息的存储,只是在线转发,肯定也没有 ack 确认机制,另外只有订阅段监听才会转发,所以 Keyspace Notifications 也是不可靠的通知系统,如果我们的业务是需要很好的可靠性,那么这还重方式就不是最好的选择。一般我们更加推荐 RabbitMQ 的 DLX(Dead-Letter-Exchange) 来实现,也就是延迟队列功能。只不过 redis 的这种方案更加容易实现,操作成本较低。对于可靠性要求不高的业务还是很方便。




上一篇:.NET Core 3.1 安装中文智能提示
下一篇:.NET 获取不到完整的引用 Assembly 程序集
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2020-8-29 14:33:18 | 显示全部楼层
学习学习
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-11-30 13:16:47 | 显示全部楼层
学习一下
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-11-30 13:21:02 | 显示全部楼层
Redis pub/sub 是一种并不可靠的消息机制,他不会做信息的存储,只是在线转发,肯定也没有 ack 确认机制,另外只有订阅段监听才会转发,所以 Keyspace Notifications 也是不可靠的通知系统,如果我们的业务是需要很好的可靠性,那么这还重方式就不是最好的选择。一般我们更加推荐 RabbitMQ 的 DLX(Dead-Letter-Exchange) 来实现,也就是延迟队列功能。只不过 redis 的这种方案更加容易实现,操作成本较低。对于可靠性要求不高的业务还是很方便。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2022-2-14 17:42:43 | 显示全部楼层
看看,学习
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2022-3-2 15:25:00 | 显示全部楼层
学习一下
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2022-7-27 16:40:13 | 显示全部楼层
学习学习
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-19 09:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表