Ich gehe davon aus, dass der Schlüsselwertspeicher zu groß ist, um nur alle kv-Paare zu durchlaufen, um herauszufinden, welche abgelaufen werden können. Ich gehe auch davon aus, dass jeder Lesezugriff den Ablaufzeitstempel aktualisiert, sodass nur Elemente abgelaufen sind, auf die seit einiger Zeit nicht mehr zugegriffen wurde.
Die Herausforderung besteht darin, alle Datensätze, die abgelaufen sein können (wann immer eine Bereinigung fällig ist), effizient zu finden, aber auch den Ablaufzeitstempel bei jedem Lesezugriff effizient zu aktualisieren (daher müssen wir den Schlüssel in der für den Ablauf verwendeten Struktur finden).
Mein Vorschlag: gruppiere expiry_timestamps in Eimern; Wenn Gegenstände beispielsweise 8 Stunden lang leben, stellen Sie einen Eimer pro Stunde her. Diese Eimer werden in einer verknüpften Liste gespeichert. Wenn der Ablauf eintritt, wird der erste Bucket geleert und die Liste reduziert. Die Anzahl der Buckets ist das Lebensdauer- / Bereinigungsintervall. Jeder Bucket enthält ein HashSet aller Schlüssel, die abgelaufen sein sollten. Die Iteration über alle Schlüssel in einem Hashset ist effizient genug.
Während des Lesezugriffs prüft das Programm, in welchem Bucket sich der Schlüssel gerade befindet und zu welchem Bucket er jetzt gehört. In den meisten Fällen handelt es sich um denselben Eimer, sodass keine weiteren Maßnahmen erforderlich sind. Entfernen Sie andernfalls den Schlüssel aus dem alten Bucket (das Entfernen aus einem Hash-Set ist effizient) und stecken Sie ihn in den neuen Bucket.
+--------------+ +--------------+ +--------------+
-->+ Expiry 08:00 +-->+ Expiry 09:00 +-->+ Expiry 10:00 +
| KeySet | | KeySet | | KeySet |
+--------------+ +--------------+ +--------------+