2016-10-14 2 views
0

redis에 약간의 혼동이 있습니다. 나는 자기 습득을 학습하고있다.Redis 요청 처리 내부

나는 redis가 단일 스레드라는 것을 알아야하고 이벤트 루프의 개념에서 작동합니다. 따라서 읽기/쓰기 작업은 redis로 직렬화되며 경쟁 조건이 없습니다.

내 혼란은 - 내가 순진하게 단일 스레드 아키텍처에 대해 생각할 때, 나는 모든 읽기/쓰기 요청이 모이고 스레드가 하나씩 그것을 스케쥴링하는 버퍼가 있다고 상상할 수 있습니다. 하지만 수천 또는 수백만 건의 요청을 처리해야하는 실제 인터넷 응용 프로그램에서 redis가 대기 시간없이 이러한 요청을 처리하는 방법은 무엇입니까? 일부 쓰기 작업에 몇 밀리 초가 걸리면 그 시간 동안 다른 읽기 쓰기 작업을 차단합니까?

redis는 관계형 데이터베이스와 같은 잠금 개념을 구현합니까? 그렇지 않다면 redis가 상당한 대기 시간없이 수천 건의 읽기/쓰기를 처리하는 방법은 무엇입니까?

모든 내부/예제는 향후 연구에 유용 할 것입니다.

답변

1

Redis 내부를 잘 이해하고 있습니다. 잠금 시스템이 없습니다. 모든 작업은 원자 적이며 차단됩니다.

Redis 사용시 권장 사항은 긴 요청 대신 여러 번의 짧은 요청을하는 것입니다. 많은 수의 키 또는 대용량 데이터 구조로 작업하는 경우 요청을 작성할 때 Redis Commands 설명서에 언급 된 시간 복잡성을 고려하십시오. KEYS 명령을 피하십시오. SCAN 명령 계열보다 선호하십시오. EVAL 명령을 사용하여 Redis로 보낼 Lua 스크립트를 작성할 때 더욱 신중해야합니다.

각 요청은 실행 시간이 매우 짧기 때문에 대부분의 사용 사례에서 Redis 명령은 주어진 명령을 실행하는 동안 다른 명령에 응답하지 않습니다.

대부분의 경우 제한 요인은 레디 스 자체가 아니라 네트워크입니다.

그러나 일부 사용 사례에서는 Redis 제한 (매우 높음)이 발생할 수 있습니다. 이 경우 multiple Redis instances을 마스터 - 슬레이브 모드 (복제, Redis Sentinel으로 모니터링)로 사용할 수 있으며 요청을 읽기 위해 인스턴스간에로드 밸런싱을 수행 할 수 있습니다. 여러 Redis 인스턴스 앞에 twemproxy과 같은 도구를 사용할 수도 있습니다.