最近我正在学习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中进行过滤。
答案 0 :(得分: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 :(得分: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。该脚本可以是一个循环,根据您要查找的值进行过滤。