1. Redis实现消息队列有两种方式
Redis能做消息队列得益于他list对象blpop/brpop接口以及Pub/Sub(发布/订阅)的某些接口。他们都是阻塞版的,所以Redis实现消息队列有两种方式:
- 通过数据结构list来实现
- 通过pub/sub来实现
另外redis存放的数据都只能是string类型,所以在任务传递的时候只能是传递字符串。我们可以将消息在发布者序列化成json格式的字符串,然后消费者那边再转换一下即可。
2. 通过数据结构list来实现
2.1 实现机制
消息接收:
redis> brpop tasklist 0
“im task 01”
这个例子使用blpop命令会阻塞方式地从tasklist列表中取头一个数据,最后一个参数就是等待超时的时间。如果设置为0则表示无限等待。
消息发送:
redis> lpush tasklist ‘im task 01’
redis> lpush tasklist ‘im task 02’
2.2 优点
- 能够实现持久化
采用 Master-Slave 数据复制模式。队列操作都是写操作,Master任务繁重,能让Slave分担的持久化工作,就不要Master做。RDB和AOF两种方法都用上,多重保险。 - 支持集群
- 接口使用简单
2.3 不足
- Redis上消息只会被一个消费者消费,不会有多个订阅者消费同一个消息,简单一对一