Redis查找匹配字符串

时间:2017-07-28 21:20:04

标签: redis glob

我知道Redis将MATCH作为SCAN的一部分(详见here)来查找与glob样式模式匹配的键(即 sub.domain.com 可以从scan 0 MATCH *.domain.com

返回

我的问题是,是否有办法执行反向操作。如果我的键 glob样式模式(即 * .domain.com 是其中一个键),我该如何搜索以查看哪些键具有与 sub匹配的模式.domain.com

一个想法是使用EVAL编写一个Lua脚本来执行此操作,但我认为这将是相当资源密集型的?还有其他方法可以解决这个问题吗?

为了让事情更清楚一点,这里有一些示例键(用逗号分隔)(我现在不用担心它们的值,因为它们并不真正适用于这个问题),查询以及我希望查询生成的响应:

键: *img.myserver.com**.mywebsite.com**www.example.com/images*

查询 - >预期回复(匹配的密钥)

scan 0 REV-MATCH https://img.myserver.com/myimg.jpg - > *img.myserver.com*

scan 0 REV-MATCH http://www.myserver.com/otherimg.jpg - >没有比赛

scan 0 REV-MATCH http://www.mywebsite.com/blah/blah.jpg - > *.mywebsite.com*

scan 0 REV-MATCH https://www.example.com/images/old/a.jpg - > *www.example.com/images*

REV-MATCH(反向匹配)是一个不存在的函数 - 但我希望可以通过其他方式找到类似的功能。如果两个键具有可以在某些情况下匹配相同字符串的glob模式,则可能存在多个匹配(但是,在我的用例中,这不会发生,因为我始终确保glob模式永远不会重叠)

1 个答案:

答案 0 :(得分:1)

除非我错了,否则我认为你过度思考它。一个GET *.domain.com(即替换" sub"与" *")应该这样做。如果没有问题,请继续使用GET *.com,依此类推,直到以GET *结尾,这应该是" root"所有事情。

更新回答

好的,我明白了。所以,不,SCAN不是这样的,但我知道你可以尝试至少两个其他路径。如果你遇到任何死胡同,请给我一个喊叫或打开一个新问题;)

排序集和词典范围的路径

转到https://redis.io/topics/indexes#lexicographical-indexes并阅读(可能需要多次迭代,我建议实际阅读整个内容)。然后,根据您的要求,请记住您可以通过在另一个排序集中存储(和搜索)反向来进行后缀匹配。

RediSearch路径

查看http://redisearch.io,一个实现完整搜索引擎的Redis模块(包含自动填充(tm))。

免责声明:我在Redis Labs工作,Redis Labs是开源Redis的主页,也是利用它的商业解决方案提供商,包括上述模块(开源,AGPL许可)。