有一个 Redis 通知的问题想问一下大家

2022-07-11 20:05:20 +08:00
 JoseGuo
最近需要做一个订单超时未支付自动取消的功能
研究一下方案后,暂时决定用监听 Redis 失效 Key 来实现
简单测试了一下可以用,但有一个小问题
网络搜的实现过程 第一步大部分都是打开 redis.conf 里的键事件的通知
即这样设置 notify-keyspace-events Ex
但是我没按这个来 默认的设置没改动 仍然可用
即 notify-keyspace-events ""
有没有大佬可以解释一下这种情况
感谢
5627 次点击
所在节点    Redis
57 条回复
bthulu
2022-07-12 08:06:38 +08:00
@RedBeanIce 你傻啊, 这是订单支付超时, 要精确到秒的, 你每秒扫一次库吗?
NewExist
2022-07-12 08:20:17 +08:00
可以使用 redis 的消息队列。对于小项目升级成本不大
micean
2022-07-12 08:21:54 +08:00
单体小项目为什么还要花精力去维护 mq ?
hoopan
2022-07-12 08:40:22 +08:00
传统做法就是 crontab 定期执行脚本扫表,如果业务量不大可以这样做。
建议是消息队列,用处多多,以后扩展也方便。消息队列有各类实现方法,redis 也能搞消息队列。
xaplux
2022-07-12 08:44:24 +08:00
单体应用,使用延迟队列实现就行,java 可以使用 DelayQueue ,然后每次重启服务,再从把表中未支付订单数据重新加载到延迟队列就行了
cxshun
2022-07-12 08:49:07 +08:00
redis 的失效是延时的,它是依赖定时器和主动获取的时候判断的,不要依赖它来做业务,除非你不需要实时。

这种直接用延时队列就好了,RocketMQ 也有,或者自己用定时任务来处理。
zr8657
2022-07-12 08:58:49 +08:00
建议上个 mq ,熟练了也就半个小时的事,小规模一个单体 mq 就够了,基本也不用维护
philchang1995
2022-07-12 09:02:29 +08:00
前面好几个人已经说过了 redis 的 key 过期机制用来做这种订单超时未支付自动取消的业务不太合适,刚好前几天看到一篇文章有对比实现这种业务的几种方法的优劣,你可以参考一下。https://mp.weixin.qq.com/s/TBOvb2BKdJUii-XDR50_YQ
JoseGuo
2022-07-12 09:05:12 +08:00
@RedBeanIce 同意
JoseGuo
2022-07-12 09:22:27 +08:00
@philchang1995 我看一下 谢谢
JoseGuo
2022-07-12 09:22:50 +08:00
@zr8657 不太考虑上 小项目增加维护成本了
JoseGuo
2022-07-12 09:23:12 +08:00
@cxshun 明白了
boks
2022-07-12 09:23:22 +08:00
我之前的做法是使用 redis 的有序集合,把过期时间存在 score 里,每秒查一次 score <= 当前时间戳 的数据
JoseGuo
2022-07-12 09:24:43 +08:00
@xaplux
@boks 嗯 这个我昨天也试过了 比监听 key 失效靠谱一些
awalkingman
2022-07-12 09:26:50 +08:00
楼上说维护的应该都是老手了。自己搞 demo 可以多尝试一些新技术新东西。生产如果量级不是很大,还是推荐扫表,越简单越好维护,越好调试和排查问题。
开发只是需要几天,维护是没有尽头的。
tusj
2022-07-12 09:49:11 +08:00
就查订单展示的时候,判断一下状态 + 时间不就好了吗?为啥要引入 redis ?
oppoic
2022-07-12 09:49:16 +08:00
定时扫库不行,即便到下一次扫库间隔只有一分钟,用户端也无法接受这么长的延迟
redis 自动过期更不行,redis 过期自动删除 key 实现的没那么严谨,网上有文章分析过这个

“订单到时未支付,自动取消” 这是一个经典面试题,我提供几个不一样的思路:
1 )插入订单表的时候,就有个未支付关闭时间(比如下单时间后的 15 分钟,这个做成可配置的)
2 )用户端一般可以看到 “未支付倒计时”,倒计时结束了,发请求让服务端关订单(服务端做些验证)
qinxi
2022-07-12 09:49:42 +08:00
@bthulu #21 冷知识. 你可以把 now+1min 时间前需要处理的都扫出来, 已经过期的直接处理, 未来 1 分钟内过期的你可以放队列延时处理 比如 netty 的 HashedWheelTimer
qinxi
2022-07-12 09:50:54 +08:00
@oppoic #37 订单关闭靠用户端? 用户端不在线时库存返还不要了?
so1n
2022-07-12 10:00:57 +08:00
公众号看多了把...哪些说监听 key 过期的都是没生产经验的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/865511

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX