Как получить все ключи с их значениями в redis
Я знаю, что для того, чтобы получить весь список всех ключей в Redis, мне нужно использовать KEYS *
, но есть ли способ вывести все ключи вместе со своими значениями?
Несколько минут поиска не дали никакого результата.
P.S. Большое спасибо за ответы, но я ищу собственное решение. Я могу написать функцию, которая выполняет итерацию через весь вывод KEYS *
самостоятельно.
Ответы
Ответ 1
Не существует собственного способа сделать это.
Документация команды Redis содержит собственные команды для получения ключа и значения нескольких ключей.
Самый распространенный способ сделать это - загрузить lua script в ваш redis, используя SCRIPT LOAD
или EVAL
.
Bash Решение Haxx
A обходной путь должен был бы использовать некоторую магию bash, например:
echo 'keys YOURKEY*' | redis-cli | sed 's/^/get /' | redis-cli
Это приведет к выводу данных из всех ключей, начинающихся с YOURKEY
Обратите внимание, что команда клавиш является блокировкой и должна использоваться с осторожностью.
Ответ 2
Да, вы можете распечатать все ключи, используя приведенный ниже скрипт bash,
for key in $(redis-cli -p 6379 keys \*);
do echo "Key : '$key'"
redis-cli -p 6379 GET $key;
done
где 6379 - это порт, на котором работает Redis.
Ответ 3
Команда KEYS не должна использоваться в экземплярах Redis, если у вас много ключей, поскольку она может блокировать цикл событий Redis в течение нескольких секунд.
Я бы сгенерировал дамп (bgsave), а затем использовал следующий пакет Python для его анализа и извлечения данных:
https://github.com/sripathikrishnan/redis-rdb-tools
Вы можете получить json-выход или настроить собственный вывод в Python.
Ответ 4
Я немного усовершенствовал решение bash, чтобы вместо ключей использовалось более эффективное сканирование, а также поддерживалась распечатка значений массива и хеша. Мое решение также распечатывает имя ключа.
redis_print.sh:
#!/bin/bash
# Default to '*' key pattern, meaning all redis keys in the namespace
REDIS_KEY_PATTERN="${REDIS_KEY_PATTERN:-*}"
for key in $(redis-cli --scan --pattern "$REDIS_KEY_PATTERN")
do
type=$(redis-cli type $key)
if [ $type = "list" ]
then
printf "$key => \n$(redis-cli lrange $key 0 -1 | sed 's/^/ /')\n"
elif [ $type = "hash" ]
then
printf "$key => \n$(redis-cli hgetall $key | sed 's/^/ /')\n"
else
printf "$key => $(redis-cli get $key)\n"
fi
done
Примечание: вы можете сформулировать однострочную часть этого скрипта, удалив первую строку redis_print.sh и получив команду: cat redis_print.sh | tr '\n' ';' | awk '$1=$1'
Ответ 5
У меня была такая же проблема, и я почувствовал на вашем посту.
Я думаю, что самый простой способ решить эту проблему - использовать Redis Hashtable.
Это позволяет сохранить хэш с различными полями и значениями, связанными с каждым полем.
Чтобы получить все client.HGETALLL
и значения client.HGETALLL
делает client.HGETALLL
дело. Возвращает массив
все поля сопровождаются их значениями.
Больше информации здесь https://redis.io/commands/hgetall
Ответ 6
Я написал небольшой код для этого конкретного требования с помощью hiredis, пожалуйста, найдите код с рабочим примером в http://rachitjain1.blogspot.in/2013/10/how-to-get-all-keyvalue-in-redis-db.html
Вот код, который я написал,
#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);
}
}
Ответ 7
scan 0 MATCH * COUNT 1000//он получает все ключи, если return равен 0 в качестве первого элемента, а count меньше 1000, если больше, то он возвращает указатель в качестве первого элемента и> scan pointer_val MATCH * COUNT 1000, чтобы получить следующий набор ключей продолжается до первого значения "0".
Ответ 8
проверить rdd
rdd -v
выдаст вам все ключи с данными