복붙노트

[REDIS] 레디 스 스캔 수 : 어떻게 패턴과 일치하는 모든 키를 반환 SCAN을 강제로?

REDIS

레디 스 스캔 수 : 어떻게 패턴과 일치하는 모든 키를 반환 SCAN을 강제로?

나는 레디 스에서 패턴과 일치하는 키 목록에 저장된 값을 찾기 위해 노력하고있다. 나는 그래서 나중에 내가 모든 값을 얻을 수 MGET을 사용할 수 있습니다에 SCAN을 사용했는데, 문제는 :

SCAN 0 MATCH "foo:bar:*" COUNT 1000

값 반면을 반환하지 않습니다

SCAN 0 MATCH "foo:bar:*" COUNT 10000

원하는 키를 돌려줍니다. 어떻게하면 기존의 모든 키를 통해보고 SCAN을 강요하는 걸까? 나는이에 대한 루아에보고해야합니까?

해결법

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

    1.당신이 아래의 코드는 커서 0에서 1000 첫 번째 개체를 검색합니다 함께

    당신이 아래의 코드는 커서 0에서 1000 첫 번째 개체를 검색합니다 함께

    SCAN 0 MATCH "foo:bar:*" COUNT 1000 
    

    결과에서는 리콜에 새로운 커서를 얻을 것이다

    SCAN YOUR_NEW_CURSOR MATCH "foo:bar:*" COUNT 1000
    

    1000 다음 개체를 검사합니다. 그럼 당신은 다음의 경우에 더 키와 일치하는 당신이 더 많은 키를 스캔 데이터를 1000 1000에서 COUNT를 증가 및 검색 할 때.

    당신이 응답 리턴 제로의 커서주고 때까지 리콜 SCAN에 필요한 전체 목록 (즉 전체 스캔) 스캔하려면

    사용 정보는 같은 키의 당신의 양을 얻을 명령

    그런 다음 호출

    SCAN 0 MATCH "foo:bar:*" COUNT YOUR_AMOUNT_OF_KEYS
    
  2. ==============================

    2.그냥 파이썬 레디 스 라이브러리를 사용하여 작업을 수행하는 방법에 관심있는 사람들을위한 여기를 넣어 것 :

    그냥 파이썬 레디 스 라이브러리를 사용하여 작업을 수행하는 방법에 관심있는 사람들을위한 여기를 넣어 것 :

    import redis
    redis_server = redis.StrictRedis(host=settings.redis_ip, port=6379, db=0)
    mid_results = []
    cur, results = redis_server.scan(0,'foo:bar:*',1000)
    mid_results += results
    
    while cur != 0:
        cur, results = redis_server.scan(cur,'foo:bar:*',1000)
        mid_results += results
    
    final_uniq_results = set(mid_results)
    

    그것은이 아웃을 내기 위해 몇 일이 걸렸다 있지만, 기본적으로 각각의 검사는 튜플을 반환합니다.

    예를 들면 :

    (cursor, results_list)
    
    (5433L, [... keys here ...])
    (3244L, [... keys here, maybe ...])
    (6543L, [... keys here, duplicates maybe too ...])
    (0L, [... last items here ...])
    

    나는 커서 번호가 무엇인지 알아내는 힘든 시간이 있었고, 나는 무작위로 빈 목록 또는 반복되는 항목을받을 이유지만, 비록 난 그냥에서 항목을 넣어 알고 있었다.

    읽고 나서:

    그것은 더 의미를 만들었지 만, 여전히 몇 가지 깊은 프로그래밍 마법과 세트 반복하는 일이 타협.

  3. ==============================

    3.알림이 당신이 레디 스 파이썬 라이브러리에 scan_iter 방법을 사용하는 경우 간단한 작업은 다음과 같습니다

    알림이 당신이 레디 스 파이썬 라이브러리에 scan_iter 방법을 사용하는 경우 간단한 작업은 다음과 같습니다

    from redis import StrictRedis
    
    redis = StrictRedis.from_url(REDIS_URI)
    
    keys = []
    for key in redis.scan_iter('foo:bar:*', 1000):
        keys.append(key)
    

    결국, 키는 당신의 방법 @khanou을 적용하여 얻을 수있는 모든 키를 포함합니다.

    그 루프의 각 반복에 새로운 클라이언트를 생성하기 때문에이 또한 쉘 스크립트를하는 것보다 더 효율적입니다.

  4. from https://stackoverflow.com/questions/33166812/redis-scan-count-how-to-force-scan-to-return-all-keys-matching-a-pattern by cc-by-sa and MIT license