Java中用Redis List构建双端并发队列的核心是LPUSH+RPOP实现FIFO,适用于单生产者/单消费者轻量缓冲;需用BRPOP避免空轮询,LTRIM限长防内存泄漏,多消费者共用一端需业务协调。

Java 中用 Redis List 构建双端并发队列,核心是组合 LPUSH(左入)和 RPOP(右出),形成 FIFO 队列;但“双端并发”不等于“两端同时高频读写”,需明确边界——它适合单生产者/单消费者模型下的轻量缓冲,而非多线程争抢同一端的强一致性场景。
基础操作:LPUSH 入队 + RPOP 出队
这是最典型的队列模式,保证先进先出:
- 生产者调用
jedis.lpush("queue:key", "task1"),元素插入列表头部(索引 0) - 消费者调用
jedis.rpop("queue:key"),弹出尾部元素(即最早插入的那一个) - 这种组合天然支持 FIFO,且两端操作都是 O(1),无锁、低延迟
避免空轮询:改用 BRPOP 实现阻塞消费
直接轮询 RPOP 会浪费 CPU,尤其在低流量时。应升级为阻塞式读取:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 消费者使用
jedis.brpop(5, "queue:key"),超时 5 秒,无数据时挂起,有新元素立刻唤醒 - 返回值是
Map.Entry<String, String>,key 是列表名,value 是弹出的元素 - 比手动 sleep + 循环更省资源,也更及时
控制内存与长度:主动限长 + 定期清理
Redis List 没有自动过期或容量限制,无限增长会导致内存泄漏:
立即学习“Java免费学习笔记(深入)”;
- 写入后立即用
jedis.ltrim("queue:key", 0, 999)只保留最近 1000 条,防止暴增 - 不建议在每次 LPUSH 后都调
llen()判断再 trim,高并发下LLEN虽是 O(1),但频繁调用仍增加开销 - 可结合定时任务(如每分钟一次)检查长度并截断,或用 Lua 脚本原子封装“LPUSH + LTRIM”
并发安全注意事项
LPUSH 和 RPOP 本身是原子命令,但“双端并发”不是万能的:
- 多个消费者同时
RPOP是安全的,Redis 保证每次只返回一个唯一元素 - 但若既有线程
LPOP又有线程RPOP,就可能破坏顺序逻辑,业务需自行协调读端语义 - 真正需要多消费者+可靠投递+失败重试,应换用 Redis Streams 或专业消息中间件


















