Redis 实现消息队列
1、使用List实现
使用LPUSH(RPUSH)
入队,然后使用BRPOP(BLPOP)
出队。
存在的问题:
- 空闲连接的问题:如果线程一直阻塞在那里,Redis客户端的连接就成了闲置连接,闲置过久,服务器一般会主动断开连接,减少闲置资源占用,这个时候BRPOP和BLPOP或抛出异常。
- 不能重复消费
- 没有广播模式(同一个消息,多个消费者同时消费)
- 无消息确认机制
2、使用发布与订阅实现
存在的问题:
- 消费者必须先订阅队列,生产者才能发布消息,否则消息会丢失。
- 发布时若客户端不在线,则消息会丢失,不能寻回。
- 若消费者客户端出现消息积压,到达一定程度后会被强制断开,导致消息丢失。
- 消息不能持久化
- 无消息确认机制
3、使用Stream实现
Steam 是 Redis 5.0 新增加的数据结构,主要用于实现消息队列功能。
4、总结
- 虽然使用 List、发布订阅和 Stream 都可以实现MQ,但是只有Stream 才是相对完善的。
- Redis 的主要应用场景其实是用做缓存、实现高并发、高性能的目的,而 Redis 是纯内存操作,并不适合海量的MQ使用场景,当消息积压时,会占用机器资源,导致主业务受到影响,并且也会有消息丢失的风险。一般在开发中我们都推荐单一职责原则,所以不是很建议使用(当然业务场景简单、写入量不大的情况下无所谓了)。