Redis 查找匹配字符串的模式键
Redis find pattern keys that match string
我知道 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 模式永远不会重叠)
除非我错了,否则我认为你想多了。 GET *.domain.com
(即将 "sub" 替换为“*”)应该可以做到。如果未找到,则继续 GET *.com
,依此类推,直到以 GET *
结束,这应该是所有事物的 "root"。
更新答案
好的,我明白了。所以,不,SCAN
不是正确的方法,但我知道您至少可以尝试另外两条路径。如果您 运行 陷入任何死胡同,请给我留言或提出一个新问题 ;)
有序集的路径和字典范围
转到 https://redis.io/topics/indexes#lexicographical-indexes 并阅读(可能需要多次迭代,我建议实际阅读整个内容)。然后,根据您的要求,请记住您可以通过在另一个 Sorted Set 中存储(和搜索)反向来进行后缀匹配。
RediSearch 路径
看看 http://redisearch.io,一个实现完整搜索引擎的 Redis 模块(包括自动完成功能(tm))。
免责声明: 我在 Redis Labs 工作,这里是开源 Redis 的发源地,也是利用它的商业解决方案的提供商,包括上述模块(开源,AGPL 许可).
我知道 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 模式永远不会重叠)
除非我错了,否则我认为你想多了。 GET *.domain.com
(即将 "sub" 替换为“*”)应该可以做到。如果未找到,则继续 GET *.com
,依此类推,直到以 GET *
结束,这应该是所有事物的 "root"。
更新答案
好的,我明白了。所以,不,SCAN
不是正确的方法,但我知道您至少可以尝试另外两条路径。如果您 运行 陷入任何死胡同,请给我留言或提出一个新问题 ;)
有序集的路径和字典范围
转到 https://redis.io/topics/indexes#lexicographical-indexes 并阅读(可能需要多次迭代,我建议实际阅读整个内容)。然后,根据您的要求,请记住您可以通过在另一个 Sorted Set 中存储(和搜索)反向来进行后缀匹配。
RediSearch 路径
看看 http://redisearch.io,一个实现完整搜索引擎的 Redis 模块(包括自动完成功能(tm))。
免责声明: 我在 Redis Labs 工作,这里是开源 Redis 的发源地,也是利用它的商业解决方案的提供商,包括上述模块(开源,AGPL 许可).