【问题标题】:How filter and distinct keys in RedisRedis中如何过滤和区分键
【发布时间】:2015-12-02 19:05:38
【问题描述】:

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

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

我曾想过keys * 会返回数据库中的每个键。之后,我会遍历所有这些,拆分键并计算每个键的出现次数。但它需要代码,当然,如果可能的话,我想在一行中得到想要的结果。

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

【问题讨论】:

  • [EB, HY, ...] 是数据集? Keys * 只返回第一级数据。问题:你在哪里显示这棵树
  • keys * return all keys: EB:0V:..., EB:400V:...., HY:0V:..., HY:400V:... 我只想要 EB, MB, HY,... 而不循环所有的键和手动过滤。我正在使用 Redis 桌面管理器redisdesktop.com
  • 是的,你需要写一些代码。

标签: redis


【解决方案1】:

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

也就是说,您需要编写代码来执行此操作。该代码的编写方式取决于您计划在什么环境中执行此操作以及您的速度和一致性要求是什么。

如果您只是想在本地或开发人员上执行此操作以大致了解您拥有哪些顶级密钥,您可以通过您选择的后端语言 Redis 客户端调用 KEYS *,然后遍历返回的内容以查找所有顶级命名空间。 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 检索它们。编写和维护应用程序逻辑会很烦人,但这将是最快和最持久的方法。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 2017-12-25
      • 1970-01-01
      • 2020-07-31
      • 2021-12-17
      • 1970-01-01
      相关资源
      最近更新 更多