Redis 实现消息队列

1、使用List实现

使用LPUSH(RPUSH)入队,然后使用BRPOP(BLPOP)出队。

存在的问题:

  1. 空闲连接的问题:如果线程一直阻塞在那里,Redis客户端的连接就成了闲置连接,闲置过久,服务器一般会主动断开连接,减少闲置资源占用,这个时候BRPOP和BLPOP或抛出异常。
  2. 不能重复消费
  3. 没有广播模式(同一个消息,多个消费者同时消费)
  4. 无消息确认机制

2、使用发布与订阅实现

存在的问题:

  1. 消费者必须先订阅队列,生产者才能发布消息,否则消息会丢失。
  2. 发布时若客户端不在线,则消息会丢失,不能寻回。
  3. 若消费者客户端出现消息积压,到达一定程度后会被强制断开,导致消息丢失。
  4. 消息不能持久化
  5. 无消息确认机制

3、使用Stream实现

Steam 是 Redis 5.0 新增加的数据结构,主要用于实现消息队列功能。

4、总结

  1. 虽然使用 List、发布订阅和 Stream 都可以实现MQ,但是只有Stream 才是相对完善的。
  2. Redis 的主要应用场景其实是用做缓存、实现高并发、高性能的目的,而 Redis 是纯内存操作,并不适合海量的MQ使用场景,当消息积压时,会占用机器资源,导致主业务受到影响,并且也会有消息丢失的风险。一般在开发中我们都推荐单一职责原则,所以不是很建议使用(当然业务场景简单、写入量不大的情况下无所谓了)。
posted @ 2022-06-16 22:36  weidadong  阅读(368)  评论(0)    收藏  举报