Redis可以进行前缀匹配吗?
假设我在世界上有一组这样的城市:Redis可以进行前缀匹配吗?,redis,Redis,假设我在世界上有一组这样的城市: EUKLOND EUKMANC EUKEDIN EITROME EITMILA EITNAPE EFRPARI EFRAVIG EFRBRES 第一个字母是大陆,第二个字母是国家,后面的4个字母是缩写的城市名称 我希望能够通过传递“E”来搜索此集合,它将返回所有条目或EIT,检索意大利或EFRPARI的所有条目,并仅获取巴黎条目 这是我可以用Redis做的吗?一般来说,这是一个自动完成的场景 Redis的作者,写了一篇关于如何做到这一点的文章 更新:我刚刚看到
EUKLOND
EUKMANC
EUKEDIN
EITROME
EITMILA
EITNAPE
EFRPARI
EFRAVIG
EFRBRES
第一个字母是大陆,第二个字母是国家,后面的4个字母是缩写的城市名称
我希望能够通过传递“E”来搜索此集合,它将返回所有条目或EIT,检索意大利或EFRPARI的所有条目,并仅获取巴黎条目
这是我可以用Redis做的吗?一般来说,这是一个自动完成的场景 Redis的作者,写了一篇关于如何做到这一点的文章
更新:我刚刚看到了另一个很棒的解决方案,第一个采用了Salvatore的解决方案并以清晰的方式进行了解释,第二个提供了另一个解决方案,该解决方案也适用于多词短语。谢谢Ofer,我已经阅读了这篇文章,但我似乎无法理解作者是如何得出结论的:“zrange zset 6-1”。他怎么知道他需要做6-1分?如果我在一个欧洲国家有不同数量的城市,那么如何在“zrange zset X-1”中计算X?首先,他通过运行
zrank zset fo
查询fo
位于何处。他得到了答案。然后,他查询从6(5+1)到结束的所有项目。他运行zrange zset 6-1
。当你使用负数时,它的意思是“从头到尾”-1表示“排序集的最后一个元素”(参见)。是的,这是我假设的。从“fo”到“列表末尾”对我来说不是一个可行的方法。上面的数据集只是一个例子。我真的负担不起从某个任意点一直返回到场景结束,因为这可能是一个巨大的数据量(场景可以容纳约40亿项IRC)。安特里兹在他的帖子后面谈到了这一点:“幸运的是,流算法可以帮助我们。我们知道,从统计上来说,即使每个前缀只包含300个项目,我们也能够很好地接近前五个项目,因为如果一个查询足够频繁,它最终将战胜其他查询。“您应该以不同于关系数据库或专用搜索服务器的方式来考虑Redis。它的速度非常快,你必须意识到重复查询是绝对可以的——它仍然比其他任何事情都快。例如,在Redis中,每次重复获取50个块,直到发现超出范围为止,这是完全可以的。我花了一些时间来摆脱“经典”的习惯和想法。