2026-01-25 22:21:14
Redis中消息队列和延时消息队列的实现方法如下:
消息队列的实现
Redis的List数据结构可实现简单的消息队列,核心命令包括LPUSH/RPUSH(入队)和LPOP/RPOP(出队)。
休眠策略:消费者收到空数据时休眠1秒(如Thread.sleep(1000)),但会引入延迟(单消费者延迟1秒,多消费者延迟降低)。
阻塞读:使用BLPOP/BRPOP命令,队列无数据时自动阻塞,有数据时立即唤醒,最后一个参数为阻塞超时时间(超时返回nil)。需注意服务端可能因空闲连接超时断开,需捕获异常并重试。
延时消息队列的实现
利用Sorted Set(ZSET)的score字段存储时间戳,实现消息的定时消费。
发布消息:使用ZADD命令,score为当前时间戳加延迟时间(如1秒后消费则score=当前时间戳+1000)。
消费消息:通过ZRANGEBYSCORE查询score小于等于当前时间戳的消息,表示已到消费时间。若需逐条消费,可添加LIMIT限制。
删除已消费消息:使用ZREM删除已读取的消息,需根据返回值判断是否抢到消息(避免重复消费)。
原子操作:直接使用ZRANGEBYSCORE+ZREM可能因多线程竞争导致资源浪费,可通过Lua脚本将两者合并为原子操作,确保数据一致性。
代码示例:完整实现见GitHub仓库,包含发布者、订阅者及延迟效果测试。
注意事项
Redis实现的队列为轻量级方案,适用于简单场景,但缺乏专业队列中间件(如RabbitMQ)的ACK确认机制,消息可靠性较低。若需高可靠性,建议使用专业中间件。