redis的过期键消息通知
发布于 2 年前 作者 wang-weifeng 3391 次浏览 来自 问答

最近做项目我也用到了redis的过期键消息通知,条件是这样的,用户扫码输入信息后,1分钟开始指导用户做另一个事,然后在过2分钟出一个结果,结束后,另一个用户继续填写,继续这种操作,同时同一时刻也会有很多个这个用户扫码完成这个任务,接着下一组,我的涉及就是用户填写信息后设置一个1分钟过期键,然后在设置一个3分钟的过期键去处理。 关键有一个问题就是,测试2000组,遇到了大概3次过期键丢失的现象。有没有更好的方案去解决

10 回复

关注一下 我以前在业务上也有几次准备用key过期通知,就是怕丢失(实际没测过)。后来放弃了

@imhered 因为开发任务比较紧,所以想到这个当时也怕会丢失,实际使用的时候确实丢失了,所以就想问问社区有没有更好的解决方案

@wang-weifeng 其实我觉得吧,node做异步分片做的好,时间差不会太大,用setTimeout也没什么问题

@zy445566

用setTimeout问题可大了,少量的延迟任务(几十个)没问题,但是一旦上百上千上万个延迟任务,那问题可就大了。

任务不能持久化,一旦进程崩溃,任务全部丢失,以及多进程下的问题,还有时间误差大的问题。

比较好的肯定是用redis,分布式,多进程,持久化都能够很好的支持。

再不济单进程也是使用一些数据模型来实现定时,比如timer-whell

来自酷炫的 CNodeMD

@axetroy

用户扫码输入信息后,1分钟开始指导用户做另一个事,然后在过2分钟出一个结果,结束后,另一个用户继续填写,继续这种操作,同时同一时刻也会有很多个这个用户扫码完成这个任务,接着下一组

在种需求下,每个用户就最多就两个setTimeout,针对同一时刻会有很多用户,我觉得10W用户扛一个实例就相当相当不错了,顶天20W压栈。压力就算略大,伸缩10个实例,应该问题也不是很大。 瞬时超过100W+单redis也没吊用,集群不大的话,就算扛了并发,消费都要好一会。 题外话:不是说node的web应用的瓶颈一定就是CPU运算,有的时候数据交换也会把网卡给堵死。

来自酷炫的 CNodeMD

@wang-weifeng redis的键消息通知采用的是发布即忘的策略,node单个实例有可能出现断线的情况,可以通过多个实例来提高可靠,但只需要一个实例来处理,这里的话考虑加锁或者算法。加锁可以考虑 ioredis-lock

@fightAndLearn 谢谢,我来看一下

LZ说的键到期通知丢失可能是因为Redis内存使用超过设置的maxmemory,那个键还没过期就直接被redis的近似LRU算法踢掉了,所以就没有到期通知了

@nullcc 根据的提示,我看了一下,ADCE271044123AF7F06505CD2D0F02A1.jpg 然后我看这边的信息是不是Redis 的内存消耗峰值大于了由 Redis 分配器分配的内存总量,造成了这个问题

可以用阿里云的 MQ 啊,发送定时消息。

回到顶部