Computer >> 컴퓨터 >  >> 프로그램 작성 >> Redis

Redis 복제본에서 누락된 키

Redis에서 만료되는("휘발성"이라고도 함) 키를 사용하는 경우 새 Redis 복제본을 데이터베이스에 연결할 때 놀랄 수 있습니다. 복제본의 키 수가 기본 DB의 키 수보다 훨씬 적을 수 있습니다. . 이는 휘발성 키가 많은 경우 특히 일반적입니다.

Redis 복제본에 키가 누락되었습니까? 방금 데이터를 잃어 버렸습니까? 짧은 대답은 "아니오"입니다. 그러나 데이터 손실이 없는데도 Redis 복제본이 더 낮은 키 수를 보고하는 이유를 정확히 이해하는 것이 도움이 됩니다. 여기에는 Redis가 키를 만료하는 방법과 Redis가 데이터 세트를 새 복제본으로 보내는 방법이라는 두 가지 구현 세부 정보가 포함됩니다.

Redis는 휘발성 키를 어떻게 만료합니까?

Redis에서 휘발성 키는 만료되도록 설정된 정확한 순간에 메모리에서 삭제되지 않습니다. 대신 다음 두 가지 방법 중 하나를 통해 삭제됩니다.

  1. Redis 클라이언트가 키에 대해 읽기 또는 쓰기 작업을 수행하면 Redis 서버는 먼저 해당 키가 존재하고 만료 시간이 있는지 확인합니다. 존재하고 만료 시간이 과거인 경우 Redis는 즉시 메모리에서 키를 삭제합니다. 명령을 처리하기 전에.

  2. 휘발성 키가 액세스되지 않는 경우 메모리에 영구적으로 남아 있는 것을 방지하기 위해 Redis는 간단한 수동 알고리즘을 사용하여 키를 만료합니다. 25개 이상의 키가 말소되면 즉시 다른 100개의 키를 가져와 다시 시작합니다.

위의 두 번째 방법은 상당한 수의 키가 이미 "만료"되었지만 아직 메모리에서 삭제되지 않은 휘발성 키일 수 있음을 의미하기 때문에 중요합니다.1 . Redis는 INFO의 "keys" 및 "expires" 카운트에 이러한 키를 계속 포함합니다. 말소될 때까지 출력됩니다.

Redis는 데이터세트를 새 복제본으로 어떻게 보내나요?

Redis 복제본이 Redis 서버에 연결되면 기본 서버는 데이터 세트의 RDB 스냅샷을 생성하여 복제본으로 보냅니다. Redis가 RDB 스냅샷을 생성할 때 만료일이 지난 키를 포함하지 않습니다. ,아직 메모리에서 삭제되지 않은 경우에도 마찬가지입니다.

내 복제본의 키 수가 기본 서버의 키보다 적은 이유는 무엇입니까?

복제본을 Redis 인스턴스에 연결하면 해당 복제본은 기본 데이터베이스에서 만료된(그러나 여전히 존재하는) 휘발성 키를 포함하지 않는 데이터세트를 수신합니다. 이것이 RDB 백업에서 Redis 서버를 복원할 때 키 수가 떨어질 수 있는 것과 같은 이유입니다.

RDB 동작을 추적하는 데 도움을 주신 @mattsta에게 특별한 감사를 전합니다.

  1. 실제로 이 숫자는 Redis가 삭제할 키를 지속적으로 찾고 있기 때문에 일반적으로 훨씬 더 낮습니다. ↩