我们可以使用redis的list作为数据类型,使用RPush生产消息,LPOP消费信息,其数据结构,和队列是一样的,先进先出。
案例如下:当没有队列消息的时候,就自然的return nil了。
这样写的缺点是:没有等待队列里有值就直接消费。
而对这个缺点的弥补就是:可以通过在service层引入sleep机制去调用lpop去重试,并且不用sleep,也有另外一种解决措施:使用blpop + 阻塞seconds,使用后立刻进入阻塞状态,直到队列里被注入值,但这个缺点就是只能供一个消费者消费。
除此之外,我们也可以被多个消费者消费队列里的内容。
那就是使用redis的pub/sub主题订阅者模式, 产生一对多的消费模式。
那么,什么是pub/sub的主题订阅模式呢?
- 发送者(pub)发送消息,订阅者(sub)接收消息。
- 订阅者可以订阅任意数量的频道。
接下来演示一下:
但是即使是这种情况下,也是有缺点的,因为消息的发布是无状态的,所以无法保证可达。
换句话说,如果在接收消息的时候,突然下线,重新上线的时候,是无法获得原来应该得到的消息的,如果要是想得到之前的消息,就不能单纯使用redis了,要使用专业的消息队列工具,如RabbitMq,Kafka。