你们是如何使用 redis 来监听任务的?

2020 年 8 月 11 日
 smallgoogle
鄙人有个需求就是,A 服务把数据推到 redis,B 服务一直监听 redis list,如果有数据就弹出。
我在 B 服务里用的是 blpop,可这个命令是阻塞的。意思是如果 redis 的 list 一直没有数据 这个位置就一直阻塞,直到监听到一个数据 然后弹出。。。
那么问题就来了,先不说程序效率不效率的,或者是超时不超时的。因为目前我发现我还没等到超时呢,内存就溢出了。。或者说这个阻塞导致了系统自动结果了 B 服务的进程。因为我报错如下:
```
OSError: [Errno 12] Cannot allocate memory
```

那么问题来了,我如何可以优雅的监听 list 是否有新数据呢?
8698 次点击
所在节点    Python
56 条回复
simonlu9
2020 年 8 月 11 日
redis stream 你值得拥有
ichou
2020 年 8 月 11 日
blpop/brpop 很可靠的哈,开源社区有不少队列项目都是基于这个实现的,比如 Sidekiq
检查一下内存溢出的原因吧
misaka19000
2020 年 8 月 11 日
@prenwang #10 redis 的 pubsub 太弱了
MarioLuo
2020 年 8 月 12 日
小项目中常用 redis 这么干,Java 语言用 brpop 没遇到过内存溢出,不过有一点就是全局配置的超时时间必须大于 brpop 阻塞时间,否则会出现消息丢失
scnace
2020 年 8 月 12 日
Redis 有个 disque module (
yuzo555
2020 年 8 月 12 日
Redis 的 Stream
yc8332
2020 年 8 月 12 日
内存溢出是你自己程序的问题。找找哪里一直申请内存
atonku
2020 年 8 月 12 日
redis 做这个真的不好用
edk24
2020 年 8 月 12 日
没有达不达的到, 我连个上传视频异步转码切片都用上了. 哈哈 除非你想折腾自己

用适合的东西做适合的事情, 不然脑瓜疼
raptor
2020 年 8 月 12 日
如果是 python 的话,直接用 celery,后端用 redis 即可
encro
2020 年 8 月 12 日
非常常规的用法,
通常可能是取出太多了吧,
或者采用了异步一堆协程去取阻塞类似?
hxy91819
2020 年 8 月 12 日
刚看第一句话,感觉就应该用消息队列
tairan2006
2020 年 8 月 12 日
pub/sub or xstream
someonedeng
2020 年 8 月 12 日
其实重点是,B 服务会炸掉这个问题
killerv
2020 年 8 月 12 日
很多人上来就是换 MQ,真是服了,内存溢出的原因大概率是楼主程序问题。把消费队列换成 MQ,还是会内存溢出。
killerv
2020 年 8 月 12 日
小服务用 Redis 队列很好用的,我们 MQ 和 Redis 的 list 都有在用,说实话没发现 Redis 有你们说的那么不堪,作为消息队列很稳。不管是服务端还是客户端,Redis 配置比 MQ 简单多了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.xtra.eu.org/t/697283

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX