Redis
 sql >> Base de données >  >> NoSQL >> Redis

Configurer redis pour supprimer systématiquement les anciennes données en premier

AFAIK, il n'est pas possible de configurer Redis pour supprimer systématiquement les anciennes données en premier.

Lorsque les options *-ttl ou *-lru sont choisies dans maxmemory-policy, Redis n'utilise pas d'algorithme exact pour sélectionner les clés à supprimer. Un algorithme exact nécessiterait une liste supplémentaire (pour *-lru) ou un tas supplémentaire (pour *-ttl) en mémoire, et le croiserait avec la structure de données normale du dictionnaire Redis. Ce serait coûteux en termes de consommation de mémoire.

Avec le mécanisme actuel, les expulsions se produisent dans la boucle d'événements principale (c'est-à-dire que les expulsions potentielles sont vérifiées à chaque itération de la boucle avant que chaque commande ne soit exécutée). Jusqu'à ce que la mémoire soit de retour sous la limite maxmemory, Redis sélectionne au hasard un échantillon de n clés et sélectionne pour expiration la plus inactive (pour *-lru) ou celle qui est la plus proche de sa limite d'expiration (pour *-ttl). Par défaut, seuls 3 échantillons sont pris en compte. Le résultat est non déterministe.

Une façon d'augmenter la précision de cet algorithme et d'atténuer le problème consiste à augmenter le nombre d'échantillons pris en compte (paramètre maxmemory-samples dans le fichier de configuration). Ne le réglez pas trop haut, car cela consommera du CPU. Il s'agit d'un compromis entre la précision de l'éviction et la consommation du processeur.

Maintenant, si vous avez vraiment besoin d'un comportement cohérent, une solution consiste à implémenter votre propre mécanisme d'expulsion en plus de Redis. Par exemple, vous pouvez ajouter une liste (pour les clés non modifiables) ou un ensemble trié (pour les clés modifiables) afin de suivre les clés qui doivent être supprimées en premier. Ensuite, vous ajoutez un démon dont le but est de vérifier périodiquement (à l'aide de INFO) la consommation de mémoire et d'interroger les éléments de la liste/ensemble trié pour supprimer les clés concernées.

Veuillez noter que d'autres systèmes de mise en cache ont leur propre façon de gérer ce problème. Par exemple, avec memcached, il y a une structure LRU par dalle (qui dépend de la taille de l'objet), donc l'ordre d'expulsion n'est pas non plus précis (bien que plus déterministe qu'avec Redis dans la pratique).