80

我知道为了获取 Redis 中所有键的所有列表,我必须使用KEYS *,但是有没有办法将所有键及其值一起输出?

几分钟的搜索没有产生任何结果。

PS非常感谢您的回答,但我正在寻找本机解决方案。我可以编写一个函数来遍历KEYS *我自己的所有输出。

4

13 回答 13

53

没有本地方法可以做到这一点。

Redis 命令文档不包含用于获取多个键的键和值的本机命令。

执行此操作的最原生方式是使用command 或command 将lua 脚本加载到您的 redis 中。SCRIPT LOADEVAL

Bash Haxx 解决方案

一种解决方法是使用一些 bash 魔法,如下所示:

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

这将输出所有以 YOURKEY 开头的键的数据

请注意,keys 命令是一个阻塞操作,应该小心使用。

于 2015-02-06T15:37:29.873 回答
34

是的,您可以使用以下 bash 脚本打印所有键,

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

其中,6379 是运行 redis 的端口。

于 2018-04-18T14:55:03.700 回答
16

我稍微改进了bash解决方案,以便使用更有效的扫描而不是keys,并且支持打印出数组和哈希值。我的解决方案还打印出密钥名称。

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'

于 2019-08-27T12:18:34.513 回答
9

如果您有很多键,则不应在 Redis 生产实例上使用 KEYS 命令,因为它可能会阻塞 Redis 事件循环几秒钟。

我将生成一个转储(bgsave),然后使用以下 Python 包对其进行解析并提取数据:

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

你可以有 json 输出,或者在 Python 中自定义你自己的输出。

于 2013-10-14T11:23:31.010 回答
4

您可以使用MGET一次获取多个键的值。

例子:

redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)

要列出所有键和值,您可能必须使用 bash 或类似的东西,但是MGET当您事先知道要查找哪些键时,可以帮助列出所有值。

于 2020-02-06T00:59:33.407 回答
3

我遇到了同样的问题,我在你的帖子中感受到了。

我认为解决这个问题最简单的方法是使用 redis Hashtable。

它允许您保存一个哈希,其中包含与每个字段关联的不同字段和值。

获取所有字段和值client.HGETALLL就可以了。它返回一个数组

所有字段后跟它们的值。

更多信息在这里https://redis.io/commands/hgetall

于 2018-08-29T17:10:03.220 回答
2

将此脚本用于 redis >=5:

#!/bin/bash
redis-cli keys "*" > keys.txt
cat keys.txt | awk '{ printf "type %s\n", $1 }' | redis-cli > types.txt
paste -d'|' keys.txt types.txt | awk -F\| '
   $2 == "string"               { printf "echo \"KEY %s %s\"\nget %s\n", $1, $2, $1 }
   $2 == "list" || $2 == "set"  { printf "echo \"KEY %s %s\"\nsort %s by nosort\n", $1, $2, $1 }
   $2 == "hash"                 { printf "echo \"KEY %s %s\"\nhgetall %s\n", $1, $2, $1 }
   $2 == "zset"                 { printf "echo \"KEY %s %s\"\nzrange %s 0 -1 withscores\n", $1, $2,$1 }
' | redis-cli
rm keys.txt
rm types.txt
于 2020-04-19T12:15:16.377 回答
1

我已经使用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);
        }
}
于 2013-10-28T09:09:11.500 回答
1

尝试了给定的示例,但是通过 VPN 和 400k+ 密钥对我来说太慢了。它也没有给我关键对象。

我编写了一个名为redis-mass-get的小型 Python 工具来组合KEYSMGET请求 Redis:

# installation:
pip install redis-mass-get

# pipeline example CSV:
redis-mass-get -f csv -och redis://my.redis.url product:* | less

# write to json-file example with progress indicator:
redis-mass-get -d results.json -jd redis://my.redis.url product:*

它支持 JSON、CSV 和 TXT 输出到文件或stdout在管道中使用。可以在以下位置找到更多信息:从 Redis 读取多个键/值

于 2020-08-17T10:57:54.030 回答
1

下面只是@“Juuso Ohtonen”提供的脚本的一个小变种。

我添加了密码变量计数器,以便您可以检查备份的进度。[]我还用双括号 替换了简单的括号,[[]]以防止我在 macos 上出现错误。

1.获取key的总数

$ sudo redis-cli
INFO keyspace
AUTH yourpassword
INFO keyspace

2. 编辑脚本

#!/bin/bash

# Default to '*' key pattern, meaning all redis keys in the namespace
REDIS_KEY_PATTERN="${REDIS_KEY_PATTERN:-*}"
PASS="yourpassword"
i=1
for key in $(redis-cli -a "$PASS" --scan --pattern "$REDIS_KEY_PATTERN")
do
    echo $i.
    ((i=i+1))
    type=$(redis-cli -a "$PASS" type $key)
    if [[ $type = "list" ]]
    then
        printf "$key => \n$(redis-cli -a "$PASS" lrange $key 0 -1 | sed 's/^/  /')\n"
    elif [[ $type = "hash" ]]
    then
        printf "$key => \n$(redis-cli -a "$PASS" hgetall $key | sed 's/^/  /')\n"
    else
        printf "$key => $(redis-cli -a "$PASS" get $key)\n"
    fi
    echo
done

3.执行脚本

bash redis_print.sh > redis.bak

4.检查进度

tail redis.bak
于 2020-09-18T15:22:45.380 回答
0

这个简单的脚本对我有用(我存储在我的 REDIS 键值集中)

#!/bin/bash

for key in $(redis-cli -p <port> -n <db num> keys \*);
  do
    OUTPUT=$(redis-cli -p <port> -n <db num> GET $key)
    echo "$key", "${OUTPUT}" >> redis_pairs.csv
done

您只需执行它:

$ chmod +x script.sh
$ ./script.sh

最终输出是我需要的对的 .csv 文件(逗号分隔符)。

于 2021-12-08T12:44:26.000 回答
-1

看看我的工具,rdd

rdd -v

将为您输出所有带有数据的键

于 2013-10-14T14:45:34.467 回答
-1

scan 0 MATCH * COUNT 1000 // 如果返回为“0”作为第一个元素,则获取所有键,然后计数小于 1000,如果大于则它将指针作为第一个元素返回,>scan pointer_val MATCH * COUNT 1000 以获得下一组键它一直持续到第一个值为“0”。

于 2018-12-19T04:56:32.097 回答