我需要一个排行榜,其中用户存储得分和级别完整性的百分比。我只需要能够按分数排序并按分数排名。
使用Redis的排序集a可以轻松存储用户的分数,如下所示:
ZADD leaderboard:gamemode1 100 user1
ZADD leaderboard:gamemode1 300 user2
然而,我很想知道如何最好地存储属于100
和300
分数的百分比值。
我应该这样做:
ZADD leaderboard:gamemode1 100 user1:29.45
:29.45
是100
中user1的得分gamemode1
的百分比?我认为这会让以后更新user1的gamemode1得分变得复杂。
或者我应该创建一个哈希表作为簿记机制,存储所有用户的分数和所有游戏模式的百分比?
我对哈希表方法的关注是,如果我想用他们的分数和百分比值显示约50个用户的排行榜,那么在拉动top50分数之后,我将不得不查询该哈希表50次以获得百分比与ZRANGE
。
有没有人对如何以良好的方式构建这个有任何意见?
答案 0 :(得分:7)
使用Sorted Sets
时,请记住它有成员字符串unicity。
这意味着:
ZADD game1 100 user1
ZADD game1 90 user1
只留下90 user1
。
只是单挑,我认为你已经覆盖了这一点。
要存储百分比,您可以使用分数的小数部分:
ZADD leaderboard:gamemode1 100.0995 user1
ZADD leaderboard:gamemode1 90.0850 user2
上面,我使用小数部分作为百分比,如下所示:0.0995 = 99.5%。
您还可以仅将分数用于分数,并序列化成员字符串:
ZADD leaderboard:gamemode1 100 [serialized dictionary/dataset]
ZADD leaderboard:gamemode1 90 [serialized dictionary/dataset]
如果使用JSON或MsgPack,则始终可以使用服务器端脚本来更新序列化字符串中的某些数据。
我不建议为这个简单的场景记账,至少在这个阶段不行。您可以随时实施。
希望这有帮助,TW