Redis排行榜数据实时更新,前端每30秒拉取一次;用户得分变化须立即用ZINCRBY/ZADD原子更新,而非定时批量写入;临时热度榜可按30秒窗口分key并用ZUNIONSTORE合并查询。

不需要每30秒“刷新”Redis本身——Redis数据是实时的,所谓“每30秒刷新排行榜”,本质是让前端或接口层**每30秒拉取一次最新排名数据**,而Redis后端始终保持最新状态,无需定时刷写。
关键点:Redis里分数要实时更新,不是靠轮询写入
用户得分变化(如答题加分、打赏、通关)应立即调用 ZINCRBY 或 ZADD 更新ZSet,而不是等30秒再批量写。Redis天然支持原子写入,高并发下依然准确。例如:
- ZINCRBY rank:today 5 "uid:12345" → 用户本次得5分,自动累加
- ZADD rank:final 98.5 "uid:12345" → 覆盖式更新最终成绩
前端/接口怎么做到每30秒查一次?
这是客户端或API层行为,和Redis无关。常见做法:
- 网页用 JavaScript setInterval(() => fetch('/api/rank'), 30000)
- APP端在首页定时器触发HTTP请求获取 ZREVRANGE rank:today 0 19 WITHSCORES
- 后端PHP接口直接调用 Redis::zRevRange('rank:today', 0, 9, ['withscores' => true]) 返回Top10
别误用“每30秒往Redis写一次”
有资料提到类似 $redis->incr('quanjusuo'); $redis->expire('quanjusuo',30); 这类代码,那是用于计数器或限流场景,不适用于排行榜。排行榜依赖的是每个用户的独立score,不是全局一个计数器。
如果真需要按30秒窗口统计(比如“最近30秒活跃用户榜”)
可以结合时间戳做key隔离,例如:
- 用当前时间戳向下取整到最近30秒作为key:rank:30s:1767222600(对应2026-11-03 03:10:00)
- 所有该窗口内的行为都写入这个key,过期设为35秒防延迟
- 查询时用 ZUNIONSTORE 合并最近2–3个key,再取TopN(适合临时热度榜)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











