php Redis::hscan 检索所有具有通配符名称和条件的哈希

php Redis::hscan Retrieve all hashes with wildcard name and condition

所以,我有一堆(数千)散列,名称如下:

state:city:street

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

signId => 10,
damaged => 1

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

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

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

并且都在 PHP / Laravel / Predis

您必须先拿到钥匙,因为 keys state:city:*

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

redis 没有内置功能或函数来执行这些操作。我不建议您在生产中使用 keys。正如 redis documentation 中提到的那样;

keys should be used in production environment with extreme care. It may ruin performance when it is executed against large databases.

我会推荐三个选项;

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

  • 另一种选择是在单独的 set/list 中跟踪与模式匹配的哈希键。每当您调用 HMSETHSET 时,您也会按 set/list 中的那个键。通过跟踪密钥,您以后不再需要使用 scan。您可能只是以分页的方式获取它们来执行相关的哈希命令。作为推荐之一,这也需要应用层查询而不是数据层查询。

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