我们可以使用redis的list作为数据类型,使用RPush生产消息,LPOP消费信息,其数据结构,和队列是一样的,先进先出。

案例如下:当没有队列消息的时候,就自然的return nil了。
剑指Offer(redis)——如何使用redis实现异步队列
这样写的缺点是:没有等待队列里有值就直接消费。
而对这个缺点的弥补就是:可以通过在service层引入sleep机制去调用lpop去重试,并且不用sleep,也有另外一种解决措施:使用blpop + 阻塞seconds,使用后立刻进入阻塞状态,直到队列里被注入值,但这个缺点就是只能供一个消费者消费

剑指Offer(redis)——如何使用redis实现异步队列

除此之外,我们也可以被多个消费者消费队列里的内容。

那就是使用redis的pub/sub主题订阅者模式, 产生一对多的消费模式。

那么,什么是pub/sub的主题订阅模式呢?

  • 发送者(pub)发送消息,订阅者(sub)接收消息。
  • 订阅者可以订阅任意数量的频道。

剑指Offer(redis)——如何使用redis实现异步队列
接下来演示一下:

剑指Offer(redis)——如何使用redis实现异步队列

但是即使是这种情况下,也是有缺点的,因为消息的发布是无状态的,所以无法保证可达。

换句话说,如果在接收消息的时候,突然下线,重新上线的时候,是无法获得原来应该得到的消息的,如果要是想得到之前的消息,就不能单纯使用redis了,要使用专业的消息队列工具,如RabbitMq,Kafka。

剑指Offer(redis)——如何使用redis实现异步队列

相关文章: