추천 학습: Redis 비디오 튜토리얼
Redis 서버는 실제로 지연 삭제와 일반 삭제라는 두 가지 전략을 사용합니다. 이 두 가지 삭제 전략을 함께 사용하면 서버는 CPU 시간을 합리적으로 사용하고 삭제 방지 사이의 균형을 유지할 수 있습니다. 낭비되는 메모리 공간.
지연 삭제 전략은 CPU 시간에 가장 적합합니다. 프로그램은 키를 꺼낼 때만 키의 만료 여부를 확인하므로 만료된 키 삭제 작업은 만료된 키가 만료된 경우에만 수행됩니다. 수행되어야 하며 삭제 대상은 현재 처리된 키로 제한되므로 이 전략은 관련 없는 만료된 키를 삭제하는 데 CPU 시간을 소비하지 않습니다.
지연 삭제 전략의 단점은 메모리에 가장 친숙하지 않다는 점입니다. 키가 만료되었고 키가 데이터베이스에 여전히 남아 있는 경우 만료된 키가 삭제되지 않는 한 키가 차지하는 메모리는 삭제되지 않습니다.
지연 삭제 전략을 사용할 때 데이터베이스에 만료된 키가 많고 만료된 키에 액세스할 수 없는 경우(사용자가 FLUSHDB를 수동으로 실행하지 않는 한) 삭제되지 않을 수 있습니다. 메모리 누수로 간주될 수 있습니다. 쓸모 없는 쓰레기 데이터는 많은 메모리를 차지하지만 서버는 이를 자체적으로 해제하지 않습니다. 이는 실행 상태가 메모리에 크게 의존하는 Redis 서버의 경우에는 확실히 해당되지 않습니다. 좋은 소식.
예를 들어, 로그와 같은 일부 시간 관련 데이터의 경우 특정 시점이 지나면 해당 데이터에 대한 액세스가 크게 줄어들거나, 만료된 데이터가 대량으로 백로그되면 더 이상 액세스할 수 없게 됩니다. , 사용자는 서버가 자동으로 삭제했다고 생각하지만 실제로는 이러한 키가 여전히 존재하고 키가 차지한 메모리가 해제되지 않았으므로 결과는 매우 심각할 것입니다.
지연 삭제에 대한 위의 논의에서 볼 때 이 삭제 방법은 단독으로 사용할 경우 명백한 결함이 있습니다.
지연 삭제는 너무 많은 메모리를 낭비하고 메모리 누수 위험이 있습니다. 주기적 삭제 전략은 처음 두 가지 전략을 통합하고 절충한 것입니다.
주기적 삭제 전략은 만료된 키를 가끔씩 삭제하고 기간과 빈도를 제한하여 삭제 작업이 CPU 시간에 미치는 영향을 줄입니다. 삭제 작업. 또한 만료된 키를 정기적으로 삭제함으로써 정기적인 삭제 전략은 만료된 키로 인한 메모리 낭비를 효과적으로 줄입니다. 주기적 삭제 전략의 어려움은 삭제 작업의 기간과 빈도를 결정하는 것입니다.
삭제 작업이 너무 자주 실행되거나 실행 시간이 너무 길면 주기적 삭제 전략이 예약 삭제 전략으로 변질됩니다. 너무 많은 CPU 시간을 소비하게 됩니다. 만료된 키를 삭제하는 데 많은 시간이 소요됩니다.
삭제 작업이 너무 드물게 실행되거나 실행 시간이 너무 짧은 경우 일반 삭제 전략은 지연 삭제 전략과 동일하므로 메모리 낭비가 발생합니다. 따라서 정기적인 삭제 전략을 채택하는 경우 서버는 상황에 따라 삭제 작업의 실행 기간과 빈도를 합리적으로 설정해야 합니다.
만료된 키의 지연 삭제 전략은 db.c/expireIfNeeded 함수로 구현됩니다. 데이터베이스를 읽고 쓰는 모든 Redis 명령은 실행 전에 입력 키를 확인하기 위해expireIfNeeded 함수를 호출합니다.
입력 키가 만료된 경우 만료IfNeeded 함수는 데이터베이스에서 입력 키를 제거합니다.
입력 키가 만료되지 않은 경우 만료IfNeeded 함수는 조치를 취하지 않습니다.
expiredIfNeeded 함수는 명령이 실제로 실행되기 전에 만료된 입력 키를 필터링하여 명령이 만료된 키에 닿는 것을 방지할 수 있는 필터와 같습니다.
또한 액세스된 각 키는 만료로 인해expireIfNeeded 함수에 의해 삭제될 수 있으므로 각 명령의 구현 함수는 키의 존재와 키의 부재를 모두 처리할 수 있어야 합니다.
키가 존재하는 경우 , 키의 존재에 따라 명령이 실행됩니다.
키가 존재하지 않거나 만료로 인해expireIfNeeded 함수에 의해 키가 삭제되면 키가 존재하지 않는 것처럼 명령이 실행됩니다.
만료된 키의 주기적 삭제 전략은 redis.c/activeExpireCycle 함수에 의해 구현됩니다. Redis 서버의 주기적 작업 redis.c/serverCron 함수가 실행될 때마다 activeExpireCycle 함수가 호출됩니다. 일정 기간 내에 서버의 각 데이터베이스를 여러 번 탐색하고 데이터베이스의 만료 사전에서 일부 키의 만료 시간을 무작위로 확인하고 만료된 키를 삭제합니다.
전체 프로세스는 다음과 같이 의사 코드로 설명할 수 있습니다.
activeExpireCycle 함수의 작업 모드는 다음과 같이 요약할 수 있습니다.
함수가 실행될 때마다 특정 개수의 특정 수의 데이터베이스에서 임의의 키를 확인하고 삭제합니다.
전역 변수 current_db는 현재 activeExpireCycle 함수 검사의 진행 상황을 기록하고 다음 activeExpireCycle 함수가 호출될 때 이전 진행 상황을 계속 처리합니다. 예를 들어, 10번 데이터베이스를 순회할 때 현재 activeExpireCycle 함수가 반환되면 다음에 activeExpireCycle 함수가 실행될 때 11번 데이터베이스부터 만료된 키를 검색하여 삭제합니다.
activeExpireCycle 함수가 계속 실행되면서 서버의 모든 데이터베이스를 검사하게 됩니다. 이때 이 함수는 current_db 변수를 0으로 재설정한 후 새로운 검사 작업을 다시 시작합니다.
서버가 복제 모드에서 실행 중일 때 슬레이브 서버에서 만료된 키 삭제는 마스터 서버에 의해 제어됩니다.
만료된 키를 삭제한 후 마스터 서버는 명시적으로 모든 슬레이브 서버에 DEL 명령을 보냅니다. 이 만료된 키를 서버에서 삭제하라고 알려줍니다.
슬레이브 서버가 클라이언트가 보낸 읽기 명령을 실행할 때 만료된 키를 발견하더라도 만료된 키를 삭제하지 않고 만료되지 않은 키처럼 계속해서 처리합니다. DEL 명령이 서버에서 전송된 후에만 삭제됩니다.
마스터 서버를 제어하여 슬레이브 서버에서 만료된 키를 균일하게 삭제함으로써 마스터-슬레이브 서버 데이터의 일관성을 보장할 수 있습니다. 마스터 서버의 데이터베이스에 만료된 키가 여전히 존재하는 경우, 만료된 키는 슬레이브 서버의 복제본도 계속 존재합니다. 예를 들어, 마스터-슬레이브 서버 쌍이 있고 해당 데이터베이스는 모두 동일한 세 개의 키 message, xxx 및 yyy를 저장합니다. 여기서 message는 그림에 표시된 것처럼 만료된 키입니다.
이때 클라이언트가 슬레이브 서버에 GET 메시지 명령을 보내면 슬레이브 서버는 메시지 키가 만료되었음을 알게 되지만 슬레이브 서버는 메시지 키를 삭제하지 않고 계속해서 메시지 키를 반환합니다. 마치 메시지 키가 만료되지 않은 것처럼 종료됩니다.
이 후 클라이언트가 GET 메시지 명령을 메인 서버에 보낸다고 가정하면, 메인 서버는 키를 찾을 것입니다. 메시지가 만료되었습니다: 메인 서버는 메시지 키를 삭제하고 클라이언트에 보냅니다. 클라이언트는 빈 응답을 반환하고 슬레이브 서버에 DEL 메시지 명령을 보냅니다. 마스터 서버에서 DEL 메시지 명령을 받은 후 슬레이브 서버는 그 후에는 마스터 서버와 슬레이브 서버 모두 더 이상 만료된 키 메시지를 저장하지 않습니다
권장 학습:
Redis 비디오 튜토리얼위 내용은 Redis의 만료된 키 삭제 전략 원칙에 대한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!