2012-05-30 5 views
4

정렬 된 집합을 사용하여 redis에서 여러 키 값을 얻으려면 어떻게해야합니까?REDIS - 여러 키 값 가져 오기

zadd Users 0 David 
zadd Users 5 John 
zadd Users 15 Linda 
zrevrange Users 0 -1 withscores 

두 명의 사용자가 있습니다.

'David'과 'Linda'키를 가진 사용자를 한 검색어로 어떻게 검색 할 수 있습니까?

답변

5

Redis에서 새로운 명령을 도입하지 않고도이를 수행 할 수있는 방법.

예를 들어, 당신은 다음 임시 세트와 ZSET 사이의 교차점 계산에 관심이있는 이름을 가진 임시 세트를 채울 수 : 파이프 라인으로

multi 
    sadd tmp David Linda ... and more ... 
    zinterstore res 2 tmp Users weights 0 1 
    zrange res 0 -1 withscores 
    del tmp res 
exec 

을, 이것은 단지 하나의 왕복을 생성합니다 tmp에 임의의 수의 입력 매개 변수를 채울 수 있습니다.

eval "redis.call('sadd', 'tmp', unpack(KEYS)); 
     redis.call('zinterstore', 'res', 2, 'tmp', 'Users', 'weights', 0, 1); 
     local res = redis.call('zrange', 'res', 0, -1, 'withscores'); 
     redis.call('del', 'res', 'tmp') ; 
     return res 
    " 2 David Linda 

당신은 안전하게 새로운을지지 않습니다 : 레디 스 2.6

, 당신은 또한 마지막으로 당신이 원하는 입력 목록을 수용하고 그 결과를 반환 명령을 얻을 수있는 서버 측 루아 스크립트에 다음 줄을 래핑 할 수 스크립팅을 사용하여 쉽게 구현할 수 있다면 Redis에 명령이 추가됩니다.

+0

쉘에 멀티 라인 루아 스크립트를 어떻게 입력합니까? "eval"redis.call ('sadd', 'tmp', unpack (KEYS));'을 입력하고 Enter 키를 누른 다음 오류 (잘못된 인수)가 나타나면 끝내면 특수 문자가 필요합니까? 나머지 스크립트는 무엇입니까? – raffian

+0

아니요, Redis-cli는 다중 행 스크립트를 허용하지 않습니다. –

0

하나의 명령으로 이것을 얻을 수 없습니다.

MULTI 
ZSCORE Users David 
ZSCORE Users Linda 
EXEC 

편집 : 당신이 할 수있는 가장 가까운 하나 개의 응답을 얻기 위해 다른 방법으로, 사용자의 점수 병렬 해시를 유지할 수 있고, 그것을 쿼리

여러가 있습니다
HMGET UserScores David Linda 
+0

때문에 해시 맵을 유지하고 정렬 된 세트는 당신이 말하는 더 나은 방법은? – musdy

+0

아니, "더 나은"아니에요. 이는 하나의 쿼리에서 원하는 것을 얻을 수있는 유일한 방법입니다. –

+1

나는 본다. 이것은 내가 생각할 때와 같이 좋은 개선 일 수 있습니다. 하나의 쿼리에서 여러 키 값을 검색 할 수 있습니다. – musdy

1

하나는 정렬 된 항목을 처리하기 때문에 정렬 된 집합을 사용합니다. 당신이 요구하는 것은 정렬 된 집합을 정렬 된 집합으로 사용하지 않는 것입니다. 정렬 순서에 신경 쓰지 않는다면, 정렬 된 집합이 당신이 찾고있는 집합이 아닌 것입니다. 이미 여러 개의 키를 검색 할 수 있지만 임의의 키는 검색 할 수 없습니다.

주요 목표가 여러 개의 임의의 키를 검색하는 경우 해시 및 hmget을 사용하십시오. 주된 필요가 정렬 된 집합에 액세스하는 것이면 정렬 된 집합을 사용하고 스크립팅 경로로 이동하거나 일련의 zscore 호출을 파이프 라인으로 이동하십시오.

5

당신은 레디 스 MGET 여기

redis> MGET key1 key2 nonexisting 
1) "Hello" 
2) "World" 
3) (nil) 

더 사용할 수 있습니다 http://redis.io/commands/mget

관련 문제