如何在Redis中过滤和区分键

时间:2015-12-01 11:18:19

标签: redis

我有一个具有以下结构的Redis数据库

Redis estructure

而且,我想在一个查询中只获得第一级密钥。我的意思是:[EB, HY, LV, LW, MB, NV]

我想在keys *中返回数据库中的每个键。在那之后,我会遍历它们,分割键并计算每个的外观。但它需要代码,如果可能的话,我希望将结果放在一行中,当然。

有人知道如何帮助我吗?非常感谢。

2 个答案:

答案 0 :(得分:2)

  

而且,我想在一个查询中只获得第一级密钥。我的意思是:[EB,HY,LV,LW,MB,NV]。

这些“钥匙”不存在。它们是redis GUI的创建。 Redis本身并不了解它们。如您所述,您的真实密钥采用以下形式:

EB:0V:...
EB:400V:....
HY:0V:...
HY:400V:...

redis中没有命令会返回键名的一部分。这将在您的应用中处理。获取完整的键名,在冒号,聚合上拆分。

答案 1 :(得分:2)

首先,正如Sergio Tulentsev所说,你的GUI正在将冒号解释为执行命名空间。 Redis本身,不这样做。在this SO question中,我们很好地讨论了冒号在Redis中的作用。

那就是说,你需要编写代码才能做到这一点。如何编写代码取决于您计划执行此操作的环境以及您的速度和一致性要求。

如果你只是想在本地或开发人员那里想要了解你拥有的顶级密钥,你可以通过你选择的后端语言Redis客户端调用KEYS *,然后迭代#&} 39; s返回查找所有顶级命名空间。 Python中使用redis-py

的示例
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
top_level_namespaces = set([item.split(':')[0] for item in r.keys('*')])

如果你想在制作中这样做,你必须记住KEYS *非常非常慢,并且会阻止redis db直到它完成。如果您对此感到满意,可以使用与上面的Python示例相同的逻辑编写快速LUA script,以便逻辑在Redis服务器上运行,并且您不需要浪费网络时间将所有密钥传回您的应用服务器。

如果KEYS(*)对于您的用例来说太慢,并且一致性不是非常重要,则可以使用SCAN代替并迭代结果。

如果KEYS(*)太慢并且一致性非常重要,那么您可以做的最好的事情就是在应用程序中维护一组辅助的顶级命名空间作为应用程序逻辑,只需SMEMBERS来检索它们需要的时候。编写和维护应用程序逻辑会很烦人,但这将是最快,最持久的方法。