2010-09-27 64 views
8

最近我在学习redis,老实说非常令人印象深刻,并且急于使用它。困扰我的一件事是“我如何查询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(欧姆端口),它支持一些查询,但我不确定它是否获取所有数据,然后用python过滤。

回答

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 

也就是说,我有很多的正向和反向取决于查询模式,我想支持地图。

+1

认为这将是有益的分享这个http://pythonik.blogspot.com/2010/11/redis-patterns-search.html 声明:指向我自己的博客 – Shekhar 2010-11-26 18:18:09

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。该脚本可能是一个循环,根据您正在查找的值进行过滤。