Redis 查找匹配字符串的模式键

Posted

技术标签:

【中文标题】Redis 查找匹配字符串的模式键【英文标题】:Redis find pattern keys that match string 【发布时间】:2017-07-28 21:20:04 【问题描述】:

我知道 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】:

除非我错了,否则我认为你想多了。 GET *.domain.com(即用“*”替换“sub”)应该这样做。如果找不到,请继续使用GET *.com,依此类推,直到以GET * 结尾,这应该是所有事物的“根”。


更新答案

好的,我明白了。所以,不,SCAN 不是办法,但我知道您至少可以尝试另外两条路径。如果您遇到任何死胡同,请大声喊叫或提出新问题;)

排序集和字典范围的路径

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

RediSearch 路径

看看http://redisearch.io,这是一个实现完整搜索引擎(包括自动完成功能(tm))的 Redis 模块。

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

【讨论】:

当然,这可以工作 - 也许我的示例具有误导性,因为我不只是处理子域,并且可能并不总是有一个很好的截止,(全局模式可能是 . example.com/blah/blah 或更长的东西)。无论哪种方式,我都希望在一个请求中完成所有这些操作,而不必根据前一个请求的结果再次尝试,因为这会引入我无法承受的延迟。 也许一个更详细且具有误导性的示例在这里会有所帮助 - 您能否添加一些带有预期答案的键/模式和队列? 查看我的编辑 - 如果您需要任何进一步的说明,请告诉我。谢谢! @ItamarHaber 我正在玩掌握 redisearch 第 3 部分的代码,但不确定如何利用 Redisearch 内置的自动完成功能。请指导。谢谢[1]:github.com/stockholmux/mastering-redisearch/tree/chapter-3 只要联系凯尔(凯尔在 redislabs dot com);)

以上是关于Redis 查找匹配字符串的模式键的主要内容,如果未能解决你的问题,请参考以下文章

redis 怎样查找一个key?

linux基础命令之:vi模式下查找和替换

Redis基础命令

在字符串中查找与字典中的值匹配的单词,然后在新列中返回键

常用算法3 - 字符串查找/模式匹配算法(BF & KMP算法)

算法——蛮力法之顺序查找和蛮力字符串匹配