V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
0xABCD
V2EX  ›  Redis

Redis 列表如何实现阻塞 push?

  •  
  •   0xABCD · 2019-04-11 12:14:42 +08:00 via Android · 14088 次点击
    这是一个创建于 2058 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想要用 Redis list 实现队列,本来 list 是没有大小限制的,现在我想要固定队列大小,实现生产者消费者模型。list 有阻塞 pop,但是没有阻塞 push,请问该如何实现呢?

    4 条回复    2019-04-11 21:54:48 +08:00
    freedomshi
        1
    freedomshi  
       2019-04-11 14:13:32 +08:00
    这个需求太蛋疼了,自己实现吧。
    davidyanxw
        2
    davidyanxw  
       2019-04-11 14:22:22 +08:00
    自己实现:判断队列长度,如果超过固定大小,就阻塞
    hnyoumfk
        3
    hnyoumfk  
       2019-04-11 16:21:24 +08:00
    如果需要实现一个类似计数信号量的需求,可以参考《 Redis 实战》第六章,有详细的示例。
    如果需要实现类似限流的需求,建议直接使用消息队列的模式( Redis 的 Sub/Pub )

    如果要实现队列数量有上限限制的,建议先找一下有没有支持类似功能的消息队列。
    如果一定要用 Redis 实现这个功能的话,可以这么尝试:
    1. 通过自定义 lua 脚本,完成 “获取队列长度,没有到达上限则添加一个元素,否则返回失败” 这个原子操作
    2. 客户端调用上述 lua 脚本时,如果失败则根据业务需求选择是否稍后重试

    方便的话建议详细描述一下使用这个功能的场景和业务
    0xABCD
        4
    0xABCD  
    OP
       2019-04-11 21:54:48 +08:00 via Android
    @hnyoumfk 感谢回复,提供了不错的思路
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3197 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:21 · PVG 21:21 · LAX 05:21 · JFK 08:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.