因此,我有一堆(数千)散列,名称如下:
state:city:street
在每一个里面都有这样的东西:
signId => 10, damaged => 1
我基本上想做一些我不确定是否可能的诡计。我想得到所有的值 signId 但前提是 signId 条目存在,但 damaged 条目不存在。。。对于所有属于通配符的哈希 state:city:* 所有这些都在php/laravel/predis中
signId
damaged
state:city:*
d6kp6zgx1#
你得先拿到钥匙 keys state:city:* 那么,你就必须 HGETALL state:city:{name} 一个接一个,即在一个循环中。
keys state:city:*
HGETALL state:city:{name}
ut6juiuv2#
redis中没有内置的特性或函数来实现这些功能。我不建议你使用 keys 在生产中。正如redis文档中提到的那样; keys 在生产环境中使用时应格外小心。当它在大型数据库上执行时,可能会破坏性能。我将推荐三种选择; scan 是一个更好的选择 keys 因为它不会阻塞服务器很长时间。在应用程序级别上,可以执行与模式匹配的哈希键,然后使用 HGET (o(1))两次并进行比较。 HGETALL 如果哈希键没有太多字段,也是另一种选择。另一种方法是在单独的集合/列表中跟踪与模式匹配的哈希键。不管你什么时候打电话 HMSET 或者 HSET 你也可以在集合/列表中按下该键。通过跟踪钥匙,您不再需要使用 scan 以后再说。您可能只是以分页的方式让它们执行相关的散列命令。作为建议之一,这也需要应用程序级查询而不是数据层查询。因为您需要使用多个条件进行查询,所以最好将它们保存在关系数据库(postgresql、mysql等)中。redis可以很好地为您的散列服务,但是当您需要以您想要的方式查询散列时,最好重新建模您的数据。
keys
scan
HGET
HGETALL
HMSET
HSET
2条答案
按热度按时间d6kp6zgx1#
你得先拿到钥匙
keys state:city:*
那么,你就必须HGETALL state:city:{name}
一个接一个,即在一个循环中。ut6juiuv2#
redis中没有内置的特性或函数来实现这些功能。我不建议你使用
keys
在生产中。正如redis文档中提到的那样;keys
在生产环境中使用时应格外小心。当它在大型数据库上执行时,可能会破坏性能。我将推荐三种选择;
scan
是一个更好的选择keys
因为它不会阻塞服务器很长时间。在应用程序级别上,可以执行与模式匹配的哈希键,然后使用HGET
(o(1))两次并进行比较。HGETALL
如果哈希键没有太多字段,也是另一种选择。另一种方法是在单独的集合/列表中跟踪与模式匹配的哈希键。不管你什么时候打电话
HMSET
或者HSET
你也可以在集合/列表中按下该键。通过跟踪钥匙,您不再需要使用scan
以后再说。您可能只是以分页的方式让它们执行相关的散列命令。作为建议之一,这也需要应用程序级查询而不是数据层查询。因为您需要使用多个条件进行查询,所以最好将它们保存在关系数据库(postgresql、mysql等)中。redis可以很好地为您的散列服务,但是当您需要以您想要的方式查询散列时,最好重新建模您的数据。