介绍
上一遍我们讲了如何用amqp来实现延迟队列。这一篇我们将讲述mechinery是如何基于redis来实现消息队列的。
redis实现消息队列
发送消息
如下图,machinery用rpush来实现发送消息
接收消息
如下图,machinery用BLPOP来实现接收消息。BLPOP是阻塞式列表的弹出原语。它是命令 [LPOP]的阻塞版本,这是因为当给定列表内没有任何元素可供弹出的时候,连接将被 [BLPOP]命令阻塞。
小结
redis实现延迟队列
发送消息
如下图,machinery用ZADD将消息放入到指定的延迟队列中。
接收消息
如下图,machinery用事务来接收延迟消息。具体过程如下:
- WATCH key,监视延队列
- ZRANGEBYSCORE key 0 now LIMIT 0 1,按过期时间从小到达排序,获取过期时间小于当前时间的第一条数据
- MULTI,事务开始
- ZREM key items[0],删除消息(如果有数据变化,事务执行失败)
- EXEC,事务执行结束
- 如果事务执行成功,执行UNWATCH,刷新被监视的key
- 如果事务执行失败,执行DISCARD,放弃执行操作
小结
redis基于有序列表来实现延迟队列。定时轮训获取过期的消息。