我知道为了获得Redis中所有键的所有列表,我必须使用KEYS *
,但是有没有办法将所有键和它们的值一起输出?
几分钟的搜索没有产生任何结果。
P.S。非常感谢你的答案,但我正在寻找一个原生的解决方案。我可以编写一个函数来迭代遍历KEYS *
的所有输出。
答案 0 :(得分:30)
Redis command documentation不包含用于获取多个键的键和值的本机命令。
执行此操作的最原生方法是使用lua script命令或SCRIPT LOAD
命令将EVAL
加载到您的redis中。
解决方法将使用一些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
可以解决问题。它返回一个
所有字段及其值。
答案 5 :(得分:0)
答案 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的KEYS
和MGET
请求:
# 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上出现错误。
$ sudo redis-cli
INFO keyspace
AUTH yourpassword
INFO keyspace
#!/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
bash redis_print.sh > redis.bak
tail redis.bak
答案 11 :(得分:-1)
scan 0 MATCH * COUNT 1000 //获取所有密钥 如果return作为第一个元素为“ 0”,则计数小于1000 如果更多,它将返回指针作为第一个元素,并> scan pointer_val MATCH * COUNT 1000 要获得下一组键,它会一直持续到第一个值为“ 0”为止。