737 votes

Comment atomiquement supprimer les clés correspondant à un motif à l'aide Redis

Dans mon Redis DB j'ai un certain nombre de prefix:<numeric_id> les tables de hachage.

Parfois, j'ai envie de les purger tous les atomiquement. Comment puis-je le faire sans l'aide de certains distribué mécanisme de verrouillage?

846voto

Casey Points 308

Exécuter en bash:

redis-cli KEYS "prefix:*" | xargs redis-cli DEL

Mise à JOUR

Ok, j'ai compris. Ce sujet de cette façon: magasin de courant supplémentaires préfixe et l'ajouter à toutes vos clés. Par exemple:

Vous avez des valeurs comme ceci:

prefix_prefix_actuall = 2
prefix:2:1 = 4
prefix:2:2 = 10

Lorsque vous avez besoin de purger les données, vous changez prefix_actuall première (par exemple prefix_prefix_actuall = 3), de sorte que votre application va écrire de nouvelles données clés préfixe:3:1 et un préfixe:3:2. Ensuite, vous pouvez prendre en toute sécurité les anciennes valeurs de préfixe:2:1 et un préfixe:2:2 et la purge des anciennes clés.

490voto

mcdizzle Points 601

En commençant par le redis 2.6.0, vous pouvez exécuter des scripts lua, qui s'exécutent de manière atomique. Je n'ai jamais écrit, mais je pense qu'il ressemblerait à quelque chose comme ceci

EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 prefix:*

Mise à JOUR: lien vers EVAL de la documentation.

87voto

Eli Points 5047

Voici un tout de travail et atomique version du générique de supprimer des mises en œuvre en Lua. Ça va fonctionner beaucoup plus rapidement que les xargs version en raison de beaucoup moins de réseau va-et-vient, et c'est complètement atomique, le blocage de toutes les autres demandes contre le redis jusqu'à la fin. Si vous voulez atomiquement supprimer les clés sur le Redis 2.6.0 ou plus, c'est certainement le chemin à parcourir:

redis-cli -n [some_db] -h [some_host_name] EVAL "return redis.call('DEL', unpack(redis.call('KEYS', ARGV[1] .. '*')))" 0 prefix:

C'est une version de travail de @mcdizzle l'idée dans sa réponse à cette question. Crédit pour l'idée à 100% pour lui.

EDIT: Par Kikito de commentaire ci-dessous, si vous avez plus de touches pour supprimer de la mémoire disponible de votre serveur Redis, vous allez lancer dans le "trop grand nombre d'éléments à déballer" erreur. Dans ce cas, n':

for _,k in ipairs(redis.call('keys', ARGV[1])) do 
    redis.call('del', k) 
end

Comme Kikito suggéré.

80voto

Itamar Haber Points 2317

Avertissement: la solution suivante n'est pas de fournir de l'atomicité.

En commençant par v2.8 vous vraiment voulez utiliser le SCAN de commande au lieu des TOUCHES[1]. Le script Bash suivant illustre la suppression des clés par le modèle:

#!/bin/bash

if [ $# -ne 3 ] 
then
  echo "Delete keys from Redis matching a pattern using SCAN & DEL"
  echo "Usage: $0 <host> <port> <pattern>"
  exit 1
fi

cursor=-1
keys=""

while [ $cursor -ne 0 ]; do
  if [ $cursor -eq -1 ]
  then
    cursor=0
  fi

  reply=`redis-cli -h $1 -p $2 SCAN $cursor MATCH $3`
  cursor=`expr "$reply" : '\([0-9]*[0-9 ]\)'`
  keys=${reply##[0-9]*[0-9 ]}
  redis-cli -h $1 -p $2 DEL $keys
done

[1] les CLÉS est dangereux de commande qui peut potentiellement entraîner un déni de service. Ce qui suit est une citation de sa page de documentation:

Avertissement: considérer les TOUCHES comme une commande qui ne devrait être utilisé dans les environnements de production avec un soin extrême. Il peut ruiner les performances lorsqu'il est exécuté sur de grandes bases de données. Cette commande est destinée à des fins de débogage et d'opérations spéciales, telles que la modification de votre espace de mise en page. Ne pas utiliser les TOUCHES de votre code d'application. Si vous êtes à la recherche d'un moyen de trouver les clés dans un sous-ensemble de votre espace de clé, envisager d'utiliser des ensembles.

5voto

alexpopescu Points 7194

Je pense que ce qui pourrait vous aider est le MULTI/EXEC/JETER. Alors que pas 100% équivalent à des opérations, vous serez en mesure d'isoler les supprime d'autres mises à jour.

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