使用 zincrby 累加分数,配合 zrevrange 按分数倒序获取排名。先通过 zincrby 将用户 id 作为成员、得分增量写入有序集合,随后调用 zrevrange 指定范围并开启 withscores 参数,即可直接拿到从高到低的排行榜数据。

ZINCRBY 如何更新单个用户的分数
ZINCRBY 接收键名、增量值和成员名,返回更新后的总分。它会自动创建不存在的成员,若成员已存在则累加数值。示例中向 leaderboard 集合为 user_1 增加 10 分,结果为 10;再次增加 5 分,结果变为 15。该操作是原子性的,适合高并发场景下的实时计数。

$redis->zIncrBy('leaderboard', 10, 'user_1');
$redis->zIncrBy('leaderboard', 5, 'user_1');
预期输出:
第一次调用返回 float(10)
第二次调用返回 float(15)
ZREVRANGE 如何提取前 N 名数据
ZREVRANGE 根据索引范围(从大到小)取出成员。索引 0 代表分数最高的成员。设置 withScores 为 true 时,返回值包含成员名和对应的分数。例如取前 3 名,传入起始索引 0 和结束索引 2。如果集合中元素不足 3 个,则返回所有可用元素。此方法比先排序再截取更高效,因为底层基于跳表结构。

$result = $redis->zRevRange('leaderboard', 0, 2, true);
print_r($result);
假设当前集合状态:user_1: 15user_2: 20user_3: 18
预期输出数组:
Array ( [user_2] => 20 [user_3] => 18 [user_1] => 15 )
如何处理分数相同的情况
当多个用户分数相同时,ZREVRANGE 的排序稳定性取决于 Redis 内部实现。在 Redis 6.2+ 之前,同分成员的顺序是不确定的。如果需要确定性的次级排序(如按注册时间),通常需要将时间戳或唯一 ID 编码进分数或使用复合键。但在简单的计数排行榜中,同分视为并列,具体谁在前不影响“前 N 名”的资格判定。若需严格区分,建议在存入时使用 ZADD 并附带更复杂的分数计算逻辑,或者在应用层对同分结果进行二次排序。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











