对于redis 命令 rpoplpush的疑问

相比lpop,这个命令主要防止消息丢失的。如果lpop一个队列,然后客户端崩溃了,这时候这个消息就丢失了。

官方的描述:

可以添加一个客户端专门用于监视备份表,它自动地将超过一定处理时限的消息重新放入队列中去(负责处理该消息的客户端可能已经崩溃),这样就不会丢失任何消息了。

那么,怎样判断超过一定时限的消息?

我目前是这样做的。

1、rpoplpush 队列,比如从A导出,备份到B。
2、将得到的队列zadd到一个有序集合zset里面。
3、队列完成,使用命令lrem将队列移除出备份队列B。

如果进行到1步骤,没有进行到2步骤,那就说明这个队列丢失了。
所以我只需要定期查询B里面的队列,是否存在zset里面就行了。

貌似没问题。但假如我的检测程序运行在1和2步骤之间,那么就存在误判了。

避免这种情况,最好就是官方的描述:“超过一定处理时限的消息重新放入队列中”,比如一个队列,弹出来10秒之后再检测就不会出现这种情况,那么如何判断时间呢?

阅读 3.1k
2 个回答

自己找到答案了。另外维护一个zset。把备份队列B的队列先放入另外一个zset,隔15秒检查一次。

可以了解下 beantalked

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏