如何通过掩码或模板快速获取 Redis 中的所有对象?

How can I get all objects from Redis by mask or template quicklly?

提问人:Utusikov Oleg 提问时间:12/26/2019 更新时间:12/26/2019 访问量:1230

问:

大家下午好,我想通过掩码或模板从 Redis 获取所有对象。我知道我可以使用 KEYS,但它非常慢,因为它适用于 O(n),其中 n 是数据库中所有键的大小,并且只返回没有数据的键。你能给我一个好的解决方案吗?

数据库 Redis 服务器端

评论

0赞 Guy Korland 12/26/2019
你检查过 RediSearch 或 RedisGears 吗?

答:

1赞 Qwe 12/26/2019 #1

您可以使用 SCAN https://redis.io/commands/scan 或 HGETALL 命令并将对象存储在哈希表中以获取详细信息,我建议您查看文档 https://redis.io/commands/hgetall

0赞 Praga_t 12/26/2019 #2

SCAN是替换时间复杂度的 coz 的合适选项。但是,无法使用此选项获取密钥的值。由于您可以使用哈希结构,因为您可以使用在单个调用中检索所有键和值。正如@Qwe所说,这是适用于您的情况的两个选项。但是,我个人使用 bash 脚本来摆脱这些,因为我不想将我的结构更改为哈希。喜欢这个。KEYS *HGETALL

#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

我希望这将是丰满的。