MAX()SQL等效于Redis

时间:2015-05-01 18:45:39

标签: performance redis nosql-aggregation nosql

我是Redis的新手,现在我有问题需要改进我的统计应用程序。生成统计信息的当前SQL位于:

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

它将从MIN字段返回MAXcreated_at值。

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

此致

1 个答案:

答案 0 :(得分:0)

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

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

ZADD table 10 1 100 2 1000 3 ...

现在很容易获得最小的创建日期 - 只需ZRANGE table 0 0 WITHSCORES - 并且最大值仅为ZRANGE table -1 -1 WITHSCORES。唯一“棘手”的部分是确保分类集保持更新,因此对于每个新记录,您需要从集合中删除最低的ID并添加新的ID。在伪Python代码中,这看起来类似于以下内容:

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