Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value内存数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
实现消息队列的几种方案。
1. 基于List的 LPUSH+BRPOP 的实现
lpush+lpop=Stack(栈)
lpush+rpop=Queue(队列)
lpush+ltrim=Capped Collection(有限集合)
lpush+brpop=Message Queue(消息队列) lpush rpop :非阻塞式
lpush brpop :阻塞式 (具体看下面的例子)
我们先往队列testmq插入一个字符:
本地:0>lpush testmq a
"1"然后我们在另外一个客户端操作brpop:
192.168.0.210:6379> blpop testmq 20
1) "testmq"
2) "a" 这个时候testmq里面已经没有数据了,我们继续操作上面过程:
192.168.0.210:6379> blpop testmq 100
发现这个时候已经阻塞在这里等待队列插入数据(后面的100是指100秒后队列依旧没有值就直接自动结束)
如果在100秒内,我们往队列插数据,使用第一个客户端:
本地:0>lpush testmq b
"1"插入成功后,在阻塞的客户端那边立即自动读取到新插入的值:
192.168.0.210:6379> blpop testmq 100
1) "testmq"
2) "b"
(46.58s) 2. PUB/SUB,订阅/发布模式
发布和订阅是进程间的一种消息通信模式:发送者(publisher)将消息发送给一个第三方,订阅者(subscriber)从第三方那里接收消息。
结构模型图如下:
涉及到的命令:
subscribe c1 c2 c3 ...:订阅 c1,c2,c3,…等频道。psubscribe new*:订阅前缀为new的频道。publish channel message:向 channel 频道发送 message 消息。
输入完 subscribe c1 c2 c3 之后,客户端就进入等待状态,等待订阅的频道向自己发送消息
发布订阅模型是所有的订阅者都能收到消息
优点
- 典型的广播模式,一个消息可以发布到多个消费者
- 多信道订阅,消费者可以同时订阅多个信道,从而接收多类消息
- 消息即时发送,消息不用等待消费者读取,消费者会自动接收到信道发布的消息
缺点
- 消息一旦发布,不能接收。换句话就是发布时若客户端不在线,则消息丢失,不能寻回
- 不能保证每个消费者接收的时间是一致的
- 若消费者客户端出现消息积压,到一定程度,会被强制断开,导致消息意外丢失。通常发生在消息的生产远大于消费速度时可见,Pub/Sub 模式不适合做消息存储,消息积压类的业务,而是擅长处理广播,即时通讯,即时反馈的业务。
3. 基于Sorted-Set的实现
4. 基于Stream类型的实现
参考文章: