redis.py - 按特定字段排序哈希值

时间:2012-05-11 06:16:12

标签: python sorting hash redis

我正在使用 redis.py ,并想知道如何按给定字段排序。我已阅读文档并尝试使用Google搜索示例,但未找到任何内容。

在这种情况下,我有一个时间列表和相应的温度。对于给定的时间范围,例如1000到1100,我会返回最高的临时值'对于给定的时间范围,将其分配给变量 hightemp 。同样,我也想用 lowtemp 来做。

是否可以在redis中执行此操作,而不是将所有内容再次转换回内存,就像我使用python排序

一样
import redis
red = redis.Redis()

red.hmset('temperature', {'time':900, 'temp':123})
red.hmset('temperature', {'time':930, 'temp':123})
red.hmset('temperature', {'time':1000, 'time':121})
red.hmset('temperature', {'time':1030, 'time':125})
red.hmset('temperature', {'time':1100, 'time':126})
red.hmset('temperature', {'time':1130, 'time':127})
red.hmset('temperature', {'time':1200, 'time':128})

2 个答案:

答案 0 :(得分:5)

经过一段时间的思考后,我不得不说它很棘手。我能想出的最佳解决方案是:将数据存储在sorted set中,其中time为分数,time:temperature为值(以保持值唯一)。然后使用ZRANGEBYSCORE获取所需的子集:

redis 127.0.0.1:6379> zadd temperature 1000 1000:123
(integer) 1
redis 127.0.0.1:6379> zadd temperature 1050 1050:122
(integer) 1
redis 127.0.0.1:6379> zadd temperature 1100 1100:125
(integer) 1
redis 127.0.0.1:6379> zrangebyscore temperature 1000 1100
1) "1000:123"
2) "1050:122"
3) "1100:125"
redis 127.0.0.1:6379> 

然而,这些值将按分数(即温度)排序。因此,您必须在客户端中对子集进行排序:

# Result from Redis
result = ['1000:123', '1050:122', '1100:125']
# Weed out the temperatures
temperatures = [int(x.split(':')[1]) for x in result]
# Get max and min temperatures
max_temp, min_temp = max(temperatures), min(temperatures)

它不是很漂亮,但应该有效。 Lloyd Moore在他的回答中说的是真的,你可以按哈希中的字段排序,但SORT命令不会让你轻松选择一个子集。如果我想到更好的解决方案,我会更新这个答案,或者我们只希望在评论中进行健康的讨论!

修改:在Didier Speza的建议之后,从python sort()更改为max / min

答案 1 :(得分:2)

每次运行red.hmset时,都会覆盖温度值。鉴于您要对这些值进行排序,您需要为每个条目指定唯一标识符。

温度:1,温度:2 ......

然后您可以使用redis sort命令

SORT mylist BY weight_ * GET object _ *

外键上的

希望以某种方式有所帮助。如果您需要更多帮助,请告诉我。