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.
我会推荐三个选项;
scan
是 keys
的更好替代方案,因为它不会长时间阻塞服务器。在您的应用程序级别,您可以执行与您的模式匹配的散列键,然后使用 HGET
(O(1)) 两次并进行比较。如果您的哈希键没有很多字段,HGETALL
也是另一种选择。
另一种选择是在单独的 set/list 中跟踪与模式匹配的哈希键。每当您调用 HMSET
或 HSET
时,您也会按 set/list 中的那个键。通过跟踪密钥,您以后不再需要使用 scan
。您可能只是以分页的方式获取它们来执行相关的哈希命令。作为推荐之一,这也需要应用层查询而不是数据层查询。
由于您需要使用多个条件进行查询,因此最好将它们保存在关系数据库中(postgresql、mysql 等)。 Redis 可以很好地为您的哈希提供服务,但是当您需要以您想要查询的方式查询您的哈希时,最好重新建模您的数据。
所以,我有一堆(数千)散列,名称如下:
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.
我会推荐三个选项;
scan
是keys
的更好替代方案,因为它不会长时间阻塞服务器。在您的应用程序级别,您可以执行与您的模式匹配的散列键,然后使用HGET
(O(1)) 两次并进行比较。如果您的哈希键没有很多字段,HGETALL
也是另一种选择。另一种选择是在单独的 set/list 中跟踪与模式匹配的哈希键。每当您调用
HMSET
或HSET
时,您也会按 set/list 中的那个键。通过跟踪密钥,您以后不再需要使用scan
。您可能只是以分页的方式获取它们来执行相关的哈希命令。作为推荐之一,这也需要应用层查询而不是数据层查询。由于您需要使用多个条件进行查询,因此最好将它们保存在关系数据库中(postgresql、mysql 等)。 Redis 可以很好地为您的哈希提供服务,但是当您需要以您想要查询的方式查询您的哈希时,最好重新建模您的数据。