J'ai besoin d'expirer toutes les clés dans le hash redis, qui sont plus vieux que 1 mois.
Réponses
Trop de publicités?Ce n'est pas possible pour le bien de garder Redis simple .
Dit Antirez, créateur de Redis :
Bonjour, ce n'est pas possible, soit vous utilisez une clé de premier niveau différente pour cela pour ce champ spécifique, soit vous stockez avec le fichier un autre champ avec un avec une date d'expiration, récupérez les deux, et laissez l'application comprendre si c'est encore valide ou non en fonction de l'heure actuelle.
Redis ne permet pas d'avoir TTL
sur des hachages autres que la clé supérieure, ce qui ferait expirer l'ensemble du hachage. Si vous utilisez un cluster sharded, il existe une autre approche que vous pouvez utiliser. Cette approche ne peut pas être utile dans tous les scénarios et les caractéristiques de performance peuvent être différentes de celles attendues. Cela vaut tout de même la peine d'être mentionné :
Dans le cas d'un hachage, la structure se présente essentiellement comme suit :
hash_top_key
- child_key_1 -> some_value
- child_key_2 -> some_value
...
- child_key_n -> some_value
Puisque nous voulons ajouter TTL
aux clés enfant, nous pouvons les déplacer vers les clés supérieures. Le point principal est que la clé doit maintenant être une combinaison de hash_top_key
et la clé enfant :
{hash_top_key}child_key_1 -> some_value
{hash_top_key}child_key_2 -> some_value
...
{hash_top_key}child_key_n -> some_value
Nous utilisons le {}
à dessein. Cela permet à toutes ces clés de tomber dans la même hash slot
. Vous pouvez en savoir plus à ce sujet ici : https://redis.io/topics/cluster-tutorial
Maintenant, si nous voulons faire la même opération de hachage, nous pouvons le faire :
HDEL hash_top_key child_key_1 => DEL {hash_top_key}child_key_1
HGET hash_top_key child_key_1 => GET {hash_top_key}child_key_1
HSET hash_top_key child_key_1 some_value => SET {hash_top_key}child_key_1 some_value [some_TTL]
HGETALL hash_top_key =>
keyslot = CLUSTER KEYSLOT {hash_top_key}
keys = CLUSTER GETKEYSINSLOT keyslot n
MGET keys
L'intéressant ici est HGETALL
. Nous obtenons d'abord le hash slot
pour toutes les clés de nos enfants. Ensuite, nous obtenons les clés pour cette clé particulière hash slot
et enfin nous récupérons les valeurs. Nous devons faire attention ici car il pourrait y avoir plus de n
les clés pour cela hash slot
et aussi il pourrait y avoir des clés qui ne nous intéressent pas mais qui ont la même hash slot
. Nous pourrions en fait écrire un Lua
script pour faire ces étapes dans le serveur en exécutant un EVAL
o EVALSHA
commandement. Là encore, vous devez prendre en considération les performances de cette approche pour votre scénario particulier.
Quelques références supplémentaires :
Cela est possible dans KeyDB qui est un Fork de Redis. Parce qu'il s'agit d'une bifurcation, il est entièrement compatible avec Redis et fonctionne comme une solution de remplacement.
Il suffit d'utiliser la commande EXPIREMEMBER. Elle fonctionne avec les ensembles, les hachages et les ensembles triés.
EXPIREMEMBER keyname subkey [time] (nom de clé sous-clé)
Vous pouvez également utiliser TTL et PTTL pour voir l'expiration.
TTL nom de clé sous-clé
Plus de documentation est disponible ici : https://docs.keydb.dev/docs/commands/#expiremember
Vous pouvez utiliser Ensemble trié dans redis pour obtenir un conteneur TTL avec le timestamp comme score. Par exemple, chaque fois que vous insérez une chaîne d'événement dans l'ensemble, vous pouvez définir son score à l'heure de l'événement. Ainsi, vous pouvez obtenir des données de n'importe quelle fenêtre de temps en appelant zrangebyscore "your set name" min-time max-time
De plus, nous pouvons faire expirer en utilisant zremrangebyscore "your set name" min-time max-time
pour supprimer les anciens événements.
Le seul inconvénient ici est que vous devez faire du ménage à partir d'un processus externe pour maintenir la taille de l'ensemble.
Nous avons eu le même problème que celui évoqué ici.
Nous disposons d'un hachage Redis, d'une clé pour les entrées de hachage (paires nom/valeur), et nous avons besoin de conserver des délais d'expiration individuels pour chaque entrée de hachage.
Nous l'avons mis en œuvre en ajoutant n octets de données de préfixe contenant des informations d'expiration codées lorsque nous écrivons les valeurs d'entrée de hachage, nous avons également défini la clé pour qu'elle expire à l'heure contenue dans la valeur écrite.
Ensuite, à la lecture, nous décodons le préfixe et vérifions l'expiration. C'est une surcharge supplémentaire, cependant, les lectures sont toujours O(n) et la clé entière expirera lorsque la dernière entrée de hachage aura expiré.
- Réponses précédentes
- Plus de réponses