>  기사  >  데이터 베이스  >  Redis가 단일 스레드인 이유와 속도가 빠른 이유는 무엇입니까?

Redis가 단일 스레드인 이유와 속도가 빠른 이유는 무엇입니까?

青灯夜游
青灯夜游앞으로
2021-05-12 10:57:445908검색

Redis가 단일 스레드인 이유와 속도가 빠른 이유는 무엇입니까?

Java 관련 인터뷰에서는 거의 모두 캐싱에 대해 질문합니다. 보다 기본적인 인터뷰에서는 "28/20 규칙"이 무엇인지 묻고, 더 복잡한 인터뷰에서는 캐시에 대해 묻습니다. 눈사태, 캐시 침투, 캐시 예열, 캐시 업데이트, 캐시 다운그레이드 및 기타 문제. 일반적으로 사용되는 캐시 서버에는 모두 Redis, Memcached 등이 포함되며 저자가 가장 일반적으로 사용하는 것은 다음과 같습니다. Redis만 있습니다.

면접관이 "Redis는 왜 단일 스레드라고 하며 Redis는 왜 그렇게 빠른가요!"라고 묻는 것을 본 적이 없다면, 》 그렇다면 이 글을 읽으시면 정말 행운이라는 생각이 드실 겁니다! 만약 당신이 뛰어난 면접관이라면 이 질문을 사용하여 "물을 꿰뚫어 보는" 당신 반대편 친구를 인터뷰하여 그의 숙달을 테스트할 수도 있습니다.

알겠습니다! 요점을 파악하세요! 먼저 Redis가 무엇인지, Redis가 왜 그렇게 빠른지에 대해 논의한 다음 Redis가 단일 스레드인 이유에 대해 논의해 보겠습니다. [관련 추천: Redis 동영상 튜토리얼]

1. Redis 소개

Redis는 데이터베이스, 캐시, 메시지 미들웨어로 사용할 수 있는 오픈 소스 인메모리 데이터 구조 저장 시스템입니다.

문자열, 해시, 목록, 집합, 정렬된 집합 또는 ZSet과 같은 여러 유형의 데이터 구조와 범위 쿼리, 비트맵, 하이퍼로그로그 및 지리공간 인덱스 반경 쿼리를 지원합니다. 그 중 다섯 가지 일반적인 데이터 구조 유형은 String, List, Set, Hash 및 ZSet입니다.

Redis에는 Redis Sentinel을 통해 복제, LUA 스크립팅, LRU 제거, 트랜잭션 및 다양한 수준의 디스크 지속성이 내장되어 있으며 자동 파티셔닝(클러스터)은 고가용성(High Availability)을 제공합니다.

Redis는 또한 사용자가 저장을 위해 데이터를 디스크에 저장할 수 있는 지속성 옵션을 제공합니다. 실제 상황에 따라 특정 간격으로 데이터 세트를 디스크로 내보내거나(스냅샷) 명령 로그에 추가할 수 있습니다(AOF는 파일만 추가함). 쓰기 명령을 실행할 때 실행된 쓰기 명령을 하드에 복사합니다. 디스크. 지속성을 끄고 Redis를 효율적인 네트워크 캐시 데이터 기능으로 사용할 수도 있습니다.

Redis는 테이블을 사용하지 않으며 데이터베이스는 사용자가 Redis에 저장된 다른 데이터를 미리 정의하거나 연결하도록 강요하지 않습니다.

데이터베이스의 작동 모드는 저장 방법에 따라 하드 디스크 데이터베이스와 메모리 데이터베이스로 나눌 수 있습니다. Redis는 데이터를 메모리에 저장하며, 데이터를 읽고 쓸 때 하드 디스크의 I/O 속도에 제한을 받지 않으므로 속도가 매우 빠릅니다.

(1) 하드 디스크 데이터베이스의 작업 모드:

Redis가 단일 스레드인 이유와 속도가 빠른 이유는 무엇입니까?

(2) 인 메모리 데이터베이스의 작업 모드:

Redis가 단일 스레드인 이유와 속도가 빠른 이유는 무엇입니까?

위의 설명을 읽은 후 일반적인 Redis 관련 인터뷰에 대해 알고 계십니까? 예를 들어 Redis가 무엇인지, Redis의 일반적인 데이터 구조 유형은 무엇인지, Redis는 어떻게 지속되는지 등을 질문할 수 있습니다.

2. Redis는 얼마나 빠른가요?

Redis는 단일 프로세스 단일 스레드 모델을 사용하는 메모리 기반 KV 데이터베이스를 사용합니다. C 언어로 작성되었습니다. 공식적으로 제공되는 데이터는 QPS(초당 쿼리 수)에 도달할 수 있습니다.

이 데이터는 단일 프로세스와 멀티스레딩을 사용하는 동일한 메모리 기반 KV 데이터베이스인 Memcached보다 나쁘지 않습니다!

Redis가 단일 스레드인 이유와 속도가 빠른 이유는 무엇입니까?

가로축은 연결수, 세로축은 QPS입니다. 이때 이 사진은 크기의 순서를 반영하고 있으므로 인터뷰 중에 답변이 크기의 순서에 따라 크게 다른지 묻지 마십시오.

3. Redis는 왜 이렇게 빠른가요?

1. 완전히 메모리를 기반으로 하며 대부분의 요청은 순수 메모리 작업이며 매우 빠릅니다. HashMap과 마찬가지로 데이터가 메모리에 저장되는 장점은 검색 및 연산의 시간 복잡도가 O(1)이라는 것입니다.

2. Redis의 구조는 특별히 설계되었습니다.

3. 단일 스레드를 사용하면 불필요한 컨텍스트 전환 및 경쟁 조건이 방지됩니다. CPU를 소비하는 여러 프로세스나 스레드로 인한 전환이 없으며 다양한 잠금 문제를 고려할 필요가 없습니다. 잠금 해제. 교착 상태로 인한 성능 소모 없음

4. 다중 채널 I/O 다중화 모델, 비차단 IO 사용

5. 클라이언트 간 통신을 위한 애플리케이션 프로토콜은 다릅니다. Redis는 자체 VM 메커니즘을 직접 구축합니다. 왜냐하면 일반 시스템이 시스템 기능을 호출하면 이동 및 요청에 일정 시간이 낭비되기 때문입니다.

위 사항은 비교적 이해하기 쉽습니다. 아래에서는 다중 채널 I/O 다중화 모델에 대해 간략하게 설명합니다.

(1) 다중 채널 I/O 다중화 모델

다중 채널 I/O 다중화 모델은 다음과 같습니다. select, poll 및 epoll을 사용하려면 여러 스트림의 I/O 이벤트를 동시에 모니터링할 수 있습니다. 유휴 상태일 때 하나 이상의 스트림에 I/O 이벤트가 있으면 종료됩니다. 차단된 상태에서 깨어나면 프로그램은 모든 스트림을 폴링하고(epoll은 실제로 이벤트를 생성한 스트림만 폴링함) 준비된 스트림만 순서대로 처리합니다.

여기서 "다중"은 여러 네트워크 연결을 의미하고 "재사용"은 동일한 스레드를 재사용하는 것을 의미합니다.

다중 채널 I/O 다중화 기술을 사용하면 단일 스레드가 여러 연결 요청을 효율적으로 처리할 수 있으며(네트워크 IO의 시간 소모 최소화) Redis는 메모리의 데이터를 매우 빠르게 처리합니다. 위의 사항은 주로 Redis의 높은 처리량에 기여합니다.

4. Redis는 왜 단일 스레드인가요?

위의 모든 분석은 Redis가 빠른 분위기를 조성하기 위한 것임을 먼저 이해해야 합니다! 공식 FAQ에는 Redis가 메모리 기반 작업이기 때문에 CPU가 Redis의 병목 현상이 되지 않는다고 명시되어 있습니다. Redis의 병목 현상은 시스템 메모리 크기나 네트워크 대역폭 때문일 가능성이 높습니다. 싱글 스레딩은 구현하기 쉽고 CPU에 병목 현상이 발생하지 않으므로 싱글 스레드 솔루션을 채택하는 것이 논리적입니다(결국 멀티 스레딩을 사용하면 많은 문제가 발생합니다!).

이거 보면 울 수도 있어요! 단일 스레드를 사용하여 Redis를 이렇게 빠르게 만드는 데에는 몇 가지 주요 기술적인 점이 있을 것이라고 생각했지만, 우리를 속이는 듯한 공식적인 답변은 기대하지 않았습니다! 그러나 우리는 Redis가 왜 그렇게 빠른지 이미 명확하게 설명할 수 있으며, 정확하게는 Redis가 단일 스레드 모드에서 이미 빠르기 때문에 멀티 스레딩을 사용할 필요가 없습니다!

그러나 우리의 단일 스레드 접근 방식은 멀티 코어 CPU 성능을 활용할 수 없지만 단일 머신에서 여러 Redis 인스턴스를 열어 성능을 향상시킬 수 있습니다!

경고 1: 여기서 강조한 단일 스레드는 네트워크 요청을 처리할 때 단 하나의 스레드입니다. 정식 Redis 서버는 실행 시 한 번 이상 주의가 필요합니다. 예를 들어 Redis가 지속되면 하위 프로세스 또는 하위 스레드로 실행됩니다(특정 하위 스레드 또는 하위 프로세스는 독자가 깊이 연구해야 함). 예를 들어 Redis 프로세스를 확인했습니다. 테스트 서버에서 프로세스 아래에 있는 스레드를 찾았습니다.

Redis가 단일 스레드인 이유와 속도가 빠른 이유는 무엇입니까?

ps 명령의 "-T" 매개 변수는 스레드 표시(SPID 열 포함)를 나타냅니다. "SID" 열은 스레드 ID를 나타냅니다. "CMD" 열에는 스레드 이름이 표시됩니다.

경고 2: 위 그림의 FAQ 마지막 문단에는 Redis 4.0 버전부터 멀티스레딩이 지원되지만 특정 작업에 대해서만 멀티스레딩 작업을 수행한다고 명시되어 있습니다! 따라서 이 기사가 향후 버전에서도 여전히 단일 스레드로 유지되는지 여부를 독자가 확인해야 합니다!

5. Notes

1. 우리는 Redis가 고성능 메모리 데이터 서비스를 구현하기 위해 "단일 스레드 다중화 IO 모델"을 사용한다는 것을 알고 있습니다. 메커니즘은 sunion과 같이 시간이 많이 걸리는 명령을 실행할 때 redis의 동시성을 감소시킵니다.

단일 스레드이기 때문에 동시에 하나의 작업만 진행됩니다. 따라서 시간이 많이 걸리는 명령은 읽기 동시성뿐만 아니라 쓰기 동시성도 저하시킵니다. 단일 스레드는 하나의 CPU 코어만 사용할 수 있으므로 동일한 멀티 코어 서버에서 여러 인스턴스를 시작하여 마스터-마스터 또는 마스터-슬레이브를 구성할 수 있으며 시간이 많이 걸리는 읽기 명령을 슬레이브에서 완전히 수행할 수 있습니다.

Redis.conf 변경해야 하는 항목:

pidfile /var/run/redis/redis_6377.pid #pidfile에 포트 번호를 추가해야 합니다

port 6377 #이 항목을 변경해야 합니다

logfile /var/log/redis / redis_6377.log # 로그 파일 이름에도 포트 번호가 추가됩니다

dbfilename dump_6377.rdb #rdbfile에도 포트 번호가 추가됩니다

2 "우리는 운영 체제 로드 밸런싱을 할 수 없습니다. CPU를 너무 많이 소모하거나 중요한 프로세스가 다른 프로세스로 붐비는 일 없이 CPU 코어를 수동으로 할당할 수 있습니다. "

CPU는 단일 스레드이기 때문에 중요한 요소입니다. 모델, Redis 다중 코어보다는 대용량 캐시와 빠른 CPU를 선호합니다.

멀티 코어 CPU 서버에서 Redis 성능은 NUMA 구성 및 프로세서 바인딩 위치에 따라 달라집니다. 가장 분명한 영향은 redis-benchmark가 CPU 코어를 무작위로 사용한다는 것입니다. 정확한 결과를 얻으려면 고정 프로세서 도구를 사용해야 합니다(Linux에서는 작업 세트를 사용할 수 있음). 가장 효과적인 방법은 클라이언트와 서버를 두 개의 서로 다른 CPU로 분리하여 3차 캐시를 사용하는 것입니다.

6. Extension

다음에도 꼭 알아두셔야 할 모델이 몇 가지 있습니다. 성공적인 인터뷰를 기원합니다!

1. 단일 프로세스 다중 스레드 모델: MySQL, Memcached, Oracle(Windows 버전)

2. 다중 프로세스 모델: Oracle(Linux 버전)

3. Nginx에는 두 가지 유형의 프로세스가 있습니다. 하나는 마스터 프로세스(관리 프로세스와 동일)이고 다른 하나는 작업자 프로세스(실제 프로세스)입니다. 작업 과정). 두 가지 시작 방법이 있습니다.

(1) 단일 프로세스 시작: 이때 시스템에는 마스터 프로세스와 작업자 프로세스의 역할을 모두 수행하는 프로세스가 하나만 있습니다.

(2) 다중 프로세스 시작: 현재 시스템에는 단 하나의 마스터 프로세스가 있고 적어도 하나의 작업자 프로세스가 작동 중입니다.

(3) 마스터 프로세스는 주로 일부 전역 초기화 작업을 수행하고 작업자 이벤트 처리는 작업자에서 수행됩니다.

Redis가 단일 스레드인 이유와 속도가 빠른 이유는 무엇입니까?

더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 소개를 방문하세요! !

위 내용은 Redis가 단일 스레드인 이유와 속도가 빠른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제