Redis做消息队列,有两种实现方式:
第一种:通过数据结构List来实现
优点:能够实现持久化;支持集群;接口使用简单
缺点:
- 如上图所示,一条消息只会被一个消费者消费,所以不存在有多个消费者消费一条消息
- 生产者和消费者的高可用或崩溃后的处理机制需要自己实现
- 当生产者消息写入太快,消费者消费太慢,则有可能会导致内存溢出问题,导致进程crash
第二种:通过pub/sub来实现
优点:
一个生产者可以对应多个消费者,但是必须保证消息发布者和消息的订阅者同时在线,否则,否则一旦消息订阅者由于各种异常情况而被迫断开连接,在其重新连接后,其离线期间的消息是无法被重新通知的(即发即弃)。当然,生产者不需要关心有多少的订阅者,也不用关心订阅者的具体信息,而订阅者可以根据需要自由选择订阅哪些频道:支持集群;接口使用简单等。
缺点:
- 没有持久化机制,属于即发即弃模式,因此也不需要制定消息的备份和恢复机制
- Redis没有提供保证pub/sub消息性能的方案
- 当大量的消息到达Redis服务时,如果订阅者不能及时完成消费,则就会导致消息堆积,引发上面一样的内存问题