You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多容器部署Node API时如何实现并发请求下数组元素按序轮询返回

循环取用户并发一致性最优解决方案

你原本的思路方向正确,并发问题的核心是拆分的LPOP和RPUSH操作不具备原子性,高并发场景下确实会出现列表空、返回顺序混乱的问题,最优解决方案如下:

方案1:Redis Lua 脚本原子操作(推荐适配所有场景)

Redis 执行 Lua 脚本时会以单线程原子方式运行,全程不会被其他命令打断,直接把弹出+回填的逻辑打包成 Lua 脚本即可解决所有并发问题。
使用的 Lua 脚本逻辑如下:

-- 先弹出列表第一个元素,再把该元素追加到列表尾部,最后返回弹出的用户
local current_user = redis.call('LPOP', KEYS[1])
redis.call('RPUSH', KEYS[1], current_user)
return current_user

在Node端调用时直接传入存储用户列表的Redis key即可,该方案有以下优势:

  • 全程原子性,无论多少并发请求,用户列表永远保持固定长度,不会出现空列表问题
  • 返回顺序严格符合要求,每次请求按顺序拿到下一个用户,自动循环
  • 性能开销极低,完全可以支撑10个容器的并发请求量,远比重型分布式锁方案高效

方案2:原子计数器取模(适配用户数组固定不变的场景)

如果你的用户数组不会动态增删,可以用更简单的计数器方案:

  1. 在Redis中存储一个自增计数器user_request_counter和固定的用户列表
  2. 每次请求先执行INCR user_request_counter拿到自增后的值,该操作本身是Redis原子命令
  3. 用拿到的计数值对用户数组长度取模,用模值作为下标取出对应用户返回即可
    该方案逻辑更简洁,没有列表修改操作,性能比方案1还要高,缺点是用户数组长度变化时需要额外处理计数器和长度的对应关系。

内容的提问来源于stack exchange,提问作者Julu Ahamed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:27:04