redis队列
# 一、redis队列? redis的发布订阅模式 发送者 (pub) 发送消息,订阅者 (sub) 接收消息。Redis 客户端可以订阅任意数量的频道。 Redis的发布订阅模式本质和传统的MQ的发布订阅类似,但是相对于其它几款MQ产品来说, redis的使用更加便捷,也更加轻量化,不需要单独去搭建集成一套繁重的MQ框架。 但缺点也很明显,redis发布的消息不会持久化,所以当某一台服务器出现问题的时候, 这个消息会丢失,所以在考虑使用之前要慎重,当前的业务是否对数据一致性要求很高,如果要求很高,还是建议使用MQ产品。
介绍redis命令:
SUBSCRIBE,用于订阅信道
PUBLISH,向信道发送消息
UNSUBSCRIBE,取消订阅 用于退订给定的一个或多个频道的信息。 语法: UNSUBSCRIBE channel
这种模式有如下的优缺点:
优点
典型的广播模式,一个消息可以发布到多个消费者
多信道订阅,消费者可以同时订阅多个信道,从而接收多类消息
消息即时发送,消息不用等待消费者读取,消费者会自动接收到信道发布的消息
缺点
消息一旦发布,不能接收。换句话就是发布时若客户端不在线,则消息丢失,不能寻回
不能保证每个消费者接收的时间是一致的
若消费者客户端出现消息积压,到一定程度,会被强制断开,导致消息意外丢失。通常发生在消息的生产远大于消费速度时
可见,Pub/Sub 模式不适合做消息存储,消息积压类的业务,而是擅长处理广播,即时通讯,即时反馈的业务。
思考如果我们使用这种模式让api服务作为消息的发布者(pub)而所有的server作为服务的订阅者(sub)可不可以,为什么?
明显如果每个服务都接收到了请求,就会出现短信重复发送的情况,这不是我们期望的效果
lpush、lpop、rpush、rpop、lrange
Lpush 命令将数据插入到队列头部
格式:
LPUSH key “数据”
Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。
格式:
Rpush key “数据”
Lpop 命令用于移除并返回列表的第一个元素
格式:
Lpop key
Rpop 命令用于移除列表的最后一个元素,返回值为移除的元素
格式:
RPOP key
Lrange 返回列表中指定区间内的元素,可以指定一个区间以偏移量 START 和 END 指定。
其中 0 表示列表的第一个元素, 1表示列表的第二个元素,以此类推
也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。
格式:LRANGE key START END
首先我们来看一个现象,当我们通过lpop命令或rpop命令从一个空的队列中获取数据
我们看到如果队列是空的 通过lpop和rpop命令直接返回了空
我们思考对于我们的系统来说有没有问题
a)api服务接收到数据后通过lpush命令往key中添加数据
b)server服务通过rpop命令从队列中获取数据
有没有问题?
为什么?
存在什么问题,资源浪费问题
如何解决?
介绍blpop,brpop
blpop、brpop:相比于rpop和lpop多了b(b代表blocking)及阻塞的意思,
阻塞读在队列没有数据的时候进入休眠状态,当队列为空时,lpop和rpop会一直空轮训,消耗资源;
所以引入阻塞读blpop和brpop(b代表blocking),阻塞读在队列没有数据的时候进入休眠状态,
一旦数据到来则立刻醒过来,消息延迟几乎为零。