首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一日一技:在Redis中,如何使用blpop?

在Python操作Redis时,如果我们要从一个Redis列表的左侧弹出一个数据,代码一般这样写: import redis client = redis.Redis() data = client.lpop...为了节约网络请求,可以使用Redis列表的阻塞式列表弹出命令: blpop和 brpop。...这两个命令与常规的 lpop、 rpop有两点不同: 当代码运行到 blpop时,如果列表为空,那么程序就会卡在这里,直到列表中有数据为止。 blpop返回的数据和 lpop返回的数据有些许不同。...blpop的使用方法如下: >>> import redis >>> client = redis.Redis() >>> data_tuple = client.blpop('test_blpop')...所以上面的轮询代码可以修改为: import redis client = redis.Redis() while True: data_tuple = client.blpop('key')

3.5K60
您找到你想要的搜索结果了吗?
是的
没有找到

一日一技:隐患——redis-py的blpop可能由于网络波动导致收不到信息

我们在使用Redis做消息队列的时候,常常使用列表这个数据结构,并写出如下的代码: import redisimport time client = redis.Redis()while True:...为了解决实时性的问题,使用了列表的阻塞式弹出命令 blpop,于是代码变为: import redis client = redis.Redis()while True: data = client.blpop...意思是说,在使用 blpop的时候,如果中途因为网络波动或者某些其他原因导致连接池失效,那么就永远接收不到信息了,虽然 redis-py有连接状态检查的功能,但是由于程序是阻塞的, redis-py的连接状态检查功能不能正常使用...为了解决这个问题,就需要 blpop的超时功能。让 blpop每几分钟就断开,检查一下网络,再重新连上。...于是代码变为: import redis client = redis.Redis()while True: data = client.blpop('key', timeout=5 * 60)

2K30

基于Redis实现DelayQueue延迟队列设计方案(附源码)「建议收藏」

通过BLPOP阻塞,我们避免了频繁的去请求redis,并且更重要的是提高了实时性; 2.批量获取的数量和消费线程池的阻塞队列 执行上面的一次获取N个元素是不定的,这个要看线程池的maxPoolSize...的影响 如果redis集群用了codis方案或者Twemproxy方案; 他们不支持BLPOP的命令; codis不支持的命令集合 那么就不能利用BLPOP来防止频繁请求redis;那么退而求其次改成每秒执行一次...,executorName,executor); } } BLPOP阻塞的情况如何优雅停止监听redis的线程 如果不是在codis集群的环境下,BLPOP是可以很方便的阻塞线程的...不用BLPOP, 每次都sleep一秒去调用LrangeAndLTrim操作; ②.关机的时候杀掉 redisblpop客户端; 杀掉之后 BLPOP会立马返回null; 进入下一个循环体; ---...- 不足 因为Redis的持久化特性,做不到消息完全不丢失,如果要保证完成不丢失,Redis的持久化刷盘策略要收紧 因为Codis不能使用BLPOP这种阻塞的形式,在获取消费任务的时候用了每秒一次去获取

1.6K10

基于Redis实现DelayQueue延迟队列设计方案

通过BLPOP阻塞,我们避免了频繁的去请求redis,并且更重要的是提高了实时性; 2.批量获取的数量和消费线程池的阻塞队列 执行上面的一次获取N个元素是不定的,这个要看线程池的maxPoolSize...的影响 如果redis集群用了codis方案或者Twemproxy方案; 他们不支持BLPOP的命令; codis不支持的命令集合 那么就不能利用BLPOP来防止频繁请求redis;那么退而求其次改成每秒执行一次...,executorName,executor); } } BLPOP阻塞的情况如何优雅停止监听redis的线程 如果不是在codis集群的环境下,BLPOP是可以很方便的阻塞线程的...不用BLPOP, 每次都sleep一秒去调用LrangeAndLTrim操作; ②.关机的时候杀掉 redisblpop客户端; 杀掉之后 BLPOP会立马返回null; 进入下一个循环体; ---...- 不足 因为Redis的持久化特性,做不到消息完全不丢失,如果要保证完成不丢失,Redis的持久化刷盘策略要收紧 因为Codis不能使用BLPOP这种阻塞的形式,在获取消费任务的时候用了每秒一次去获取

4.4K42

程序员过关斩将--redis做消息队列,香吗?

BLPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。...关于消息延迟的问题,最暴力简单的方式就是增加消费客户端,这样可用多消费端交错的方式来缩小延迟的间隔,当然redis的设计者也考虑了这个问题,所有有了Blpop 命令 Redis Blpop 命令移出并获取列表的第一个元素...redis 127.0.0.1:6379> BLPOP LIST1 LIST2 .. LISTN TIMEOUT 而且还可以设置超时自动返回,岂不是完美。...但是还要顺便一句,redis的连接在空闲一段时间后,服务端可能会主动断开,Blpop命令会抛出异常,所以还要做好了重试或者其他策略为好。 3....我还是建议不要用redis做专业的MQ使用,毕竟MQ这种场景不是redis的设计初衷,但是太多人把redis做MQ使用,于是redis的作者基于redis的核心代码实现了一个消息队列:disque,也许未来会作为

50010

Redis | Redis 列表相关命令

如果想要在 Redis 中查看相关的命令也可以使用 help 命令来进行查看,命令如下。...10、blpop 命令 blpop 命令的格式如下: blpop key [key ...] timeout 该命令的作用是在 非空列表 的左侧弹出一个值,如果都为空列表,则阻塞 timeout...秒 我们同时开两个 Redis 的客户端,然后在客户端一输入如下命令: 127.0.0.1:6379> blpop key1 key2 5 (nil) (5.06s) 上面的命令是在...再次在客户端一输入如下命令: 127.0.0.1:6379> blpop key1 key2 20 由于 key1 和 key2 同样什么都没有,因此 blpop 命令进入 20 秒的阻塞状态,此时,...Redis 常用的几种基本数据类型总结完成后,我会再逐步的梳理 Redis 的各种应用场景,希望大家可以喜欢。 ? 思维导图会逐步的进行完善,到时也会把完整的思维导图进行分享。

39620

redis做消息队列,会香吗?

BLPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。...关于消息延迟的问题,最暴力简单的方式就是增加消费客户端,这样可用多消费端交错的方式来缩小延迟的间隔,当然redis的设计者也考虑了这个问题,所有有了Blpop 命令 Redis Blpop 命令移出并获取列表的第一个元素...redis 127.0.0.1:6379> BLPOP LIST1 LIST2 .. LISTN TIMEOUT 而且还可以设置超时自动返回,岂不是完美。...但是还要顺便一句,redis的连接在空闲一段时间后,服务端可能会主动断开,Blpop命令会抛出异常,所以还要做好了重试或者其他策略为好。 3....我还是建议不要用redis做专业的MQ使用,毕竟MQ这种场景不是redis的设计初衷,但是太多人把redis做MQ使用,于是redis的作者基于redis的核心代码实现了一个消息队列:disque,也许未来会作为

55520

Redis基础数据类型(string、hash、list)

LTRIM key start stop BLPOP和BRPOP 它是 LPOP key 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP命令阻塞,直到等待超时或发现可弹出元素为止...BLPOP key [key …] timeout BRPOP key [key …] timeout 假设现在有 job 、 command 和 request 三个列表,其中 job 不存在,...考虑以下命令: BLPOP job command request 0 BLPOP 保证返回的元素来自 command ,因为它是按”查找 job -> 查找 command -> 查找 request...) 1 redis> BLPOP job command request 0 # job 列表为空,被跳过,紧接着 command 列表的第一个元素被弹出。...> BLPOP job command 300 # 因为key一开始不存在,所以操作会被阻塞,直到另一客户端对 job 或者 command 列表进行 PUSH 操作。

80150

程序员过关斩将--redis做消息队列,香吗?

BLPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。...关于消息延迟的问题,最暴力简单的方式就是增加消费客户端,这样可用多消费端交错的方式来缩小延迟的间隔,当然redis的设计者也考虑了这个问题,所有有了Blpop 命令 Redis Blpop 命令移出并获取列表的第一个元素...redis 127.0.0.1:6379> BLPOP LIST1 LIST2 .. LISTN TIMEOUT 而且还可以设置超时自动返回,岂不是完美。...但是还要顺便一句,redis的连接在空闲一段时间后,服务端可能会主动断开,Blpop命令会抛出异常,所以还要做好了重试或者其他策略为好。 3....我还是建议不要用redis做专业的MQ使用,毕竟MQ这种场景不是redis的设计初衷,但是太多人把redis做MQ使用,于是redis的作者基于redis的核心代码实现了一个消息队列:disque,也许未来会作为

44520
领券