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

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

在这种情况下,我有一个时间列表和相应的温度.对于给定范围的’时间’,比如1000到1100,我会在给定的时间范围内返回temp’的最高值,并将其分配给变量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})

最佳答案 经过一段时间的思考后,我不得不说这很棘手.我能想出的最佳解决方案是:将数据存储在
sorted set中,时间作为分数和时间:温度作为值(保持值唯一).然后使用
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.

点赞