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

Sal*_*ali 36 redis

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

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

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

fir*_*ynx 37

没有本地方式这样做.

Redis的命令文件包括获取键和多键的值没有本机命令.

执行此操作的最原生方法是使用命令或命令将lua脚本加载到redis中.SCRIPT LOADEVAL

Bash Haxx解决方案

一个解决办法是使用一些魔法的bash,就像这样:

echo 'keys YOURKEY*' | redis-cli | sed 's/^/get /' | redis-cli 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 它仅适用于字符串值,请参阅此[答案](/sf/answers/1351882521/)。 (2认同)

Juu*_*nen 14

我稍微改进了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
Run Code Online (Sandbox Code Playgroud)

注意:您可以通过删除redis_print.sh的第一行并命令来制定此脚本的单行cat redis_print.sh | tr '\n' ';' | awk '$1=$1'


小智 12

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

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

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


Did*_*zia 8

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

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

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

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

  • +1 人们可能没有意识到这是多么重要!如果您以一致的方式存储密钥,则应该能够检索它们而无需使用keys命令。 (2认同)

Kar*_*han 5

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

例子:

redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)
Run Code Online (Sandbox Code Playgroud)

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