如何使用Redis做异步队列
使用List作为队列,RPUSH生产消息,LPOP消费消息
rpush testlist aaa
(integer) 1
rpush testlist bbb
(integer) 2
rpush testlist ccc
(integer) 3
lpop testlist //弹出队列
"aaa"
lpop testlist
"ccc"
- 缺点:没有等待队列里有值就直接消费
- 弥补:可以通过在应用层引入Sleep机制去调用LPOP重试
BLPOP key [key …] timeout:阻塞直到队列有消息或者超时
开启两个客户端模拟消费者和生产者
session1
lpop testlist
(nil)
blpop testlist 30 //在30秒内接受到数据并返回
(1) "testlist"
(2) "aaa"
(12.09s)
session2
rpush testlist aaa
(integer) 1
- 缺点:只能供一个消费者消费
pub/sub:主题订阅者模式
可以实现一对多的消费订阅
- 发送者(pub)发送消息,订阅者(sub)接收消息
- 订阅者可以订阅任意数量的频道
session1
subscribe myTopic //来订阅myTopic
Reading messages... (press Ctrl-C to quit)
(1) "subscibe"
(2) "myTopic"
(3) (integer) 1
session2
subscribe myTopic//订阅同样的频道
Reading message... (press Ctr-C to qiit)
(1) "subscribe"
(2) "myTopic"
(3) (integer) 1
session3
subscribe anotherTopic
Reading messages...
(press Ctrl-C to quit)
(1) "subscribe"
(2) "anotherTopic"
(3) (integer) 1
session4
publish myTopic "Hello" //使得有两个监听了该频道的客户端自动收到信息
(integer) 2
publish myTopic "I love you" //使得有两个监听了该频道的客户端自动收到信息
(integer) 2
publish anotherTopic "hi" //那一个收到消息
(integer) 1
pub/sub的缺点
消息的发布是无状态的,无法保证可达
可以使用kafka解决