J'ai besoin d'expirer toutes les clés du hachage redis, qui datent de plus d'un mois.
108
Ce n'est pas possible , dans un souci de simplification de Redis .
Quoth Antirez, créateur de Redis:
Bonjour, il n'est pas possible d'utiliser une clé de niveau supérieur différente pour ce champ spécifique, ou de stocker avec le champ un autre champ avec une heure d'expiration, de récupérer les deux et de laisser l'application comprendre si elle est toujours valide ou non basée sur heure actuelle.
Redis ne prend pas en charge
TTL
les hachages autres que la clé supérieure, qui expirerait tout le hachage. Si vous utilisez un cluster partitionné, vous pouvez utiliser une autre approche. Cette approche ne peut pas être utile dans tous les scénarios et les caractéristiques de performance peuvent différer de celles attendues. Encore à mentionner:Lors d'un hachage, la structure ressemble essentiellement à:
Puisque nous voulons ajouter
TTL
aux clés enfants, nous pouvons les déplacer vers les clés supérieures. Le point principal est que la clé doit maintenant être une combinaison dehash_top_key
et de clé enfant:Nous utilisons la
{}
notation à dessein. Cela permet à toutes ces clés de tomber dans le mêmehash slot
. Vous pouvez en savoir plus ici: https://redis.io/topics/cluster-tutorialMaintenant, si nous voulons faire la même opération de hachage, nous pourrions faire:
L'intéressant ici est
HGETALL
. Nous obtenonshash slot
d'abord les clés de tous nos enfants. Ensuite, nous obtenons les clés pour celahash slot
et enfin nous récupérons les valeurs. Nous devons faire attention ici car il pourrait y avoir plus que desn
clés pour celahash slot
et aussi il pourrait y avoir des clés qui ne nous intéressent pas, mais elles ont les mêmeshash slot
. Nous pourrions en fait écrire unLua
script pour effectuer ces étapes sur le serveur en exécutant une commandeEVAL
ouEVALSHA
. Encore une fois, vous devez prendre en considération les performances de cette approche pour votre scénario particulier.Quelques références supplémentaires:
la source
Il existe un framework Java Redisson qui implémente un
Map
objet de hachage avec prise en charge de l'entrée TTL. Il utilise des objetshmap
etzset
Redis sous le capot. Exemple d'utilisation:Cette approche est très utile.
la source
Ceci est possible dans KeyDB qui est un Fork de Redis. Parce que c'est une fourche, elle est entièrement compatible avec Redis et fonctionne comme un remplacement.
Utilisez simplement la commande EXPIREMEMBER. Il fonctionne avec des ensembles, des hachages et des ensembles triés.
Vous pouvez également utiliser TTL et PTTL pour voir l'expiration
Plus de documentation est disponible ici: https://docs.keydb.dev/docs/commands/#expiremember
la source
Concernant une implémentation NodeJS, j'ai ajouté un
expiryTime
champ personnalisé dans l'objet que je sauvegarde dans le HASH. Ensuite, après une période spécifique, j'efface les entrées HASH expirées en utilisant le code suivant:la source
Array.filter
pour créer un tableau dekeys
à supprimer du hachage, puis le transmettreclient.hdel(HASH_NAME, ...keys)
en un seul appel.const keys = Object.keys(reply).filter(key => reply[key] && JSON.parse(reply[key]).expiryTime < Date.now()); client.hdel(HASH_NAME, ...keys);
Vous pouvez. Voici un exemple.
Utilisez EXPIRATION ou EXPIREAT commande.
Si vous souhaitez faire expirer des clés spécifiques dans le hachage, plus de 1 mois. Ce n'est pas possible. La commande Redis expire concerne toutes les clés du hachage. Si vous définissez une clé de hachage quotidienne, vous pouvez définir une durée de vie des clés.
la source
Vous pouvez stocker les clés / valeurs dans Redis différemment pour y parvenir, en ajoutant simplement un préfixe ou un espace de noms à vos clés lorsque vous les stockez, par exemple "hset_"
Obtenir une clé / valeur
GET hset_key
égale àHGET hset key
Ajouter une clé / valeur
SET hset_key value
égale àHSET hset key
Obtenez toutes les clés
KEYS hset_*
égales àHGETALL hset
Obtenir toutes les valeurs doit être effectué en 2 opérations, obtenir d'abord toutes les clés,
KEYS hset_*
puis obtenir la valeur de chaque cléAjoutez une clé / valeur avec TTL ou expirez qui est le sujet de la question:
Remarque :
KEYS
recherchera la correspondance de la clé dans toute la base de données, ce qui peut affecter les performances, en particulier si vous avez une grande base de données.Remarque:
KEYS
recherchera la correspondance de la clé dans toute la base de données, ce qui peut affecter les performances, en particulier si vous avez une grande base de données. alorsSCAN 0 MATCH hset_*
peut - être mieux aussi longtemps qu'il ne bloque pas le serveur mais la performance est un problème dans le cas de la grande base de données.Vous pouvez créer une nouvelle base de données pour stocker séparément ces clés que vous souhaitez expirer, surtout s'il s'agit d'un petit jeu de clés.
la source
hashset
.. get O (1) set O (1) get all O (n)O(n)
pour le nombre de choses dans l'ensemble,KEYS
pour le nombre de choses dans la DB.scan 0 match namespace:*
pourrait être mieux tant que cela ne bloque pas le serveurNous avons eu le même problème discuté ici.
Nous avons un hachage Redis, une clé pour les entrées de hachage (paires nom / valeur), et nous devions conserver des délais d'expiration individuels pour chaque entrée de hachage.
Nous avons implémenté cela 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 définissons également la clé pour qu'elle expire au moment contenu dans la valeur en cours d'écriture.
Ensuite, en lecture, nous décodons le préfixe et vérifions l'expiration. Il s'agit d'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é.
la source
Vous pouvez utiliser les notifications de l'espace clé Redis en utilisant
psubscribe
et"__keyevent@<DB-INDEX>__:expired"
.Avec cela, chaque fois qu'une clé expirera, vous recevrez un message publié sur votre connexion redis.
En ce qui concerne votre question, vous créez une clé temporaire "normale" en utilisant
set
un délai d'expiration en s / ms. Il doit correspondre au nom de la clé que vous souhaitez supprimer de votre ensemble.Comme votre clé temporaire sera publiée sur votre connexion redis en tenant le
"__keyevent@0__:expired"
quand elle a expiré, vous pouvez facilement supprimer votre clé de votre jeu d'origine car le message aura le nom de la clé.Un exemple simple en pratique sur cette page: https://medium.com/@micah1powell/using-redis-keyspace-notifications-for-a-reminder-service-with-node-c05047befec3
doc: https://redis.io/topics/notifications (recherchez le drapeau xE)
la source
Vous pouvez utiliser Sorted Set dans redis pour obtenir un conteneur TTL avec horodatage 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 sur 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 le ménage à partir d'un processus externe pour maintenir la taille de l'ensemble.
la source
Vous pouvez facilement expirer les hachages Redis, par exemple en utilisant python
Cela expirera toutes les clés enfants dans hash hashed_user après 10 secondes
idem de redis-cli,
après 10 secondes
la source
hset
enfant pas le pleinhset
.