【问题标题】:Redis sorted set with multiple score "columns"具有多个分数“列”的 Redis 排序集
【发布时间】:2014-06-05 20:04:27
【问题描述】:

我需要一个排行榜,用户可以在其中存储分数和关卡完成度的百分比。我只需要能够按分数排序并按分数获得排名。

使用 Redis 的 sorted sets 可以轻松存储用户的分数,如下所示:

ZADD leaderboard:gamemode1 100 user1
ZADD leaderboard:gamemode1 300 user2

但是,我很难弄清楚如何最好地存储属于100300 分数的百分比值。

我应该这样做吗:

ZADD leaderboard:gamemode1 100 user1:29.45

:29.45 是用户 1 在gamemode1 中的得分为100 的百分比?我认为这会使稍后更新 user1 的 gamemode1 分数变得复杂。

或者我应该创建一个哈希表作为一种记账机制,存储所有用户在所有游戏模式下的分数和百分比?

我对哈希表方法的担忧是,如果我想显示大约 50 个用户的分数和百分比值的排行榜,那么我将不得不查询该哈希表 50 次以获取百分比,然后拉出 top50 分数与ZRANGE

有人对如何以一种好的方式构建它有任何意见吗?

【问题讨论】:

    标签: redis


    【解决方案1】:

    使用Sorted Sets 时,请记住它具有成员字符串唯一性。

    这意味着:

    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%。

    你也可以只用score做score,对成员字符串进行序列化:

    ZADD leaderboard:gamemode1 100 [serialized dictionary/dataset]
    ZADD leaderboard:gamemode1  90 [serialized dictionary/dataset]
    

    如果您使用 JSON 或 MsgPack,您始终可以使用服务器端脚本来更新序列化字符串中的某些数据。

    我不建议在这种简单的情况下记账,至少现阶段不建议这样做。您可以随时在需要时实施。

    希望这有帮助,TW

    【讨论】:

    • +1 表示小数技巧。它有助于保持唯一的用户。请注意,第二个示例不会存储唯一用户,而是让同一个用户以不同的百分比存储多次,因为 Redis 不会删除具有不同百分比的序列化值。
    • @TechWisdom 当然可以。这就是为什么我从“成员字符串唯一性”的警告开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多