Redis如何清理过期排行数据_利用ZREMRANGEBYSCORE移除ZSet历史记录

ZREMRANGEBYSCORE 清不掉过期 ZSet 数据,根本原因是 Redis 的 ZSET 不自动感知过期,需用时间戳作 score 并手动按时间范围删除。为什么 ZREMRANGEBYSCORE 清不掉过期的 ZSet 数据?根本原因不是命令用错了,而是时间戳没对齐。Redis 的 ZSET 本身不自动感知"过期",你得自己把"过期"定义成一个分数范围------比如用 Unix 时间戳当 score,过期就是 score 。如果存进去的 score 是毫秒时间戳,但清理时用的是秒级 <code>time.time(),那大概率漏删。确认写入时用的是秒还是毫秒:查一条数据,执行 ZRANGE key 0 0 WITHSCORES 看 score 值量级(10 位是秒,13 位是毫秒)清理前先算准当前时间戳单位,Python 里 int(time.time()) 是秒,int(time.time() * 1000) 是毫秒别用 0 当下界------万一有人手动塞了负分,ZREMRANGEBYSCORE key -inf (now) 才安全用 ZREMRANGEBYSCORE 清理排行榜历史数据的正确姿势排行榜场景常见"只保留最近 7 天活跃用户",这时 score 应该是最后活跃时间戳。清理不是删全量,而是切片删------一次别删太多,避免阻塞主线程。命令格式固定:ZREMRANGEBYSCORE key -inf (timestamp),括号表示开区间,(timestamp) 表示"严格小于 timestamp"建议每次最多删 1000 条:先 ZCOUNT key -inf (timestamp) 预估数量,超了就分批,用 ZREMRANGEBYSCORE key -inf (timestamp) LIMIT 0 1000(注意:LIMIT 在 Redis 7.0+ 才支持,旧版本只能靠客户端循环)别在高峰期直接跑全量清理------加个 SCAN 式渐进清理逻辑,或改用后台任务轮询ZREMRANGEBYSCORE 和 EXPIRE 能不能一起用?不能混用目标。Redis 的 EXPIRE 是 key 级过期,对 ZSET 整体生效;而 ZREMRANGEBYSCORE 是成员级清理。你要的是"榜单里的人过期就下榜",不是"整个榜单消失"。给 ZSet 设 EXPIRE 只会让整个结构被删,和业务逻辑冲突。 灵办AI 免费一键快速抠图,支持下载高清图片

相关推荐
Lucifer三思而后行30 分钟前
最近折腾了一下金仓数据库的备份恢复
数据库·备份恢复
用户2986985301430 分钟前
用 Python 自动化把 JavaScript 代码转换为 Word 文档
javascript·python·api
用户0190275816136 分钟前
AlphaFeed 标的池(universes)全解:CN_Stock / CN_ETF 与权限边界
python
青少儿编程课堂1 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
用户0332126663671 小时前
如何使用 Python 将 JSON 转换为 Excel
python·excel
小小张说故事1 小时前
Python 的切片到底切了什么:拆开 slice 对象、负步长和 __getitem__
python
草莓熊Lotso1 小时前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试
进击的荆棘2 小时前
MySQL——库的操作
数据库·mysql
2601_967980113 小时前
“小程序·云开发”上线 助力开发者的高效利器
数据库·存储管理·小程序云开发·云函数·开发者工具
zhangjw343 小时前
1-9 SELECT 查询基础:where、group by、having、order by、limit offset
数据库·postgresql·pg数据库