跳至主要內容

排名系统设计

HeChuangJun约 385 字大约 1 分钟

支付系统设计

redis怎么做排行榜

# 添加成员及其分数
ZADD leaderboard 1000 "player1"
ZADD leaderboard 800 "player2"
ZADD leaderboard 1200 "player3"
ZADD leaderboard 600 "player4"

# 获取前5名
ZREVRANGE leaderboard 0 4 WITHSCORES
1) "player3"
   "1200"
2) "player1"
   "1000"
3) "player2"
   "800"
4) "player4"
   "600"

# 玩家 player2 的分数增加到 900
ZADD leaderboard 900 "player2"

# 玩家 player2 的份数增加100,注意,没有则新增
zincrby  leaderboard 100 "player2" 

# 查询 player1 的排名(从高到低)输出为排名,从0开始计数。
ZREVRANK leaderboard "player1"
(integer) 1

# 分数相同怎么办
按数字,大小写字母顺序排序

如何实现最近7天的活跃度榜单?

方案一:Redis的zunionstore命令可以将多个Zset并起来,同时还可以设置集合的权重。
方案二:“每日榜单”的info同步添加在“最近7天榜单”中,定时减去最远一天的榜单集合的score。可以使用lua脚本实现。

# 假设你有以下7个 zset:
ZADD zset1 1 "a" 2 "b" 3 "c"
ZADD zset2 1 "a" 2 "d" 3 "e"
ZADD zset3 2 "b" 3 "c" 4 "f"
ZADD zset4 1 "a" 4 "d" 5 "g"
ZADD zset5 2 "b" 5 "c" 6 "h"
ZADD zset6 1 "a" 3 "d" 7 "i"
ZADD zset7 2 "b" 4 "c" 8 "j"
# 使用 ZUNIONSTORE 命令将它们合并:
ZUNIONSTORE merged_zset 7 zset1 zset2 zset3 zset4 zset5 zset6 zset7
# 查看合并后的结果:
ZREVRANGE merged_zset 0 -1 WITHSCORES
 1) "e"
 2) "3"
 3) "a"
 4) "4"
 5) "f"
 6) "4"
 7) "g"
 8) "5"
 9) "h"
10) "6"
11) "i"
12) "7"
13) "b"
14) "8"
15) "j"
16) "8"
17) "d"
18) "9"
19) "c"
20) "15"