【问题标题】:php Redis::hscan Retrieve all hashes with wildcard name and conditionphp Redis::hscan 使用通配符名称和条件检索所有哈希
【发布时间】:2020-04-29 06:35:34
【问题描述】:

所以,我有一堆(数千个)哈希,名称如下:

state:city:street

每一个里面都有这样的东西:

signId => 10,
damaged => 1

我本质上是想做一些我不确定是否可行的诡计。

我想获取signId 的所有值,但前提是signId 条目存在但damaged 条目不存在...

对于所有属于通配符state:city:*的哈希

一切都在 PHP / Laravel / Predis 中

【问题讨论】:

  • 如果没有办法做到这一点,有没有办法按照我使用 Redis 的方式来构建它,使其更简单?
  • 你的redis服务器有多少个key?这将是一次性执行还是您会积极使用它?
  • 每天会被使用数百次。假设将有多达 15000 个键/哈希/集。但我只想选择哈希,所以任何时候都少于 1000 个。

标签: php laravel redis predis


【解决方案1】:

在 redis 中没有内置的特性或函数来完成它们。我不建议您在生产中使用keys。正如redis documentation 中提到的那样;

keys 在生产环境中使用时应格外小心。当它针对大型数据库执行时,它可能会破坏性能。

我会推荐三个选项;

  • scankeys 的更好替代品,因为它不会长时间阻塞服务器。在您的应用程序级别上,您可以执行与您的模式匹配的哈希键,然后使用 HGET (O(1)) 两次并进行比较。如果您的哈希键没有很多字段,HGETALL 也是另一种选择。

  • 另一个选项是跟踪与单独集合/列表中的模式匹配的哈希键。每当您致电HMSETHSET 时,您也可以在集合/列表中按下该键。通过跟踪密钥,您以后不再需要使用scan。您可能只是以分页方式获取它们以执行相关的哈希命令。作为建议之一,这也需要应用程序级查询而不是数据层查询。

  • 由于您需要查询多个条件,最好将它们保存在关系数据库(postgresql、mysql 等)中。 Redis 可以很好地为您的哈希提供服务,但是当您需要以您想要查询的方式查询您的哈希时,最好重新建模您的数据。

【讨论】:

    【解决方案2】:

    您必须先以keys state:city:* 的身份获取密钥

    然后,您将不得不一个接一个地执行HGETALL state:city:{name},即循环。

    【讨论】:

    • 我真的不想使用 KEYS,因为它会阻塞。没有别的办法吗?
    • 很遗憾,没有
    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 2011-02-05
    • 2014-06-26
    • 2015-06-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2016-02-24
    相关资源
    最近更新 更多