我知道为了获取 Redis 中所有键的所有列表,我必须使用KEYS *
,但是有没有办法将所有键及其值一起输出?
几分钟的搜索没有产生任何结果。
PS非常感谢您的回答,但我正在寻找本机解决方案。我可以编写一个函数来遍历KEYS *
我自己的所有输出。
我知道为了获取 Redis 中所有键的所有列表,我必须使用KEYS *
,但是有没有办法将所有键及其值一起输出?
几分钟的搜索没有产生任何结果。
PS非常感谢您的回答,但我正在寻找本机解决方案。我可以编写一个函数来遍历KEYS *
我自己的所有输出。
Redis 命令文档不包含用于获取多个键的键和值的本机命令。
执行此操作的最原生方式是使用command 或command 将lua 脚本加载到您的 redis 中。SCRIPT LOAD
EVAL
一种解决方法是使用一些 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 的端口。
我稍微改进了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'
如果您有很多键,则不应在 Redis 生产实例上使用 KEYS 命令,因为它可能会阻塞 Redis 事件循环几秒钟。
我将生成一个转储(bgsave),然后使用以下 Python 包对其进行解析并提取数据:
https://github.com/sripathikrishnan/redis-rdb-tools
你可以有 json 输出,或者在 Python 中自定义你自己的输出。
您可以使用MGET一次获取多个键的值。
例子:
redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)
要列出所有键和值,您可能必须使用 bash 或类似的东西,但是MGET
当您事先知道要查找哪些键时,可以帮助列出所有值。
我遇到了同样的问题,我在你的帖子中感受到了。
我认为解决这个问题最简单的方法是使用 redis Hashtable。
它允许您保存一个哈希,其中包含与每个字段关联的不同字段和值。
获取所有字段和值client.HGETALLL
就可以了。它返回一个数组
所有字段后跟它们的值。
将此脚本用于 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
我已经使用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);
}
}
尝试了给定的示例,但是通过 VPN 和 400k+ 密钥对我来说太慢了。它也没有给我关键对象。
我编写了一个名为redis-mass-get的小型 Python 工具来组合KEYS
和MGET
请求 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 读取多个键/值。
下面只是@“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
这个简单的脚本对我有用(我存储在我的 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 文件(逗号分隔符)。
scan 0 MATCH * COUNT 1000 // 如果返回为“0”作为第一个元素,则获取所有键,然后计数小于 1000,如果大于则它将指针作为第一个元素返回,>scan pointer_val MATCH * COUNT 1000 以获得下一组键它一直持续到第一个值为“0”。