복붙노트

[REDIS] 레디 스 목록에 값으로 항목의 인덱스를 가져옵니다

REDIS

레디 스 목록에 값으로 항목의 인덱스를 가져옵니다

나는 순간에 대기열로 사용하고, 내가 생성 한 레디 스 목록이 그 동안에 한 번 반전. 내 문제는 내가 값으로 해당 큐 / 목록에있는 항목의 인덱스를 얻을 수 있도록하고 싶습니다이다.

나는 다음과 같은 값 목록이있는 경우 :

{"dan","eduardo","pedro"}

인덱스는 다음과 같습니다

0 : "dan"
1 : "eduardo"
2 : "pedro"

내 목록에 그 값의 인덱스를 얻을 수있는 가치를 전달하여 수 있어야합니다.

"에두아르도"다시 얻을 '1'처럼.

그래서 당신이 그것을 어떻게 할 것인지가 가능합니까?

나는 정상에서 항목을 제거하고 하단에 추가 내 목록에 큐 명령을 수행하고 있음을 또한 내가 말을해야 뭔가입니다.

나는 현재 Node.js를 0.6.6 최신과 최신 레디 스 모듈 버전 2.4.4 레디 스를 사용하고 있습니다.

난 그냥 레디 스-CLI의 솔루션에 대한 기쁘게 생각합니다.

또한 혼자 레디 스에 그것을 할 수 있어야 다음 다른 아무 제약이없고, 외부 프로세스 등 그러나 당신이 그것을 위해 루아 이동과 EVAL 명령을 사용합니다.

편집하다

또한 나는 내 대답은 정렬 된 세트하지 큐에있을 수 있습니다 생각합니다.

해결법

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

    1.나는이에 대한 nodejs 클라이언트 세부 사항을 잘 모르겠지만, 다음은 루아에서 매우 간단한 같이 IndexOf 명령의 구현입니다.

    나는이에 대한 nodejs 클라이언트 세부 사항을 잘 모르겠지만, 다음은 루아에서 매우 간단한 같이 IndexOf 명령의 구현입니다.

    내 파일 indexof.lua에서 나는 다음과 같은 코드가 있습니다 :

    local key = KEYS[1]
    local obj = ARGV[1]
    local items = redis.call('lrange', key, 0, -1)
    for i=1,#items do
        if items[i] == obj then
            return i - 1
        end
    end 
    return -1
    

    으로 myList에 몇 가지 값을 밀어 수 있습니다.

    > rpush mylist foo bar baz qux
    (integer) 4
    

    우리는 목록에서 값의 인덱스를 찾기 위해 루아 스크립트를 사용할 수 있습니다. 명령은 O (N)이다.

    $ redis-cli --eval indexof.lua mylist , bar
    (integer) 1
    

    바 인덱스는 1

    > lindex mylist 1
    "bar"
    

    닐의 지수 -1

    $ redis-cli --eval indexof.lua mylist , nil
    (integer) -1
    

    EVAL 명령에 http://redis.io/commands/eval 추가 문서를보십시오.

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

    2.사용 큐를 구현하기 위해 세트를 분류.

    사용 큐를 구현하기 위해 세트를 분류.

    회원을 추가하고 점수로 타임 스탬프를 사용합니다.

    > ZADD queue 1326990501 foo 1326990502 bar 1326990503 baz 1326990504 qux
    (integer) 4
    

    당신은 각각 ZRANGE 및 ZREVRANGE를 사용하여 FIFO 및 LIFO 순서로 멤버를 반환 할 수 있습니다.

    FIFO :

    > ZRANGE queue 0 0
    "foo"
    

    LIFO :

    > ZREVRANGE queue 0 0
    "qux"
    

    회원이 사용 ZRANK의 인덱스를 찾을 수 있습니다. ZRANK 연산은 O이다 (로그 (N))

    > ZRANK queue bar
    (integer) 1
    
  3. ==============================

    3.당신은 지금 말할 수있는 바와 같이, 레디 스 같은 작업 (슬픈 얼굴)을 지원하지 않습니다.

    당신은 지금 말할 수있는 바와 같이, 레디 스 같은 작업 (슬픈 얼굴)을 지원하지 않습니다.

    사람이 같은 동작을 이해하는 이유에 꽤 좋은 발언을했다하지만, 살바토레 같은 외모가 곧 언제든지 구현하지 않습니다.

    (다른 답변으로 지적) 두 가지 해결 방법은 기본적으로 :

    처음부터 O (N)와 후자 단지 O (로그 (N)) 당신은 아마 말할 수는 어느 쪽이 성능이 뛰어 다른.

    어쨌든 나는 시험 *에 넣어하기로 결정했습니다 :

    ╔════════════════╦═══════════════════════╦══════════════════════╗
    ║                ║ Sorted Set with ZRANK ║ List with lua script ║
    ╠════════════════╬═══════════════════════╬══════════════════════╣
    ║  1000 elements ║   0.0638264 seconds   ║   0.2723238 seconds  ║
    ╠════════════════╬═══════════════════════╬══════════════════════╣
    ║ 10000 elements ║   00.4484714 seconds  ║  41.0661683 seconds  ║
    ╚════════════════╩═══════════════════════╩══════════════════════╝
    

    그래, 그건 그냥 만 요소 41 초 비틀입니다.

    *와 StackExchange.Redis 1.0.488되어 컴파일러 최적화와 윈도우 7, 레디 스 2.8 (MSOpenTech 포트), .NET 4.

  4. ==============================

    4.redis.io의 문제 목록에 티켓 (140)에 따라

    redis.io의 문제 목록에 티켓 (140)에 따라

    기능 요청 : 장난

    "그것이 O (N) 명령과 데이터 레이아웃 디자인에 약간의 오류가있는 경우에만 일반적으로 필요에 따라 생각 하나 둘 다 안녕,이 명령은 가능성이 구현되지 않습니다." https://github.com/antirez/redis/issues/140에 살바토레 대해 Sanfilippo에 의해.

    나는 아니에요 확신하는 이유와 데이터 설계에 오류가있을 수 값을 기준으로 항목의 인덱스를 발견하고자하는 방법에 대해 설명합니다. 그러나 그는 당신이 루아 코드 및 / 또는 정렬 된 세트를 사용할 수있는 것이 분명합니다.

    그래서 그것의 최대 샷은 다음 루아 스크립트를 사용하여 다른 목록에서 항목의 인덱스를 알아내는 방법이 없다는 것입니다.

    그러나 구현에 따라 즉, 데이터가 대신리스트의 분류 세트를 고려하는 것이 더 좋을 수 있습니다 디자인합니다.

  5. ==============================

    5.사용하여 정렬 세트 (ZADD 등) 당신은 ZRANK를 사용할 수 있습니다.

    사용하여 정렬 세트 (ZADD 등) 당신은 ZRANK를 사용할 수 있습니다.

    편집 : 목록 변경, 그것은는하지만, 목록 만 RPUSH를 사용하여 자란다 때문에 아래 내 오래된 대답은하지 작업을 수행합니다.

    당신은 키와 값 (또는 해시)와 인덱스를 저장할 수 :

    set listvalue listindex
    

    위해서는 당신이 listname와 그 열쇠를 앞에 수, 당신의 레디 스이 조직 유지 :

    set listname:listvalue listindex
    
  6. from https://stackoverflow.com/questions/8899111/get-the-index-of-an-item-by-value-in-a-redis-list by cc-by-sa and MIT license