【问题标题】:MAX() SQL Equivalent on RedisRedis 上的 MAX() SQL 等效项
【发布时间】:2015-07-11 15:38:21
【问题描述】:

我是 Redis 新手,现在我在改进我的 stat 应用程序时遇到了问题。当前生成统计信息的 SQL 在这里:

SELECT MIN(created_at), MAX(created_at) FROM table ORDER BY id DESC limit 10000

它将从created_at 字段返回MINMAX 值。

我在 Redis 上读过 RANGESCORING,似乎它们可以用来解决这个问题。但是对于最后 10000 条记录,我仍然对 SCORING 感到困惑。它们可以用来解决这个问题,还是有其他方法可以使用 Redis 来解决这个问题?

问候

【问题讨论】:

    标签: performance redis nosql-aggregation nosql


    【解决方案1】:

    您的目标似乎有些不清楚 - 您是否希望将所有记录存储在 Redis 中?如果是这样,table 表还有哪些其他列,您还针对它运行了哪些其他查询?

    我会从表面上回答您的问题,但请注意,在大多数 NoSQL 数据库(包括 Redis)中,您需要根据计划获取数据的方式来存储数据。假设您想获取最后 10K 记录的最小/最大创建日期,我建议您将它们保存在排序集中。 Sorted Set 的成员将是唯一的id,他们的分数将是创建日期(使用 epoch 值),例如,id 为 1、2 和 3 的行分别在日期 10、100 和 1000 创建:

    ZADD table 10 1 100 2 1000 3 ...
    

    现在很容易获得最小的创建日期 - 只需执行 ZRANGE table 0 0 WITHSCORES - 最大值只是 ZRANGE table -1 -1 WITHSCORES 的距离。唯一“棘手”的部分是确保 Sorted Set 保持更新,因此对于每条新记录,您都需要从集合中删除最低的 id 并添加新的。在伪 Python 代码中,这将类似于以下内容:

    def updateMinMaxSortedSet(id, date):
        count = redis.zcount('table')
        if count > 10000:
            redis.zrem('table', id-10000)
        redis.zadd('table', id, date)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 2022-11-02
      • 1970-01-01
      • 2015-09-14
      • 2010-09-10
      相关资源
      最近更新 更多