redis实现队列的几种方式(LPUSH/BRPOP,发布/订阅模式,stream)

本文探讨了Redis作为消息队列的应用,包括基于List的LPUSH/BRPOP、发布订阅(PUB/SUB)及stream数据结构实现队列的方式。深入解析了stream的增删改查、消费组模式、消息处理流程及消息转移机制。

前言

前面我们在redis学习笔记之基本5种数据结构中提到列表实现队列,我们今天就简单说下redis队列实现的几种方式。redis队列实现可以通过  基于List的 LPUSH+BRPOP 的实现 基于Sorted-Set的实现PUB/SUB(订阅/发布模式),stream,下面我们主要是说说list,发布订阅,stream这三个知识点,至于sorted-set (有序集合)我们后面再说。

队列(LPUSH/BRPOP)

redis中通过列表可以来实现队列具体操作可以下面操作

rpush/lpop或lpush/rpop实现简单队列

127.0.0.1:6379> lpush word a b c d
(integer) 4
127.0.0.1:6379> llen word
(integer) 4
127.0.0.1:6379> rpop word
"a"
127.0.0.1:6379> rpop word
"b"
127.0.0.1:6379> rpop word
"c"
127.0.0.1:6379> rpop word
"d"
127.0.0.1:6379> rpop word
(nil)

blpop或brpop实现阻塞读取队列

127.0.0.1:6379> rpush word a b c d
(integer) 4
127.0.0.1:6379> blpop word 1
1) "word"
2) "a"
127.0.0.1:6379> blpop word 1
1) "word"
2) "b"
127.0.0.1:6379> blpop word 1
1) "word"
2) "c"
127.0.0.1:6379> blpop word 1
1) "word"
2) "d"
127.0.0.1:6379> blpop word 1
(nil)
(1.09s)

python实例

在上面的rpush/lpop可以看出,如果没有队列没有数据的话,返回则为nil,所以在我们在写代码时候一般会加一个循环,代码如下:

while True:

    msg = redis.rpop("queue")

    if msg is None:
        continue
    hadle_data(msg)

这里存在一个问题就是:如果queue没有数据则一直存在rpop的操作,这样对客户端的cpu消耗和redis性能的浪费,所以我们可以暂时先考虑让msg为None的时候让他休息一秒,例子如下:

while True:

    msg = redis.rpop("queue")

    if msg is None:
        time.sleep(1)
        continue
    hadle_data(msg)

 在优化之后,仔细仔细想下还是存在一个问题,那就是实时性存在问题了(有点像es近实时了),所以我们需要动动我们聪明的大脑来想想怎么解决。这时候我们就需要使用blpop(b指的是blocking,也就是阻塞读),这样没有数据来的时候会立即进入休眠状态,一旦数据来了,则立即激活,这样不但解决了性能的问题,也尽可能的解决了延迟的问题

while True:

    msg = redis.brpop("queue")

    if msg is None:
        continue
    hadle_data(msg)

这里注意:一旦长时间没有来数据,服务端会主动断开连接,减少闲置资源的占用,这时候会抛出异常,所以我们需要加入捕捉异常,还要重试。

使用这种模型来实现队列存在两个比较致命的问题:

  1. 没有ack机制,消息丢了就丢了
  2. 不能重复消费

发布订阅

"发布/订阅"模式包含两种角色,分别是发布者和订阅者。订阅者可以订阅一个或者多个频道(channel),而发布者可以向指定的频道(channel)发送消息,所有订阅此频道的订阅者都会收到此消息。

简单版发布订阅

//订阅主题的客户端
127.0.0.1:6379> SUBSCRIBE python
Reading messages... (press Ctrl-C to quit)
1) "sub
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子林_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值