[REDIS] 레디 스`SCAN` : 방법과 일치하는 적절한 시간에 최종 결과를 확인 할 수 키를 newcomming 사이의 균형을 유지하기 위해?
REDIS레디 스`SCAN` : 방법과 일치하는 적절한 시간에 최종 결과를 확인 할 수 키를 newcomming 사이의 균형을 유지하기 위해?
나는 레디 스에 익숙한 아닙니다. 그 순간에 나는 약간의 실시간 서비스를 설계, 그리고 난에 의존하고 싶습니다. 나는 분당 ~ 10000-50000 키가 몇 가지 합리적인 EX 설정할 수 드물게 충분한 성능 병목 귀찮게하지 SCAN을 사용하여 그들을 일치 할 전망이다.
것은 나는 의심의 여지 "/의 속도 OUT"일부 SCAN 쿼리와 일치 수있는 키 가능한 overflooding 따라서 그것은 결코 종료 (즉, 항상 최신 커서 위치 및 계속하는 힘으로 응답, 쉽게 일어날 수있는 일 개 소비하는 X 항목의 경우 초당 Y로 들어오는 초당 X + Y 항목> 0)가있다.
분명히, 나는 충분히 SCAN 크기를 원하는 설정할 수 있습니다; 하지만 난 거기에 더 나은 솔루션을 존재하거나 레디 스 자체가 SCAN은 이러한 경우에 자동으로 크기가 증가 할 것으로 보장 않을 경우 궁금해?
해결법
-
==============================
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를 조정합니다.
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
'REDIS' 카테고리의 다른 글
[REDIS] 레디 스에게 평가 명령을 실행하는 것은 nodeJS에서 루아 스크립트를 실행하려면 (0) | 2020.02.15 |
---|---|
[REDIS] 레디 스에서 SCAN / HSCAN 명령에 대한 COUNT의 권장 값이 있습니까? (0) | 2020.02.15 |
[REDIS] Redigo 레디 스 풀 정말 전역 변수로되어 있습니까? (0) | 2020.01.26 |
[REDIS] 레디 스에 정보 명령에 의해 나열 만료되는 키의 수는 내가 보는 것과 일치하지 슬레이브 (0) | 2020.01.26 |
[REDIS] 레디 스 : 이상한 프로토콜 / 네트워크 오류 (0) | 2020.01.26 |