Redis:返回存储在数据库中的所有值

21

我们正在使用Redis将各种应用程序配置存储在DB 0中。

是否有可能查询Redis中数据库中的每个键/值对,而无需执行两个单独的查询并自己连接键/值对?

我希望有类似于以下功能:

kv = redis_conn.getall()
# --OR-- #
kv = redis_conn.mget('*')

...其中kv将返回元组的元组、列表的列表或字典:

但是,在搜索StackOverflow、Google和Redis文档后,我发现唯一的解决方案(我还没有找到其他人提出这个问题…)类似于以下内容:

import redis
red = redis.Redis(host='localhost', db=0)
keys = red.keys()
vals = red.mget(keys)
kv = zip(keys, vals)

我在这里是否有些疯了,认为这个问题可能有更优雅的解决方法?

附加信息

该数据库中的每个值都是字符串。

我的问题并不是如何检索每种唯一数据类型或与数据类型相关的值。

相反,我的问题是:是否有一种方法可以说“嘿Redis,将数据库中的每个字符串值返回给我”,而无需要求键,然后根据返回的键查询值?


1
仅适用于字符串,还是您想查询所有数据类型?MGET对于非字符串类型返回nil - raffian
所有值目前都存储为字符串,因此只有字符串就可以了。 - Joshua Burns
如果您需要进行调试,您可能想查看以下答案。 - x-yuri
1个回答

42

Redis中不同数据类型之间存在差异,因此您需要查看数据类型以确定如何从键(key)获取值。所以:

keys = redis.keys('*')
for key in keys:
    type = redis.type(key)
    if type == "string":
        val = redis.get(key)
    if type == "hash":
        vals = redis.hgetall(key)
    if type == "zset":
        vals = redis.zrange(key, 0, -1)
    if type == "list":
        vals = redis.lrange(key, 0, -1)
    if type == "set":
        vals = redis. smembers(key)

12
KVHASHZSET 是 Redis 数据结构之一,分别对应键值对、哈希表和有序集合。如果执行dir(redis)命令,是看不到这些数据结构的。 - Leonid
@ideawu,回答上面提到的评论会很有价值——因为我也不知道该怎么办。 - Joshua Burns
请记住,如果它以二进制保存,例如 b'string',那么您必须将类型与二进制字符串进行比较。例如: if type == b'string' - Matteo Guarnerio
@MatteoGuarnerio 默认情况下,您可以解码值。因此,类似于 r = redis.StrictRedis('localhost', 6379, charset="utf-8", decode_responses=True) 这样的代码就可以实现。来源:https://dev59.com/2VcP5IYBdhLWcg3wqLzA#44032018 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接