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

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

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

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

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

https://www.v2ex.com/t/697283

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

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

© 2021 V2EX