4

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

在这种情况下,我有一个时间列表和相应的温度。对于给定的“时间”范围,例如 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, 'temp':121})
red.hmset('temperature', {'time':1030, 'temp':125})
red.hmset('temperature', {'time':1100, 'temp':126})
red.hmset('temperature', {'time':1130, 'temp':127})
red.hmset('temperature', {'time':1200, 'temp':128})
4

2 回答 2

6

在思考了一段时间之后,我不得不说这很棘手。我能想出的最佳解决方案是:将数据存储在一个排序集中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

于 2012-05-11T08:08:50.537 回答
3

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

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

然后你可以使用 redis 排序命令

SORT mylist BY weight_* GET object_*

在外键上。

希望在某种程度上有所帮助。如果您需要更多帮助,请告诉我。

于 2012-05-11T07:43:35.117 回答