如何在redis中获取其值的所有键

时间:2013-10-14 06:48:46

标签: redis

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

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

P.S。非常感谢你的答案,但我正在寻找一个原生的解决方案。我可以编写一个函数来迭代遍历KEYS *的所有输出。

12 个答案:

答案 0 :(得分:30)

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

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

执行此操作的最原生方法是使用lua script命令或SCRIPT LOAD命令将EVAL加载到您的redis中。

Bash Haxx解决方案

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

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

这将输出以YOURKEY

开头的所有键的数据

请注意,keys命令是一个阻塞操作,应谨慎使用。

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:4)

我稍微完善了 bash 解决方案,以便使用效率更高的 scan 代替 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'

来编写此脚本的单行代码。

答案 3 :(得分:2)

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

我会生成一个转储(bgsave),然后使用以下Python包来解析它并提取数据:

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

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

答案 4 :(得分:1)

我遇到了同样的问题,我在您的帖子上感到满意。

我认为解决此问题的最简单方法是使用Redis Hashtable。

它允许您保存具有不同字段和与每个字段关联的值的哈希。

要获取所有字段和值,client.HGETALLL可以解决问题。它返回一个

数组

所有字段及其值。

更多信息,请点击https://redis.io/commands/hgetall

答案 5 :(得分:0)

结帐rdd

rdd -v

将输出所有带数据的键

答案 6 :(得分:0)

我已经使用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 :(得分:0)

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

示例:

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

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

答案 8 :(得分:0)

将此脚本用于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

答案 9 :(得分:0)

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

我编写了一个名为工具redis-mass-get的小型Python,以结合针对Redis的KEYSMGET请求:

# 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以便在管道中使用。有关更多信息,请访问:Reading multiple key/values from Redis

答案 10 :(得分:0)

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

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

1。获取密钥总数

$ 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

答案 11 :(得分:-1)

  

scan 0 MATCH * COUNT 1000 //获取所有密钥         如果return作为第一个元素为“ 0”,则计数小于1000         如果更多,它将返回指针作为第一个元素,并> scan pointer_val MATCH * COUNT 1000         要获得下一组键,它会一直持续到第一个值为“ 0”为止。