197 votes

Comment "EXPIRE" la clé enfant "HSET" dans redis ?

J'ai besoin d'expirer toutes les clés dans le hash redis, qui sont plus vieux que 1 mois.

182voto

Supr Points 4738

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.

40voto

hveiga Points 4652

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 :

23voto

John Sully Points 219

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

16voto

mojians Points 26

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.

6voto

MikeZ Points 98

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é.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X