Redis 인스턴스와 상호 작용하는 개체 및 상호 작용 중에 발생하는 작업:
클라이언트: 네트워크 IO, 키-값 쌍 추가, 삭제, 수정 및 쿼리 작업, 데이터베이스 작업
디스크: RDB 스냅샷 생성, AOF 로그 기록 및 AOF 로그 재작성
마스터-슬레이브 노드: 마스터 라이브러리는 RDB 파일을 생성 및 전송하고, 슬레이브 라이브러리는 RDB 파일을 수신하고, 데이터베이스를 지우고, RDB 파일을 로드합니다.
클러스터 인스턴스 슬라이싱 : 해시 슬롯 정보를 다른 인스턴스로 전송하고 데이터를 마이그레이션합니다.
클라이언트와 상호 작용할 때 차단 지점:
네트워크 IO는 때때로 느리지만 Redis는 IO 다중 채널을 사용합니다. 재사용 메커니즘으로 인해 기본 스레드는 항상 네트워크 연결이나 요청 도착을 기다리지 않으므로 네트워크 IO는 Redis를 차단하는 요인이 아닙니다. Redis 메인 스레드의 주요 작업은 클라이언트와 상호 작용하는 키-값 쌍의 추가, 삭제, 수정 및 쿼리 작업을 수행하는 것입니다. 매우 복잡한 추가, 삭제, 수정 및 쿼리 작업은 확실히 Redis를 차단합니다.
연산의 복잡도를 판단하는 기준:
연산의 복잡도가 O(N)인지 확인하세요. Redis의 첫 번째 차단점: 전체 컬렉션 쿼리 및 집계 작업:
Redis에서 컬렉션과 관련된 작업의 복잡성은 일반적으로 O(N)이므로 사용 시 주의가 필요합니다.
예를 들어 집합 요소전체 쿼리
연산 HGETALL, SMEMBERS 및 집계 통계집합 연산(교집합, 합집합, 차이 등)이 있습니다. Redis의 두 번째 차단 지점: bigkey 삭제 작업
컬렉션 자체의 삭제 작업에도 잠재적인 차단 위험이 있습니다. 삭제 작업의 핵심은 키-값 쌍이 차지하는 메모리 공간을 해제하는 것입니다. 메모리 해제는 메모리 공간을 보다 효율적으로 관리하기 위한 첫 번째 단계일 뿐입니다. 애플리케이션이 메모리를 해제할 때 운영 체제는 해제된 메모리 블록을 후속 관리 및 재할당을 위해 사용 가능한 메모리 블록의 연결된 목록에 삽입해야 합니다.
이 프로세스 자체는 일정 시간이 걸리며 현재 메모리를 해제하고 있는 애플리케이션을 차단하게 됩니다. 많은 양의 메모리를 한 번에 해제하면 여유 메모리 차단 연결 목록의 작업 시간이 늘어나므로 Redis가 차단할 메인 스레드.
대량의 메모리를 해제할 시간: 많은 수의 키-값 쌍을 삭제할 때 많은 수의 요소가 포함된 컬렉션을 삭제하는 것을
bigkey 삭제라고도 합니다. 요소 수가 다른 세트를 삭제할 때 소요되는 시간:
세 가지 결론이 도출됩니다.
키-값 쌍을 자주 삭제하는 것은 잠재적인 차단 지점이므로 데이터베이스를 지우는 것(예: 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는 동기식 마이그레이션을 사용하기 때문에 메인 스레드가 차단됩니다.
다섯 가지 차단 지점:
전체 쿼리 및 집계 작업 설정
데이터베이스 지우기;
메인 스레드가 작업 1을 수신한 후 작업 1은 특정 데이터를 클라이언트에 반환할 필요가 없습니다. 클라이언트에 "OK" 결과를 반환해야 합니다.
자식 스레드가 작업 1을 수행하면 클라이언트는 작업 2를 Redis 인스턴스로 보냅니다. 클라이언트는 작업 2에서 반환된 데이터 결과를 사용해야 합니다. 작업 2가 결과를 반환하지 않으면 클라이언트는 항상 대기 상태에 있게 됩니다. . 작업 1은 클라이언트에 특정 데이터를 반환할 필요가 없고 백그라운드 하위 스레드에 의해 비동기적으로 실행될 수 있으므로 중요한 경로에 대한 작업으로 간주되지 않습니다.작업 2는 결과를 클라이언트에 반환해야 합니다. 이는 중요한 경로에 대한 작업이므로 메인 스레드는 이 작업을 즉시 완료해야 합니다.
Redis 읽기 작업은 클라이언트가 읽기 작업을 보낸 후 후속 데이터 처리를 위해 읽기 데이터가 반환될 때까지 기다리기 때문에 일반적인 중요한 경로 작업입니다. Redis의 첫 번째 차단 지점인 "전체 쿼리 수집 및 집계 작업"은 모두 읽기 작업을 포함하며 비동기 작업을 수행할 수 없습니다.특정 데이터 결과를 클라이언트에 반환할 필요가 없는 삭제 작업은 중요한 경로 작업이 아닙니다. "'빅키 삭제'와 '데이터베이스 정리' 모두 데이터 삭제를 포함하지만 중요한 경로에 있지 않습니다." 백그라운드 하위 스레드를 사용하여 삭제 작업을 비동기적으로 수행할 수 있습니다.
AOF 로그 쓰기 작업의 비동기 실행을 담당하는 3개의 하위 스레드를 생성합니다. -값 쌍 삭제 및 파일 닫기
.지연 삭제(lazy free)라고도 합니다.
Everysec 옵션으로 AOF 로그를 구성하면 메인 스레드는 AOF 로그 쓰기 작업을 작업으로 캡슐화하여 작업 대기열에 넣습니다. 다시 작성하는 한 가지 방법은 다음과 같습니다. 백그라운드 하위 스레드가 작업을 읽으면 자체적으로 AOF 로그에 기록을 시작하고, 메인 스레드는 AOF 로그에 의존하지 않고 계속 실행될 수 있습니다. Redis의 비동기 하위 스레드 실행 메커니즘:비동기 키-값 쌍 삭제 및 데이터베이스 지우기 작업은 Redis 4.0 이후에 제공되는 기능입니다. Redis는 또한 이 두 가지 작업을 수행하는 새로운 명령을 제공합니다: 키-값 쌍 삭제: 컬렉션 유형에 많은 수의 요소가 있습니다. (예: 수백만 또는 수천만 개의 요소가 있는 경우) UNLINK 명령을 사용하는 것이 좋습니다. 데이터베이스 지우기: FLUSHDB 및 FLUSHALL 명령 뒤에 ASYNC 옵션을 추가할 수 있습니다. 백그라운드 하위 스레드가 데이터베이스를 비동기적으로 지우도록 합니다.
rreee
위 내용은 Redis의 비동기 메커니즘은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!