php redis::hs可以检索具有通配符名称和条件的所有哈希

yshpjwxd  于 2021-06-09  发布在  Redis
关注(0)|答案(2)|浏览(460)

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

state:city:street

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

signId => 10,
damaged => 1

我基本上想做一些我不确定是否可能的诡计。
我想得到所有的值 signId 但前提是 signId 条目存在,但 damaged 条目不存在。。。
对于所有属于通配符的哈希 state:city:* 所有这些都在php/laravel/predis中

d6kp6zgx

d6kp6zgx1#

你得先拿到钥匙 keys state:city:* 那么,你就必须 HGETALL state:city:{name} 一个接一个,即在一个循环中。

ut6juiuv

ut6juiuv2#

redis中没有内置的特性或函数来实现这些功能。我不建议你使用 keys 在生产中。正如redis文档中提到的那样; keys 在生产环境中使用时应格外小心。当它在大型数据库上执行时,可能会破坏性能。
我将推荐三种选择; scan 是一个更好的选择 keys 因为它不会阻塞服务器很长时间。在应用程序级别上,可以执行与模式匹配的哈希键,然后使用 HGET (o(1))两次并进行比较。 HGETALL 如果哈希键没有太多字段,也是另一种选择。
另一种方法是在单独的集合/列表中跟踪与模式匹配的哈希键。不管你什么时候打电话 HMSET 或者 HSET 你也可以在集合/列表中按下该键。通过跟踪钥匙,您不再需要使用 scan 以后再说。您可能只是以分页的方式让它们执行相关的散列命令。作为建议之一,这也需要应用程序级查询而不是数据层查询。
因为您需要使用多个条件进行查询,所以最好将它们保存在关系数据库(postgresql、mysql等)中。redis可以很好地为您的散列服务,但是当您需要以您想要的方式查询散列时,最好重新建模您的数据。

相关问题