Подтвердить что ты не робот

Как получить все ключи с их значениями в redis

Я знаю, что для того, чтобы получить весь список всех ключей в Redis, мне нужно использовать KEYS *, но есть ли способ вывести все ключи вместе со своими значениями?

Несколько минут поиска не дали никакого результата.

P.S. Большое спасибо за ответы, но я ищу собственное решение. Я могу написать функцию, которая выполняет итерацию через весь вывод KEYS * самостоятельно.

4b9b3361

Ответ 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

выдаст вам все ключи с данными