8

最近我正在学习 redis,老实说,我印象非常深刻并且渴望使用它。一直困扰我的一件事是“我如何查询 redis”。具体来说,我正在尝试解决以下问题

假设我有数百万个哈希存储如下

usage:1 = {created: 20100521, quantity:9, resource:1033, user:1842, ...}
usage:2 = {created: 20100812, quantity:3, resource:7233, user:1842, ...}
usage:3 = {created: 20100927, quantity:4, resource:1031, user:76, ...}

请注意,哈希中有很多键,我只显示了 4 个。现在我想按用户、资源或给定时间段内的用户查找特定日期范围内的记录。

我怀疑有特定于 redis 的模式来检索此类数据。我是一名 Python 程序员。我确实查看了支持一些查询的 redisco(ohm port),但我不确定它是否确实获取了所有数据,然后在 python 中进行过滤。

4

2 回答 2

10

对于 Redis,最好在决定如何存储数据之前了解您希望对数据使用哪种查询模式。

例如,如果您想对一组数据进行日期范围查询,您可以将该数据存储为排序集,其中键是您要查询的数据项,分数是 unix 时间戳。

在您上面的示例中,我可能会将您的示例哈希存储为:

 user_to_resource:i = user:j                   # key -> value forward map
 resources => (resource:i, created_timestamp)  # sorted set
 count_resource:i = quantity                   # key -> value quantity map

也就是说,根据我想要支持的查询模式,我会有很多正向和反向映射。

于 2010-09-27T08:09:42.410 回答
7

您提到的查询高度依赖于时间。在这种情况下,您最好使用排序集。您可以使用日期时间戳作为每个条目的分数。

例如,您可以执行以下操作:

hmset usage:1 created 20100521 quantity 9 resource 1033 user 1842
hmset usage:2 created 20100812 quantity 3 resource 7233 user 1842
hmset usage:3 created 20100927 quantity 4 resource 1031 user 76

zadd usage 20200521 1
zadd usage 20100812 2
zadd usage 20100927 3

要检索所有内容:

sort usage get 
# get usage:*->created get usage:*->quantity get usage:*->resource get usage:*->user

或者

lrange usage 0 -1

要获取范围的索引:

zrangebyscore usage 20100800 20100900

对于基于哈希键值的查询,redis 有一个有用的补充,它允许使用用 lua 编写的脚本。您可以轻松地在 python heredoc 中编写一个简单的 lua 脚本,并使用 redis.eval 方法将脚本传递给 redis。该脚本可能是一个循环,它根据您要查找的值进行过滤。

于 2011-05-25T09:06:33.520 回答