我知道要获取Redis中所有键的列表,必须使用KEYS *
,但是否有一种方法可以将所有键及其值一起输出?
几分钟的搜索没有得到任何结果。
P.S. 非常感谢您的答案,但我正在寻找一种本地解决方案。 我可以自己编写一个函数来迭代KEYS *
的所有输出。
我知道要获取Redis中所有键的列表,必须使用KEYS *
,但是否有一种方法可以将所有键及其值一起输出?
几分钟的搜索没有得到任何结果。
P.S. 非常感谢您的答案,但我正在寻找一种本地解决方案。 我可以自己编写一个函数来迭代KEYS *
的所有输出。
Redis命令文档中没有本地命令可以获取多个键的键和值。
最本地的方法是使用lua脚本通过使用SCRIPT LOAD
命令或EVAL
命令加载到你的Redis中。
一个解决方法是使用一些Bash技巧,例如:
echo 'keys YOURKEY*' | redis-cli | sed 's/^/get /' | redis-cli
这将输出以YOURKEY开头的所有键的数据。
请注意,keys命令是一个阻塞操作,应谨慎使用。
是的,您可以使用以下Bash脚本打印所有键:
for key in $(redis-cli -p 6379 keys \*);
do echo "Key : '$key'"
redis-cli -p 6379 GET $key;
done
其中,6379是redis运行的端口。
redis-cli GET $key | jq .
来获取JSON值的漂亮打印。 - Raphaël我稍微优化了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'
如果您有大量的键,就不应该在 Redis 生产实例上使用 KEYS 命令,因为它可能会阻塞 Redis 事件循环数秒钟。
我建议先生成一个 dump 文件(使用 bgsave 命令),然后使用以下 Python 包来解析文件并提取数据:
https://github.com/sripathikrishnan/redis-rdb-tools
您可以得到 JSON 格式的输出,或者在 Python 中自定义您需要的输出格式。
bgsave
不会存储只包含数字的键名;此外,你也可以使用 strings
命令来解析 Redis 的 dump.rdb 文件。 - αғsнιη示例:
redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)
如果要列出所有的键和值,您可能需要使用bash或类似的东西,但是当您事先知道要查找哪些键时,MGET
可以帮助列出所有的值。
我遇到了同样的问题,然后看到了你的帖子。
我认为解决这个问题最简单的方法是使用redis哈希表。
它允许你保存一个哈希表,其中包含不同的字段和与每个字段相关联的值。
要获取所有字段和值,client.HGETALLL
可以解决问题。它返回一个数组,其中包含所有字段及其对应的值。
更多信息请参见此处:https://redis.io/commands/hgetall
使用此脚本适用于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
$ 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
redis-cli
命令,您可以按照以下方式导出键和值:#!/bin/bash
# Get all keys and their values using redis-cli
redis-cli --raw KEYS "*" | while read key; do
value=$(redis-cli --raw GET "$key")
echo "$key: $value" >> "redis_dump.txt"
done
#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);
}
}