Redis의 비동기 메커니즘은 무엇입니까

王林
풀어 주다: 2023-06-01 20:14:40
앞으로
1315명이 탐색했습니다.

1. Redis 차단 지점

Redis 인스턴스와 상호 작용하는 개체 및 상호 작용 중에 발생하는 작업:

  • 클라이언트: 네트워크 IO, 키-값 쌍 추가, 삭제, 수정 및 쿼리 작업, 데이터베이스 작업

  • 디스크: RDB 스냅샷 생성, AOF 로그 기록 및 AOF 로그 재작성

  • 마스터-슬레이브 노드: 마스터 라이브러리는 RDB 파일을 생성 및 전송하고, 슬레이브 라이브러리는 RDB 파일을 수신하고, 데이터베이스를 지우고, RDB 파일을 로드합니다.

  • 클러스터 인스턴스 슬라이싱 : 해시 슬롯 정보를 다른 인스턴스로 전송하고 데이터를 마이그레이션합니다.

4 클래스 대화형 개체와 특정 작업 간의 관계:

Redis의 비동기 메커니즘은 무엇입니까

클라이언트와 상호 작용할 때 차단 지점:

네트워크 IO는 때때로 느리지만 Redis는 IO 다중 채널을 사용합니다. 재사용 메커니즘으로 인해 기본 스레드는 항상 네트워크 연결이나 요청 도착을 기다리지 않으므로 네트워크 IO는 Redis를 차단하는 요인이 아닙니다. Redis 메인 스레드의 주요 작업은 클라이언트와 상호 작용하는 키-값 쌍의 추가, 삭제, 수정 및 쿼리 작업을 수행하는 것입니다. 매우 복잡한 추가, 삭제, 수정 및 쿼리 작업은 확실히 Redis를 차단합니다.

연산의 복잡도를 판단하는 기준:

연산의 복잡도가 O(N)

인지 확인하세요. Redis의 첫 번째 차단점: 전체 컬렉션 쿼리 및 집계 작업:

Redis에서 컬렉션과 관련된 작업의 복잡성은 일반적으로 O(N)이므로 사용 시 주의가 필요합니다.

예를 들어 집합 요소

전체 쿼리
연산 HGETALL, SMEMBERS 및 집계 통계집합 연산(교집합, 합집합, 차이 등)이 있습니다. Redis의 두 번째 차단 지점: bigkey 삭제 작업

컬렉션 자체의 삭제 작업에도 잠재적인 차단 위험이 있습니다. 삭제 작업의 핵심은 키-값 쌍이 차지하는 메모리 공간을 해제하는 것입니다. 메모리 해제는 메모리 공간을 보다 효율적으로 관리하기 위한 첫 번째 단계일 뿐입니다. 애플리케이션이 메모리를 해제할 때 운영 체제는 해제된 메모리 블록을 후속 관리 및 재할당을 위해 사용 가능한 메모리 블록의 연결된 목록에 삽입해야 합니다.

이 프로세스 자체는 일정 시간이 걸리며 현재 메모리를 해제하고 있는 애플리케이션을 차단하게 됩니다. 많은 양의 메모리를 한 번에 해제하면 여유 메모리 차단 연결 목록의 작업 시간이 늘어나므로 Redis가 차단할 메인 스레드.

대량의 메모리를 해제할 시간: 많은 수의 키-값 쌍을 삭제할 때 많은 수의 요소가 포함된 컬렉션을 삭제하는 것을

bigkey 삭제

라고도 합니다. 요소 수가 다른 세트를 삭제할 때 소요되는 시간:

Redis의 비동기 메커니즘은 무엇입니까세 가지 결론이 도출됩니다.

    요소 수가 100,000에서 100만 개로 증가하면 4가지 주요 컬렉션 유형 삭제 시간 증가 5배에서 거의 20배로 늘어났습니다.
  • 세트 요소가 클수록 삭제하는 데 시간이 더 걸립니다.
  • 100만 개의 요소가 포함된 세트를 삭제하면 해시 유형의 최대 크기가 삭제됩니다. 1.98초의 절대값에 도달했습니다. 일반적인 상황에서 Redis 응답 시간은 마이크로초 수준이지만 작업을 실행하는 데 거의 2초가 걸리면 메인 스레드가 차단되며 이는 불가피합니다.
  • Redis의 세 번째 차단 지점: 데이터베이스 지우기

키-값 쌍을 자주 삭제하는 것은 잠재적인 차단 지점이므로 데이터베이스를 지우는 것(예: FLUSHDB 및 FLUSHALL 작업)도 Redis 데이터베이스의 잠재적인 차단 지점입니다. -레벨 작업. 모든 키-값 쌍을 삭제하고 해제하는 작업이 포함되므로 차단 위험이 있습니다.

Redis의 네 번째 차단 포인트: AOF 로그 동기화 쓰기

디스크 IO는 일반적으로 시간이 많이 걸리고 힘들기 때문에 집중해야 합니다. Redis 개발자는 디스크 IO가 차단을 유발할 수 있다는 사실을 오랫동안 인식해 왔기 때문에 Redis는 하위 프로세스를 사용하여 RDB 스냅샷 파일을 생성하고 AOF 로그 재작성 작업을 수행하도록 설계되었습니다. 하위 프로세스는 실행을 담당하며 느린 디스크 IO는 기본 스레드를 차단하지 않습니다.

Redis가 AOF 로그를 직접 기록하는 경우 다양한 쓰기 전략을 사용하여 디스크에 데이터를 씁니다. 동기 디스크 쓰기 작업에는 약 1~2ms가 소요됩니다. AOF 로그에 많은 수의 쓰기 작업을 기록하고 동기적으로 다시 써야 하는 경우 기본 스레드가 차단됩니다.

Redis의 다섯 번째 차단 지점: 슬레이브 라이브러리에서 RDB 파일 로드

마스터-슬레이브 클러스터에서 마스터 라이브러리는 RDB 파일을 생성하여 슬레이브 라이브러리로 전송해야 합니다.

메인 라이브러리의 복사 프로세스 중에

RDB 파일 생성 및 전송은 하위 프로세스에 의해 완료되며

메인 스레드를 차단하지 않습니다. 그러나 RDB 파일을 받은 후 슬레이브 라이브러리는 FLUSHDB 명령을 사용하여 현재 데이터베이스를 지워야 하며, 이는 세 번째 차단 지점에 도달합니다.
현재 데이터베이스를 지운 후 슬레이브 라이브러리는 RDB 파일을 메모리에 로드해야 합니다. 이 프로세스의 속도는 RDB 파일의 크기와 밀접한 관련이 있으며 로드 프로세스가 느려집니다.

슬라이싱 클러스터 인스턴스 상호 작용 시 차단 지점

Redis 슬라이싱 클러스터 배포 시 각 Redis 인스턴스에 할당된 해시 슬롯 정보를 서로 다른 인스턴스 간에 전송해야 합니다. 로드 밸런싱이 필요하거나 인스턴스가 추가 또는 삭제되는 경우 , 데이터는 서로 다른 인스턴스 간에 마이그레이션됩니다. 그러나 해시 슬롯에 포함되는 정보의 양은 크지 않으며 데이터 마이그레이션이 점진적으로 수행됩니다. 이 두 가지 작업은 Redis 메인 스레드를 차단할 위험이 거의 없습니다.

Redis Cluster 솔루션을 사용하고 bigkey를 동시에 마이그레이션할 경우 Redis Cluster는 동기식 마이그레이션을 사용하기 때문에 메인 스레드가 차단됩니다.

다섯 가지 차단 지점:

  • 전체 쿼리 및 집계 작업 설정

  • 데이터베이스 지우기;

  • 라이브러리에서 로드 RDB 파일.

  • 2. 비동기적으로 실행될 수 있는 차단 지점

    차단 작업을 피하기 위해 Redis는 비동기 스레드 메커니즘을 제공합니다.
  • Redis는 일부 하위 스레드를 시작한 다음 일부 작업을 이러한 하위 스레드에 넘깁니다. 백그라운드에서 실행되도록 합니다. 이러한 작업을 수행하는 메인 스레드 없이 완료됩니다. 이렇게 하면 메인 스레드가 차단되는 것을 방지할 수 있습니다.

    작업의 비동기 실행 요구 사항:
비동기적으로 실행될 수 있는 작업은 Redis 메인 스레드의 주요 경로에 대한 작업이 아닙니다(클라이언트는 Redis에 요청을 보내고 Redis가 데이터 결과를 반환할 때까지 기다립니다).

메인 스레드가 작업 1을 수신한 후 작업 1은 특정 데이터를 클라이언트에 반환할 필요가 없습니다. 클라이언트에 "OK" 결과를 반환해야 합니다.

자식 스레드가 작업 1을 수행하면 클라이언트는 작업 2를 Redis 인스턴스로 보냅니다. 클라이언트는 작업 2에서 반환된 데이터 결과를 사용해야 합니다. 작업 2가 결과를 반환하지 않으면 클라이언트는 항상 대기 상태에 있게 됩니다. .

작업 1은 클라이언트에 특정 데이터를 반환할 필요가 없고 백그라운드 하위 스레드에 의해 비동기적으로 실행될 수 있으므로 중요한 경로에 대한 작업으로 간주되지 않습니다.

작업 2는 결과를 클라이언트에 반환해야 합니다. 이는 중요한 경로에 대한 작업이므로 메인 스레드는 이 작업을 즉시 완료해야 합니다.

Redis의 비동기 메커니즘은 무엇입니까

Redis 읽기 작업은 클라이언트가 읽기 작업을 보낸 후 후속 데이터 처리를 위해 읽기 데이터가 반환될 때까지 기다리기 때문에 일반적인 중요한 경로 작업입니다. Redis의 첫 번째 차단 지점인 "전체 쿼리 수집 및 집계 작업"은 모두 읽기 작업을 포함하며 비동기 작업을 수행할 수 없습니다.


특정 데이터 결과를 클라이언트에 반환할 필요가 없는 삭제 작업은 중요한 경로 작업이 아닙니다. "'빅키 삭제'와 '데이터베이스 정리' 모두 데이터 삭제를 포함하지만 중요한 경로에 있지 않습니다." 백그라운드 하위 스레드를 사용하여 삭제 작업을 비동기적으로 수행할 수 있습니다.

  • "AOF 로그 동기 쓰기", 데이터 신뢰성을 보장하기 위해 Redis 인스턴스는 AOF 로그의 작업 레코드가 디스크에 배치되었는지 확인해야 합니다. 이 작업을 수행하려면 인스턴스가 기다려야 하지만 그렇지 않습니다. 특정 데이터 결과를 인스턴스로 반환합니다. 따라서 하위 스레드를 시작하여 AOF 로그의 동기 쓰기를 수행할 수 있습니다.

  • 클라이언트에게 데이터 액세스 서비스를 제공하려면 전체 RDB 파일을 로드해야 합니다. 이 작업은 중요한 경로에 대한 작업이기도 하며 슬레이브 라이브러리의 메인 스레드에 의해 실행되어야 합니다.

  • "전체 쿼리 수집 및 집계 작업" 및 "라이브러리에서 RDB 파일 로드"를 제외하고 다른 세 가지 차단 지점과 관련된 작업은 중요 경로에 있지 않습니다. Redis의 비동기 하위 스레드 메커니즘을 사용하면 됩니다. bigkey 삭제 및 삭제를 달성합니다. 데이터베이스와 AOF 로그가 동시에 기록됩니다.

    3. 비동기 하위 스레드 메커니즘
  • Redis 메인 스레드는 운영 체제에서 제공하는 pthread_create 함수를 사용하여

    AOF 로그 쓰기 작업의 비동기 실행을 담당하는 3개의 하위 스레드를 생성합니다. -값 쌍 삭제 및 파일 닫기

    .
메인 스레드는 연결 목록 형태의 작업 대기열을 통해 하위 스레드와 상호 작용합니다.

키-값 쌍을 삭제하고 데이터베이스를 지우는 작업을 수신하면 메인 스레드는 작업을 작업으로 캡슐화하여 작업 대기열에 넣은 다음 클라이언트에 삭제 메시지를 반환하는 완료 메시지를 반환합니다. 완료되었다.

그러나 실제로는 삭제가 실행되지 않았습니다. 백그라운드 하위 스레드가 작업 대기열에서 작업을 읽은 후 실제로 키-값 쌍을 삭제하고 해당 메모리 공간을 해제하기 시작합니다. 이 비동기 삭제를

지연 삭제(lazy free)라고도 합니다.

Everysec 옵션으로 AOF 로그를 구성하면 메인 스레드는 AOF 로그 쓰기 작업을 작업으로 캡슐화하여 작업 대기열에 넣습니다. 다시 작성하는 한 가지 방법은 다음과 같습니다. 백그라운드 하위 스레드가 작업을 읽으면 자체적으로 AOF 로그에 기록을 시작하고, 메인 스레드는 AOF 로그에 의존하지 않고 계속 실행될 수 있습니다.

Redis의 비동기 하위 스레드 실행 메커니즘:

비동기 키-값 쌍 삭제 및 데이터베이스 지우기 작업은 Redis 4.0 이후에 제공되는 기능입니다. Redis는 또한 이 두 가지 작업을 수행하는 새로운 명령을 제공합니다:

  • 키-값 쌍 삭제: 컬렉션 유형에 많은 수의 요소가 있습니다. (예: 수백만 또는 수천만 개의 요소가 있는 경우) UNLINK 명령을 사용하는 것이 좋습니다.

  • 데이터베이스 지우기: FLUSHDB 및 FLUSHALL 명령 뒤에 ASYNC 옵션을 추가할 수 있습니다. 백그라운드 하위 스레드가 데이터베이스를 비동기적으로 지우도록 합니다.

rreee

위 내용은 Redis의 비동기 메커니즘은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!