2015-11-05 102 views
1

我陷入了一个小问题。我想从redis数据库中删除所有匹配字符串模式的哈希键/值对。我发现了一些针对命令行的解决方案,用于通过键值删除哈希值的问题,但没有针对通过值模式删除的相关问题。Redis通过散列值中的模式删除散列键

具体的例子:

redis> HSET myhash field1 "Wild" 
(integer) 1 
redis> HSET myhash field2 "World" 
(integer) 1 
redis> HSET myhash field2 "Window" 
(integer) 1 

现在我想删除从myhash所有键/值对匹配,即FIELD1 /野,场3 /窗口,但离开场2 /世界不变的 “Wi *。”

我想这样做在命令行上,所以这样的事情将是巨大的:

redis-cli -n 0 KEYS someFoo* | xargs redis-cli -n 0 DEL 

当然,上述工作不是哈希值。所以最后我需要以自动方式致电

redis-cli -n 0 hdel myhash field1 
redis-cli -n 0 hdel myhash field3 

回答

2

不幸的是,我认为唯一可以做到这一点的方法是使用HGETALL,甚至更好HSCAN

redis> HGETALL myhash 
1) "field1" 
2) "Wild" 
3) "field2" 
4) "Window" 

您在理论上导管能够即到的东西,即使你的正则表达式和一个或多个问题HDEL与前面匹配的奇数行命令行匹配。这对我的bash技能有点帮助。也许一个lua脚本会更容易。

如果你的散列值非常大,你应该使用HSCANHGETALL会在获取数据时阻塞。

+0

是的,谢谢,但我的CLI技能也不是很好,我真的在寻找这样的解决方案。关于HSCAN,是的,这是一个好主意,因为有问题的散列有几百万个条目。 – luksch

+0

对于这样复杂的事情,使用任何你最喜欢的语言编写一个小脚本可能是最容易的。 – captncraig