Je réfléchissais à la façon dont les stockages de valeurs-clés actuels implémentent la «date d'expiration» pour les articles. Actuellement, j'ai 2 variantes pour cela dans mon esprit:
- ils ne font rien (gardent les données expirées), et ne vérifient que lorsque vous faites, par exemple, GET par une clé. Le problème ici est que si vous êtes limité en mémoire, les éléments expirés ne seront pas supprimés.
ils conservent des structures de données supplémentaires pour pouvoir «expirer au plus tôt». Je vois que cela peut être fait avec quelque chose comme ça:
storage_data = dict(key -> [value, expire_timestamp]) expire_tree = SomeBinaryLikeTree(expire_timestamp -> [keys])
la source
Je suppose que le stockage de valeur-clé est trop grand pour simplement itérer sur toutes les paires kv pour savoir lequel peut expirer. Je suppose également que chaque accès en lecture actualise l'horodatage d'expiration, de sorte que seuls les éléments qui n'ont pas été consultés depuis un certain temps sont expirés.
Le défi est de trouver efficacement tous les enregistrements qui peuvent expirer (chaque fois que le nettoyage est dû), mais aussi d'actualiser efficacement l'horodatage d'expiration à chaque accès en lecture (nous devons donc trouver la clé dans la structure utilisée pour l'expiration).
Ma proposition: grouper expiry_timestamps dans des compartiments; par exemple, si les objets vivent pendant 8 heures, faites un seau par heure. Ces compartiments sont conservés dans une liste chaînée; à l'expiration, le premier compartiment est vidé et la liste réduite. Le nombre de compartiments est la durée de vie / intervalle de nettoyage. Chaque compartiment contient un hashSet de toutes les clés qui doivent être expirées. L'itération sur toutes les clés d'un hachage est suffisamment efficace.
Pendant l'accès en lecture, le programme vérifie dans quel compartiment la clé se trouve actuellement et à quel compartiment elle appartient maintenant. Dans la plupart des cas, il s'agit du même compartiment, donc aucune autre action n'est nécessaire. Sinon, retirez la clé de l'ancien compartiment (la suppression d'un ensemble de hachage est efficace) et insérez-la dans le nouveau compartiment.
la source