2012-05-11 4 views
3

redis.py을 사용하고 있고 주어진 필드로 어떻게 정렬 할 수 있는지 궁금합니다. 설명서를 읽었으며 예제로 인터넷 검색을 시도했지만 아무 것도 발견하지 못했습니다.redis.py - 특정 필드로 해시 정렬

이 경우 시간 및 해당 온도 목록이 있습니다. 'time'의 주어진 범위, 즉 1000에서 1100에 대해 주어진 시간 범위에서 temp '의 가장 높은 값을 반환하여 하이 템프 변수에 할당합니다. 마찬가지로, lowtemp도 사용하고 싶습니다.

는 다시 메모리에 모든 것을 번역 반대로 내가 파이썬에게

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) 

정말 멋지지만 작동해야합니다. Lloyd Moore가 대답 한 내용이 사실이라고 말하면 해시 필드를 기준으로 정렬 할 수 있지만 SORT 명령을 사용하면 하위 집합을 쉽게 선택할 수 없습니다. 더 나은 해결책을 찾으면이 답변을 업데이트하겠습니다. 또는 의견에 건강한 토론을하기를 바랍니다.

편집 :는 디디에 Speza의 조언 후 max/min에 파이썬 sort()에서 변경되었습니다.

+0

온도 최소 및 최대를 계산하려면 적절한 정렬이 필요하지 않습니다. 파이썬에서 온도 목록에있는 간단한 O (n) 스캔은 약간 더 좋습니다 : maxt, mint = max (온도), min (온도) –

+0

Thanks @DidierSpezia, updated! –

+0

감사! 나는 원래이 방법을 사용하고 있었지만 동의한다. 더러워 보인다. 그러나 나는 주변에 더 좋은 방법이 있다고 생각하지 않는다. '결과'와 '온도'에 대한 변수를 재 할당하고 덮어 쓰는 한, 내가 생각하는 자원에 대해서는 괜찮을 것입니다. 이것은 다른 지역의 기온과 함께 거대한 작업이 될 수도 있습니다. – snakesNbronies

2

당신이 red.hmset를 실행할 때마다를 사용하여 정렬하는 경우 경우 것으로 가능, 레디 스 내에서이 작업을 수행하는 것입니다 당신은 온도의 가치를 덮어 씁니다. 이 값을 정렬하려면 각 항목에 고유 식별자를 제공해야합니다.

온도 : 1, 온도 : 2 ...

당신은 * 외부 키에 대한 object_ *

GET weight_하여 레디 스의 정렬 명령을

SORT myList를 사용할 수 있습니다.

희망은 어떤면에서 도움이됩니다. 도움이 더 필요하면 알려주세요.

+0

해시가있는 ** 하위 집합 **을 가져올 수 있습니까? 그것이 지금까지 어려움을 겪고있는 문제입니다. – snakesNbronies