sql >> Base de Datos >  >> NoSQL >> Redis

Configurar redis para desalojar primero los datos más antiguos de forma consistente

AFAIK, no es posible configurar Redis para desalojar primero los datos más antiguos de manera consistente.

Cuando se eligen las opciones *-ttl o *-lru en maxmemory-policy, Redis no usa un algoritmo exacto para seleccionar las claves que se eliminarán. Un algoritmo exacto requeriría una lista adicional (para *-lru) o un montón adicional (para *-ttl) en la memoria, y la referencia cruzada con la estructura de datos normal del diccionario de Redis. Sería costoso en términos de consumo de memoria.

Con el mecanismo actual, los desalojos ocurren en el bucle de eventos principal (es decir, los desalojos potenciales se verifican en cada iteración del bucle antes de ejecutar cada comando). Hasta que la memoria vuelva a estar por debajo del límite máximo de memoria, Redis elige aleatoriamente una muestra de n claves y selecciona para caducidad la más inactiva (para *-lru) o la que está más cerca de su límite de caducidad (para *-ttl). Por defecto solo se consideran 3 muestras. El resultado no es determinista.

Una forma de aumentar la precisión de este algoritmo y mitigar el problema es aumentar la cantidad de muestras consideradas (parámetro maxmemory-samples en el archivo de configuración). No lo configure demasiado alto, ya que consumirá algo de CPU. Es una compensación entre la precisión del desalojo y el consumo de CPU.

Ahora, si realmente necesita un comportamiento coherente, una solución es implementar su propio mecanismo de desalojo además de Redis. Por ejemplo, puede agregar una lista (para claves no actualizables) o un conjunto ordenado (para claves actualizables) para rastrear las claves que deben desalojarse primero. Luego, agrega un demonio cuyo propósito es verificar periódicamente (usando INFO) el consumo de memoria y consultar los elementos de la lista/conjunto ordenado para eliminar las claves relevantes.

Tenga en cuenta que otros sistemas de almacenamiento en caché tienen su propia forma de solucionar este problema. Por ejemplo, con memcached, hay una estructura LRU por losa (que depende del tamaño del objeto), por lo que la orden de desalojo tampoco es precisa (aunque en la práctica es más determinista que con Redis).