关于 redis 的 RPOPLPUSH 实现安全队列

2017-02-20 15:01:15 +08:00
 hellomsg
具体是从 http://redisdoc.com/list/rpoplpush.html 看到的。
最后提到一句:“最后,还可以添加一个客户端专门用于监视备份表,它自动地将超过一定处理时限的消息重新放入队列中去(负责处理该消息的客户端可能已经崩溃),这样就不会丢失任何消息了。”
不太明白“超过一定处理时限的消息”是如何判断的。
这个时限是指从 rpoplpush 开始(表示开始处理)到当前的时间差?还是插入第一个列表到当前的时间差。我觉得应该是前者。如果按照前者,那这个时间差应该如何记录? rpoplpush 是原子的, list 元素也没有时间属性,只能再创建一个结构存储这个时间吗?
3779 次点击
所在节点    Redis
6 条回复
hellomsg
2017-02-20 15:06:25 +08:00
在 rpoplpush 之前使用 lset ,更新一遍世间戳?
holyghost
2017-02-20 15:08:42 +08:00
redis 是个缓存呀,拿来当低配版队列可以理解,但需要可靠的队列的时候,为什么不用 RabbitMQ ?
hellomsg
2017-02-20 15:29:33 +08:00
@holyghost 嗯,只是一不小心看到这了,就试着用一下。
penjianfeng
2017-02-20 16:39:21 +08:00
前段时间也看到这儿,正好可以回答下,
意思是说,理论上来说,你队列中的某个 item 操作完了的时候 会删除 lpush 进的队列的数据,但是万一没有完成或者超时或者突然程序挂掉了呢?所以你需要另外一个操作,间隔一段时间读取下 lpush 进的那个队列,然后查看这些操作是否已经完成,如果完成,干掉,没完成,要不重新放入队列要不...看你业务咯
penjianfeng
2017-02-20 16:40:49 +08:00
接上,这个时间你可以存储在你的 node 中,比如说队列的这个 key 对应一个 hash,那么这个 hash 可以存储一个叫做 last_op 的时间戳,然后你的那个客户端判断时读取这个值
zxp111
2017-04-27 12:13:05 +08:00
关于安全对列方面,我公司有更好的方法。我们公司研发了一个国产的高性能数据库 haisql_memcache,比 Redis 和 memcached 更快,比 Memcached 更多功能,支持事务,支持微线程,支持 pipeling,支持数据日志,支持掉电保护的高性能 KV 数据库,具有高并发性,性能非常快,查询性能比 memcache 快 64%,比 Redis 单核性能快,兼容 memcached 指令集,包括返回的内容和错误提示均一致,可作为一个特殊版本的服务器直接与 memcached 客户端连接。下载地址:

http://www.haisql.net/fwzc/soft/ 可免费试用。

我们使用了先进的 stackless 微线程架构用于数据处理,同时 haisql_memcache 支持日志功能,当服务器突然断电时造成的损失,意外关闭造成的损失,只要存在数据日志,就可以通过利用它来恢复数据,轻松排除数据库故障.在系统崩溃 /故障等情况下,可以保证数据库的一致性,从而提高了数据库的可靠性。

产品的服务器的并发数量理论上只受限于内存的数量,因此在内存足够的情况下,可以达到并发数量无上限。

Haisql_memcache 目前的集群方案是利用客户端 Hash,今后有更好的集群方案。客户端做了一次哈希,可以增加大量 haisql_memecache 到集群中。

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

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

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

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

© 2021 V2EX