2012-05-11 4 views
3

Я использую redis.py и задавался вопросом, как я могу сортировать по заданному полю. Я прочитал документацию и попытался использовать Google для примера, но не нашел ничего.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, '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}) 

ответ

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) 

Это не супер красиво, но оно должно работать. То, что Ллойд Мур говорит в своем ответе, верно, и вы можете сортировать по полям в хешах, но команда SORT не позволит вам легко выбрать подмножество. Я буду обновлять этот ответ, если я думаю о лучшем решении, или мы просто надеемся на здоровую дискуссию в комментариях!

Edit: Изменено из питона sort() к max/min после консультации Didier Speza в.

+0

Чтобы рассчитать температуру min и max, правильный тип не требуется. Простая проверка O (n) в Python в списке температур немного лучше: maxt, mint = max (температуры), min (температуры) –

+0

Спасибо @DidierSpezia, обновлено! –

+0

Спасибо! Я изначально использовал этот метод, но я согласен, это кажется грязным. Тем не менее, я действительно не думаю, что есть лучший способ. Пока я переназначаю и перезаписываю переменные для «результата» и «температуры», я должен быть в порядке для ресурсов, я полагаю. Это может привести к массивной работе с температурами в разных областях. – snakesNbronies

2

Каждый раз, когда вы запустите red.hmset вы переписываете значение температуры. Учитывая, что вы хотите отсортировать эти значения, вам нужно предоставить каждой записи уникальный идентификатор.

температура: 1, температура: 2 ...

Затем можно использовать команду Redis SORT

СНП MyList BY weight_ * GET object_ *

на внешних ключей.

Надеюсь, что это поможет. Дай мне знать, если тебе еще понадобится помощь.

+0

Возможно ли получить ** подмножество ** с хешем? Это проблема, с которой я боролся до сих пор. – snakesNbronies

Смежные вопросы