키-값 스토리지가 너무 커서 모든 kv 쌍을 반복하여 만료 될 수있는 것을 찾기에는 너무 큽니다. 또한 각 읽기 액세스가 만료 타임 스탬프를 새로 고치므로 일정 시간 동안 액세스하지 않은 항목 만 만료된다고 가정합니다.
문제는 정리가 완료 될 때마다 만료 될 수있는 모든 레코드를 효율적으로 찾고 모든 읽기 액세스에서 만료 타임 스탬프를 효율적으로 새로 고치는 것입니다 (따라서 만료에 사용 된 구조에서 키를 찾아야 함).
내 제안 : expiry_timestamps를 버킷으로 그룹화하십시오. 예를 들어 품목이 8 시간 동안 지속되는 경우 시간당 하나의 버킷을 만듭니다. 이러한 버킷은 연결된 목록으로 유지됩니다. 만료가 발생하면 첫 번째 버킷이 비워지고 목록이 줄어 듭니다. 버킷 수는 수명 / 정리 간격입니다. 각 버킷에는 만료되어야하는 모든 키의 hashSet이 포함되어 있습니다. 해시 셋의 모든 키에 대한 반복은 충분히 효율적입니다.
읽기 액세스 중에 프로그램은 현재 키가있는 버킷과 현재 속한 버킷을 확인합니다. 대부분의 경우 동일한 버킷이므로 추가 조치가 필요하지 않습니다. 그렇지 않으면 이전 버킷에서 키를 제거하고 (해시 세트에서 제거하는 것이 효율적 임) 새 버킷에 삽입하십시오.
+--------------+ +--------------+ +--------------+
-->+ Expiry 08:00 +-->+ Expiry 09:00 +-->+ Expiry 10:00 +
| KeySet | | KeySet | | KeySet |
+--------------+ +--------------+ +--------------+