在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(ohm的一个版本),它支持一些查询,但我不确定它是否是先获取所有数据,然后再在Python中进行过滤。
2 个回答
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的多行字符串中写一个Lua脚本,然后用redis.eval方法把这个脚本传给Redis。这个脚本可以是一个循环,用来根据你想要的值进行过滤。
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
也就是说,我会根据我想支持的查询模式,准备很多正向和反向的映射。