了解redis队列原理

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),阻塞读在队列没有数据的时候进入休眠状态,
	一旦数据到来则立刻醒过来,消息延迟几乎为零。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值