redis来做消息队列是用list数据类型。
rpush->在list的right面插入数据,
lpop->在list的left面弹出数据,
简单完成生产者和消费者这样的关系。
那这时候就个问题,lpop不会等待队列里有值的时候才消费。解决办法有两个。
第一个:在代码里写sleep,过段时间就lpop试试。
第二个:blpop方法。30秒以内有数据则pop出来,没数据就返回nil。
blpop.png
那这时候还有问题,生产者和消费者是一对一的关系,如何让生产者的消息供多个消费者消费呢?
用redis的主题订阅者模式:pub/sub。
订阅者(消费者)可以订阅(消费)任意数量的频道
subscribe.png
好,一对多的消息实现之后,那么其实这种实现还是缺点的。
pub/sub是无状态的,就是不知道是不是一定到达。对于发送者来说,消息发了就再也找不到了。
具体体现在哪儿呢?比如一个生产者发送消息的时候,某一个应该接收消息的消费者下线了,那么当消费者上线之后,是收不到那条消息的。
这时候怎么办?来专门的消息队列解决了。
rabbit MQ呀等等。