【问题标题】:Redis search for keys with a valueRedis 搜索带值的键
【发布时间】:2015-11-15 06:06:36
【问题描述】:

如何在 Ruby 中搜索具有值的键?例如获取值为“somevalue”的所有KEYS。

我的钥匙是

"xyz" => {:status=> "已连接", :topic=> "ABC"}

"PQR" => {:status=> "已连接", :topic=> "ABC"}

现在我需要找到所有主题为“ABC”的 KEYS

【问题讨论】:

标签: ruby redis redis-rails


【解决方案1】:

无论使用哪种编程语言,要有效地执行此操作,您都需要维护一个“索引”键,该键将某个值映射到键名。为此,您通常应该使用 Set 或 Sorted Set - 即向其中添加新的键名并根据它们的值删除它们 - 并在您想要“搜索”时获取该键的内容。

有一些库(即 gems)可以提供这种随时可用的功能 - 看看你的案例中最优秀的 Ohm

编辑

我的键是 xyz => {:status=> "connected", :topic=> "ABC"} PQR => {:status=> "connected", :topic=> "ABC"} 现在我需要查找主题为“ABC”的所有 KEYS

我会将 xyz 的值存储为字符串或哈希(取决于我是否需要更新/读取它的一部分)。然后我会 SADD topic:ABC xyz 并在其上执行 SMEMBERSSSCAN 以获取具有该主题的所有键的名称。当我DEL它的关键时,我也会尝试记住SREM来自topic:ABC的相关成员...

【讨论】:

  • 我的密钥是 xyz => {:status=> "connected", :topic=> "ABC"} PQR => {:status=> "connected", :topic=> "ABC"现在我需要找到所有主题为“ABC”的 KEYS
  • 嗨,我正在做 mapped_hmset "xyz", { status: "connected",topic: "ABC" } 。现在如何前进。我想如果我做会员,它会给我“XYZ”中的所有值。如何用“ABC”进行搜索
  • 当然,如果您需要的话。紧随其后的是 SADD 并用 MULTI/EXE 块包裹它以实现原子性。
  • 我想如果我做 SMEMBERS 它将打印该特定键中的所有值而不是搜索
  • SMEMBER topic:ABC 将返回所有具有 :topic=>"ABC" 的键名,如果您按照说明进行处理。除非我严重误解了您的问题,否则键名的顺序无关紧要。
【解决方案2】:

取决于你可以在 redis >= 2.8.13 上使用getkeys 的redis 版本,或者你可以使用keys 命令来处理一些性能问题(如果你有几个键应该不是问题,但如果你有大量的键需要注意这一点,因为键命令会阻塞 redis 片刻以获取所有键)

如果您运行的是 redis 2.8,您将能够使用 scan 命令代替键。

编辑: Redis 文档中最近添加的页面提供了有关 Secondary indexing with Redis 的更多信息,并在 Non range indexes 部分下涵盖了此案例。其中的其他主题包括:

【讨论】:

  • 我不同意 - COMMAND GETKEYS 与此无关,请 RTFM。 KEYS 不是你想使用的命令......永远(忘记阻止,那是孩子的游戏,OOM 是你应该害怕的)。无论如何,KEYSSCAN 都需要时间和资源,因此如果您想要快速响应,它们是一个糟糕的选择。
  • 我同意这一点,我说过在生产环境中使用 keys 命令不是一件好事,也不是一个安全的解决方案。但是是 redis 解决方案和命令的一部分,如果您需要(例如,如果您正在调试开发或从从节点读取或任何您想要的),您可以使用它们。
  • 如果您是开发人员或管理员,您也可以使用rm -rf / :) SCAN 不如 KEYS,但它仍然需要 O(N) 才能遍历键空间(更不用说发回键名,然后对每个键名进行读取...)。作为一种调试/临时方法,当然,无论如何。作为解决应用程序需求的一种方法 - 永远不会! (顺便说一句,请参阅 Redis 戒律 VI:gist.github.com/itamarhaber/d125cec7ebc5ec3886ab
  • 哈哈!!好要点!!!我同意这一点,但如果我是你,我永远不会做 rm -fr / ,这不是一个好习惯;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 2023-04-11
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多