복붙노트

[REDIS] 레디 스에서 여러 키 값 가져 오기

REDIS

레디 스에서 여러 키 값 가져 오기

나는 현재 레디 스 놀아 그리고 난 몇 가지 질문 있어요. 이 키의 배열에서 값을 얻을 수 있습니까?

예:

users:1:name "daniel"
users:1:age  "24"

users:2:name "user2"
users:2:age  "24"

events:1:attendees "users:1", "users:2"

1 : 내가 이벤트 redis.get 때, "사용자 : 2": 참석자는 "1 사용자"를 반환합니다. 나는이 목록을 통해 루프를 할 수있는 사용자 수 : 1, 사용자를 얻을 : 2. 그러나이 Feel로의 잘못된 모든 일 개 GET에 참석자 정보를 얻을 수있는 방법이 있나요?!

레일에서 내가 이런 짓을 할 것이다 :

@event.attendees.each do |att|
  att.name
end

그러나 레디 스에서 내가 그것을 열쇠가 아니라 그 키에 저장된 실제 개체를 반환 할 수 있기 때문이다.

감사 :)

해결법

  1. ==============================

    1.항목에 루프를하는 동 기적으로 각각의 요소에 접근하는 것은 매우 효율적이지 않습니다. 레디 스 2.4로, 당신이 원하는 것을 할 수있는 여러 가지 방법이 있습니다 :

    항목에 루프를하는 동 기적으로 각각의 요소에 접근하는 것은 매우 효율적이지 않습니다. 레디 스 2.4로, 당신이 원하는 것을 할 수있는 여러 가지 방법이 있습니다 :

    레디 스 2.6로, 당신은 또한 루아 스크립트를 사용할 수 있지만이 정말 여기에 필요하지 않습니다.

    그건 그렇고, 당신이 설명하는 데이터 구조는 해시를 사용하여 개선 될 수있다. 대신 별도의 키에 사용자 데이터를 저장, 당신은 해시 객체의 그룹을 수 있습니다.

    sort 명령을 사용하여

    당신은 하나 명의 왕복에있는 데이터를 검색 할 레디 스의 정렬 명령을 사용할 수 있습니다.

    redis> set users:1:name "daniel"
    OK
    redis> set users:1:age 24
    OK
    redis> set users:2:name "user2"
    OK
    redis> set users:2:age 24
    OK
    redis> sadd events:1:attendees users:1 users:2
    (integer) 2
    redis> sort events:1:attendees by nosort get *:name get *:age
    1) "user2"
    2) "24"
    3) "daniel"
    4) "24"
    

    파이프 라이닝을 사용하여

    루비 클라이언트 지원 파이프 라인 (즉, 능력은 레디 스에 여러 개의 쿼리를 서버에 전달하고 몇 가지 답변을 기다리는).

    keys = $redis.smembers("events:1:attendees")
    res = $redis.pipelined do
       keys.each do |x|
          $redis.mget(x+":name",x+":age")
       end
    end
    

    위의 코드는 두 왕복의 데이터를 검색합니다.

    가변 매개 변수 명령을 사용하여

    MGET 명령은 한 번에 여러 데이터를 검색하는 데 사용할 수 있습니다 :

    redis> smembers events:1:attendees
    1) "users:2"
    2) "users:1"
    redis> mget users:1:name users:1:age users:2:name users:2:age
    1) "daniel"
    2) "24"
    3) "user2"
    4) "24"
    

    여기에 비용은 또한 2 왕복입니다. 당신이 검색하는 키의 수는 제한되어 있음을 보장 할 수있는 경우에 작동합니다. 그렇지 않은 경우, 파이프 라인은 훨씬 더 나은 솔루션입니다.

  2. ==============================

    2.당신은 블록의 결과를 한번 루프 "서버 측"를 실행하는 루아 스크립트를 보내고 돌아 레디 스 'EVAL 명령을 사용할 수 있습니다.

    당신은 블록의 결과를 한번 루프 "서버 측"를 실행하는 루아 스크립트를 보내고 돌아 레디 스 'EVAL 명령을 사용할 수 있습니다.

  3. from https://stackoverflow.com/questions/10155398/getting-multiple-key-values-from-redis by cc-by-sa and MIT license