복붙노트

[REDIS] 레디 스`SCAN` : 방법과 일치하는 적절한 시간에 최종 결과를 확인 할 수 키를 newcomming 사이의 균형을 유지하기 위해?

REDIS

레디 스`SCAN` : 방법과 일치하는 적절한 시간에 최종 결과를 확인 할 수 키를 newcomming 사이의 균형을 유지하기 위해?

나는 레디 스에 익숙한 아닙니다. 그 순간에 나는 약간의 실시간 서비스를 설계, 그리고 난에 의존하고 싶습니다. 나는 분당 ~ 10000-50000 키가 몇 가지 합리적인 EX 설정할 수 드물게 충분한 성능 병목 귀찮게하지 SCAN을 사용하여 그들을 일치 할 전망이다.

것은 나는 의심의 여지 "/의 속도 OUT"일부 SCAN 쿼리와 일치 수있는 키 가능한 overflooding 따라서 그것은 결코 종료 (즉, 항상 최신 커서 위치 및 계속하는 힘으로 응답, 쉽게 일어날 수있는 일 개 소비하는 X 항목의 경우 초당 Y로 들어오는 초당 X + Y 항목> 0)가있다.

분명히, 나는 충분히 SCAN 크기를 원하는 설정할 수 있습니다; 하지만 난 거기에 더 나은 솔루션을 존재하거나 레디 스 자체가 SCAN은 이러한 경우에 자동으로 크기가 증가 할 것으로 보장 않을 경우 궁금해?

해결법

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

    1.우선 몇 가지 상황, 마지막에 솔루션 :

    우선 몇 가지 상황, 마지막에 솔루션 :

    종료 SCAN 명령에서> 보증

    그러나 COUNT 옵션에 말한다 :

    스캔 보증에서 염두에 두어야 할 중요 사항 :

    솔루션의 핵심은 커서 그 자체입니다. 레디 스 'SCAN 커서의 감각을 만들기를 참조하십시오. 커서가 정말 테이블 크기와 인덱스의 비트가 반전이기 때문 스캔의 진행의 비율을 추론 할 수있다.

    당신은 어떤 시간에 얼마나 많은 키를 얻을 수 있습니다 DBSIZE 또는 정보의 키 스페이스 명령을 사용 :

    > DBSIZE
    (integer) 200032
    > info keyspace
    # Keyspace
    db0:keys=200032,expires=0,avg_ttl=0
    

    정보의 또 다른 소스는 느낌을 얻기 위해, 문서화되지 않은 디버그 htstats 지수입니다 :

    > DEBUG htstats 0
    [Dictionary HT]
    Hash table 0 stats (main hash table):
     table size: 262144
     number of elements: 200032
     different slots: 139805
     max chain length: 8
     avg chain length (counted): 1.43
     avg chain length (computed): 1.43
     Chain length distribution:
       0: 122339 (46.67%)
       1: 93163 (35.54%)
       2: 35502 (13.54%)
       3: 9071 (3.46%)
       4: 1754 (0.67%)
       5: 264 (0.10%)
       6: 43 (0.02%)
       7: 6 (0.00%)
       8: 2 (0.00%)
    [Expires HT]
    No stats available for empty dictionaries
    

    테이블 크기는 키의 전화 번호 다음 2의 힘 : 키 : 200032 => 테이블 크기 : 262144

    우리는 모든 스캔 원하는 COUNT 인수를 계산합니다.

    당신은 주파수 10 Hz 인 (Hz 단위 F) (매 100 밀리 초)로 SCAN을 호출됩니다 말 당신은 그것을 (들에서 T) 오초에서 수행합니다. 당신이이 예에서 N = F * T 통화, N = 50에 완료 할 수 있도록.

    남은 %는 RP = 1 (100 %), 그래서 첫 번째 스캔하기 전에, 현재 진행 0 알고있다.

    모든 SCAN 전화 (또는 당신이 DBSIZE 호출의 왕복 시간 (RTT)을 저장할 경우 COUNT를 조정하려는 전화의 모든 주어진 수의) 전에 K. 키의 수를 얻기 위해 DBSIZE 전화

    당신은 COUNT = K * RP / N을 사용합니다

    제 호, 이것은 COUNT = 200,032 * 50분의 1 = 4000이다.

    ReversedCursor / NextPowerOfTwo (K) - 다른 전화의 경우, 계산의 RP = 1이 필요합니다.

    예를 들어, 당신은 이제 N = 30 (통화 가능 매수), 이미 20 호출을 수행 있다고 가정 해 봅시다. 당신은 DBSIZE이라고하며이 수단 NextPowerOfTwo (K)이 524,288을 = 281569. =이이 ^ 19 (2) K를 얻었다.

    당신의 다음 커서 진수 14509 = 이진 000011100010101101입니다. 테이블 크기가 19 ^ 2, 우리는 18 비트를 나타낸다.

    당신은 비트를 반전하고 진수 185456 = 이진 101101010001110000를 얻을. 우리가 524288과에서 185,456 덮여있는이 수단 :

    RP = 1 - ReversedCursor/NextPowerOfTwo(K) = 1 - 185456 / 524288 = 0.65 or 65%
    

    당신은 조정해야 그래서 :

    COUNT = K*RP/N = 281569 * 0.65 / 30 = 6100
    

    그래서 다음 SCAN 통화에서 당신은 6100 차종 그것 때문에 증가 감지 사용

    이 모든 것은 당신이 모든 열쇠를지고 가정이었다. 당신이있는 거 패턴 매칭하면 찾을 수 키의 남은 양을 추정하는 과거를 사용해야합니다. 우리는 COUNT 계산에 인자 PM (일치의 퍼센트)로 추가.

    COUNT = PM * K*RP/N
    
    PM = keysFound / ( K * ReversedCursor/NextPowerOfTwo(K))
    

    20 호출 후, 당신은 만 keysFound = 2000 개 키를 발견하는 경우 :

    PM = 2000 / ( 281569 * 185456 / 524288) = 0.02
    

    이 수단은 키의 2 %는 그래서 지금까지 우리의 패턴과 일치하는

    COUNT = PM * K*RP/N = 0.02 * 6100 = 122
    

    이 알고리즘은 아마 향상,하지만 당신은 아이디어를 얻을 수 있습니다.

    당신은 당신이 (N)가이 작업을 수행 할 필요가 얼마나 많은 통화에 대한 기대를 완화 할 수 있으므로 COUNT 번호에 대한 몇 가지 벤치 마크를 실행해야합니다 당신은 당신의 SCAN 복용이 몇 밀리 초를 측정하기 시작하는 데 사용할 합리적인 서버를 차단하지 않고 시간, 그에 따라 F와 T를 조정합니다.

  2. from https://stackoverflow.com/questions/59564896/redis-scan-how-to-maintain-a-balance-between-newcomming-keys-that-might-match by cc-by-sa and MIT license