web-dev-qa-db-fra.com

Comment obtenir toutes les clés avec leurs valeurs dans redis

Je sais que pour obtenir la liste de toutes les clés dans Redis, je dois utiliser KEYS *, mais existe-t-il un moyen de les afficher toutes avec leurs valeurs?

Quelques minutes de recherche n'ont donné aucun résultat.

P.S. merci beaucoup pour les réponses, mais je cherche une solution native. Je peux écrire une fonction qui parcourt toute la sortie de KEYS * par moi-même.

26
Salvador Dali

Il n'y a pas de moyen indigène de faire cela.

La documentation de la commande Redis ne contient aucune commande native permettant d’obtenir la clé et la valeur de plusieurs clés.

Le moyen le plus naturel de procéder consiste à charger un script lua dans vos fichiers redis à l’aide de la commande SCRIPT LOAD ou de la commande EVAL .

Solution Bash Haxx

Une solution de contournement} _ serait d'utiliser un peu de magie bash, comme ceci:

echo 'keys YOURKEY*' | redis-cli | sed 's/^/get /' | redis-cli 

Cela produira les données de toutes les clés commençant par YOURKEY.

Notez que la commande keys est une opération bloquante et doit être utilisée avec précaution.

27
firelynx

Oui, vous pouvez imprimer toutes les clés en utilisant le script bash ci-dessous,

for key in $(redis-cli -p 6379 keys \*);
  do echo "Key : '$key'" 
     redis-cli -p 6379 GET $key;
done

où 6379 est un port sur lequel redis est exécuté.

5
Nikhil

La commande KEYS ne doit pas être utilisée sur les instances de production Redis si vous avez beaucoup de clés, car elle pourrait bloquer la boucle d’événements Redis pendant plusieurs secondes.

Je générerais un dump (bgsave), puis utiliserais le package Python suivant pour l'analyser et extraire les données:

https://github.com/sripathikrishnan/redis-rdb-tools

Vous pouvez avoir une sortie JSON ou personnaliser votre propre sortie en Python.

2
Didier Spezia

check out rdd

rdd -v

vous sortiront toutes les clés avec des données

1
r043v

scan 0 MATCH * COUNT 1000 // il obtient toutes les clés si return est "0" comme premier élément, alors count est inférieur à 1000 s'il en contient plus, il renvoie le pointeur en tant que premier élément et> scan pointer_val MATCH * COUNT 1000 pour obtenir le jeu de clés suivant, il continue jusqu'à ce que la première valeur soit "0".

0
JackAss

J'ai écrit un petit code pour cette exigence particulière en utilisant hiredis. Veuillez trouver le code avec un exemple pratique sur http://rachitjain1.blogspot.in/2013/10/how-to-get-all-keyvalue-in- redis-db.html

Voici le code que j'ai écrit,

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hiredis.h"

int main(void)
{
        unsigned int i,j=0;char **str1;
        redisContext *c; char *t;
        redisReply *reply, *rep;

        struct timeval timeout = { 1, 500000 }; // 1.5 seconds
        c = redisConnectWithTimeout((char*)"127.0.0.2", 6903, timeout);
        if (c->err) {
                printf("Connection error: %s\n", c->errstr);
                exit(1);
        }

        reply = redisCommand(c,"keys *");
        printf("KEY\t\tVALUE\n");
        printf("------------------------\n");
        while ( reply->element[j]->str != NULL)
        {
                rep = redisCommand(c,"GET  %s", reply->element[j]->str);
                if (strstr(rep->str,"ERR Operation against a key holding"))
                {
                        printf("%s\t\t%s\n",  reply->element[j]->str,rep->str);
                        break;
                }
                printf("%s\t\t%s\n",  reply->element[j]->str,rep->str);
                j++;
                freeReplyObject(rep);
        }
}
0
Jain Rach

J'ai eu le même problème, et je me suis senti sur votre post. 

Je pense que le moyen le plus simple de résoudre ce problème consiste à utiliser redis Hashtable. 

Il vous permet de sauvegarder un hachage, avec différents champs et valeurs associés à chaque champ. 

Pour obtenir tous les champs et valeurs, client.HGETALLL fait l'affaire. Il retourne un tableau de 

tous les champs suivis de leurs valeurs. 

Plus d'informations ici https://redis.io/commands/hgetall

0
Steave J.