Estaba pensando en cómo los almacenes de valores clave actuales implementan la "fecha de caducidad" para los artículos. Actualmente tengo 2 variantes para eso en mi mente:
- no hacen nada (guardan los datos caducados) y solo verifican cuando lo hace, por ejemplo, OBTENER con alguna tecla. El problema aquí es que si tiene memoria limitada, los elementos caducados no se eliminarán.
mantienen estructuras de datos adicionales para poder llegar a "caducar lo antes posible". Veo que se puede hacer con algo como esto:
storage_data = dict(key -> [value, expire_timestamp]) expire_tree = SomeBinaryLikeTree(expire_timestamp -> [keys])
fuente
Supongo que el almacenamiento de valor clave es demasiado grande para simplemente iterar sobre todos los pares kv para descubrir cuál puede expirar. También supongo que cada acceso de lectura actualiza la marca de tiempo de caducidad, por lo que solo caducan los elementos a los que no se ha accedido durante algún tiempo.
El desafío es encontrar de manera eficiente todos los registros que pueden caducar (cuando sea necesario realizar la limpieza), pero también actualizar de manera eficiente la marca de tiempo de caducidad en cada acceso de lectura (por lo que debemos encontrar la clave en la estructura utilizada para la caducidad).
Mi propuesta: agrupe expiry_timestamps en cubos; por ejemplo, si los artículos viven durante 8 horas, haga un cubo por hora. Esos cubos se mantienen en una lista vinculada; Cuando ocurre la caducidad, el primer depósito se vacía y la lista se reduce. El número de cubos es la vida útil / intervalo de limpieza. Cada depósito contiene un hashSet de todas las claves que deben expirar. La iteración sobre todas las claves en un hashset es lo suficientemente eficiente.
Durante el acceso de lectura, el programa verifica en qué depósito se encuentra actualmente la clave y a qué depósito pertenece ahora. En la mayoría de los casos, es el mismo depósito, por lo que no es necesaria ninguna otra acción. De lo contrario, retire la llave del cubo antiguo (eliminar de un conjunto de hash es eficiente) e insértelo en el nuevo cubo.
fuente