【问题标题】:Use Cases for Redis' "Score" and "Ranking" Features for SetsRedis 的集合“分数”和“排名”功能的用例
【发布时间】:2013-08-03 14:44:01
【问题描述】:

Redis 的集合“得分”和“排名”功能有哪些用例(除了游戏的典型“排行榜”示例之外?我试图弄清楚如何将这些动态新功能用作我预计会从使用传统的关系数据库转向使用 Redis 作为持久数据存储。

【问题讨论】:

    标签: redis


    【解决方案1】:

    ZSETs 非常适合基于分数进行选择或范围,但分数可以是任何数值,例如时间戳。

    我们将所有美国股票的每日股票价格存储在 redis 中。这是 ebay 的示例...

    ZADD key score member [score member ...] 
    ...
    ZADD stocks:ebay 1 30.39 2 32.70 3 31.25 4 31.75 5 29.12 6 29.87 7 29.93
    

    在这种情况下,score 值通常是长时间戳,除此之外,如果我们想要过去 3 天的每日价格,我们只需将两个日期转换为时间戳,并使用时间戳范围 1 3 从 redis 中提取...

    zrangebyscore stocks:ebay 1 3
    
    1) "30.39"
    2) "32.70"
    3) "31.25"
    

    查询速度非常快,可以很好地满足我们的需求。

    希望对你有帮助!

    【讨论】:

    • zset 不是二叉树。它是字典和跳过列表的组合。算法复杂度也不同。
    • 这种方法可能存在缺陷:由于这是一个SET,当添加重复的股票价格时,它不会被存储! ZADD stocks:ebay 8 30.39
    【解决方案2】:

    zset 是唯一可以排序的键类型

    例如,您可以想象将特定文章的所有 cmets key id 放在 zset 中, 用户将对每个 cmets 投票赞成/反对,这将改变分值

    之后,当您需要绘制 cmets 时,您可以先订购更好的 cmets(如这里)

    使用 ZREMRANGEBYSCORE,您可以想象每天删除所有非常糟糕的 cmets

    但作为每个 redis 类型,它们仍然是基本的,给你一个专门的用例很难有一些:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      相关资源
      最近更新 更多