0

0

Redis怎样处理延时任务队列_基于ZSet的Score存储时间戳进行轮询

P粉602998670

P粉602998670

发布时间:2026-03-15 09:53:26

|

771人浏览过

|

来源于php中文网

原创

ZSet 存时间戳因支持按时间有序触发与范围查询,而列表仅先进先出且需轮询;score 必为时间戳(推荐毫秒),value 存任务内容;查用 ZRANGEBYSCORE -inf [now] 后立即 ZREM 或用 ZPOPMIN 原子操作。

redis怎样处理延时任务队列_基于zset的score存储时间戳进行轮询

为什么用 ZSet 存时间戳而不是 LPUSH + BRPOPLPUSH

因为延时任务的核心诉求是「按时间有序触发」,不是先进先出。用列表只能靠客户端轮询或阻塞等待,没法跳过未到时间的任务。ZSetscore 天然支持范围查询和排序,ZRANGEBYSCORE 一句就能捞出所有到期任务,省去遍历和判断逻辑。

常见错误现象:
有人把时间戳存在 value 里,score 随便填个 0,结果没法查——score 才是排序和查询依据,value 只存任务内容(比如 JSON 字符串)。

  • score 必须是毫秒/秒级时间戳(推荐毫秒,避免精度丢失)
  • 插入用 ZADD queue_name timestamp task_json,不是 LPUSH
  • 不要用 EXPIRE 给 key 设过期——ZSet 本身不支持 per-member 过期,得靠轮询清理

ZRANGEBYSCORE 查任务时为什么总漏掉刚到点的那条

Redis 的 ZRANGEBYSCORE 默认是闭区间,但时间戳是瞬时值,如果用 ZRANGEBYSCORE queue_name -inf now,理论上能取到所有 ≤ now 的任务。问题常出在:客户端取完没删,或者取的时候系统时间与 Redis 时间不同步。

实操建议:

  • 查的时候用 ZRANGEBYSCORE queue_name -inf [now][ 表示包含边界),别漏方括号
  • 查完立刻用 ZREM queue_name task1 task2 ... 删除已取出的任务,否则下次还会捞出来
  • 更稳妥的做法是用 ZPOPMIN queue_name count(Redis 5.0+),它原子性地取并删,避免竞态
  • 如果用老版本 Redis,必须用 Lua 脚本封装「查 + 删」,否则多实例并发会重复消费

任务执行失败后怎么重试,score 怎么更新

重试不是简单把原任务再 ZADD 一次,而是要更新它的 score 为下一次执行时间戳。直接 ZADD 同一个 member 会自动覆盖旧 score,这是 Redis 的设计特性,可以利用。

小微助手
小微助手

微信推出的一款专注于提升桌面效率的助手型AI工具

下载

关键点:

  • 任务 member 最好带唯一 ID(比如 UUID),别用纯 JSON 做 member,否则重试时无法精准定位
  • 重试延迟要递增,比如第一次 1s 后,第二次 3s,第三次 10s,避免雪崩;计算新 score 时用 current_timestamp + delay_ms
  • 别用 ZINCRBY 更新 score——它只支持加数字,而你通常要设绝对时间戳,直接 ZADD 更清晰
  • 如果任务需要最大重试次数,可在 value(JSON)里记录尝试次数,每次取出来解析判断

轮询频率设多少才不伤 Redis,又不耽误任务

没有固定值,取决于任务量级和实时性要求。轮询太密(比如 10ms 一次)会让 Redis CPU 持续跑高;太疏(比如 5s 一次)会导致任务平均延迟 2.5s。

建议从实际场景出发:

  • 普通后台任务(如发邮件、清缓存):100–500ms 一轮,用 ZCOUNT queue_name -inf now 先轻量判断有没有活干,有再查详情
  • 对延迟敏感的业务(如订单超时关单):必须用 ZPOPMIN 或 Lua 原子操作,配合 10–50ms 轮询,同时监控 latencyused_cpu_sys
  • 千万别在循环里无休止 ZRANGEBYSCORE——加 SLEEP 或用 WAIT 配合发布订阅做唤醒(但唤醒逻辑本身又引入复杂度)
  • 生产环境务必开 slowlog-log-slower-than 1000,盯着有没有 ZSet 查询变慢,大 ZSet(百万级成员)查 ZRANGEBYSCORE 可能卡几百毫秒

最麻烦的其实是时钟漂移:Redis 实例在容器里、或跨机房部署时,系统时间差几秒就会让任务批量早触发或晚触发。这事容易被忽略,但线上出过不止一次问题。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.11.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号