Suppongo che l'archiviazione dei valori-chiave sia troppo grande per iterare su tutte le coppie k-v per scoprire quale può essere scaduto. Suppongo inoltre che ogni accesso in lettura aggiorni il timestamp della scadenza, quindi sono scaduti solo gli elementi che non sono stati acceduti per un certo periodo di tempo.
La sfida consiste nel trovare in modo efficiente tutti i record che possono essere scaduti (ogni volta che la pulizia è in scadenza), ma anche aggiornare in modo efficiente il timestamp di scadenza su ogni accesso in lettura (quindi dobbiamo trovare la chiave nella struttura utilizzata per la scadenza).
La mia proposta: gruppo expiry_timestamps in bucket; per esempio, se gli articoli
vivi per 8 ore, fai un secchio all'ora. Questi bucket sono tenuti in una lista collegata; quando scade la scadenza, il primo bucket viene svuotato e l'elenco ridotto. Il numero di bucket è l'intervallo di durata della vita / pulizia.
Ogni bucket contiene un hashSet di tutte le chiavi che dovrebbero essere scadute. L'iterazione su tutte le chiavi in un hashset è sufficientemente efficiente.
Durante l'accesso in lettura, il programma controlla su quale bucket è attualmente inserita la chiave e su quale bucket ora appartiene. Nella maggior parte dei casi, è lo stesso bucket, quindi non è necessaria alcuna ulteriore azione. Altrimenti, rimuovi la chiave dal vecchio bucket (la rimozione da un set di hash è efficiente) e inseriscila nel nuovo bucket.
+--------------+ +--------------+ +--------------+
-->+ Expiry 08:00 +-->+ Expiry 09:00 +-->+ Expiry 10:00 +
| KeySet | | KeySet | | KeySet |
+--------------+ +--------------+ +--------------+