当前位置: 首页 > 面试题库 >

如何在Redis中存储汇总的目录树搜索结果

汪文光
2023-03-14
问题内容

我有一棵大的产品目录树,当前包含约3.6万个类别和约100万种产品(即叶子)。它的结构如下(最大深度为5):

Cat1
|_Cat11
| |_Cat111
| | |_Cat1111
| | | |_Product1
| | | |_...
| | |_Cat1112
| | | |_Product1
| | | |_...
| | |_Cat1113
| | | |_Product1
| | | |_...
| |_Cat112
|   |_Cat1121
|   | |_Product1
|   | |_...
|   |_Cat1122
|   | |_Product1
|   | |_...
|   |_Cat1123
|     |_Product1
|     |_...
|_Cat12
| |_Cat121
| | |_Cat1211
| | |_Cat1212
| | |_Cat1213
| |_Cat122
|   |_Cat1221
|   |_Cat1222
|   |_Cat1223
|_...
Cat2
|...

在搜索此目录时(使用SQL Server
Freetext搜索),我很快就会得到一堆类别和产品。一些搜索会在很多产品上获得成功。我希望对结果进行汇总,并提供当前扩展的每个类别的总匹配数。像这样(2个不同级别的示例):

**Ex1 (first level)**
Cat1(563)
|
Cat2(332)
|
Cat8(2)

**Ex2 (second level)**
Cat1
|_Cat12(102)
|_Cat14(201)
|_...

到目前为止,我已经尝试将所有父/子关系存储在Redis中(存储为集合)。然后,要获得汇总结果,我只需遍历产品(从搜索结果)到其父级,再到当前扩展的类别(或更确切地说是其直属子级),以查找要显示的类别并计算与其匹配的产品数搜索。如果我的搜索结果中有大约5000种产品,则大约需要20秒。漫长的路。

谁会是实现此目标的更好方法?一种方法是让每个类别上的所有100万个产品已经聚合,但这将需要3600万个密钥,并且可能需要大量RAM。我目前已经使用500Mb。


问题答案:

如果要提高速度,则在将结构或“缓存”存储在Redis中时,应尽可能多地准备。如果将产品存储在中HSET,并在此的“产品数据”成员旁边添加类别计数器(每个类别一个)HSET,则可以HINCRBY用来增加/减少计数器。

通常(为您的需求设计Redis缓存):您应该尝试防止检索不需要的任何数据。

我建议使用Lua脚本来存储(/更新/删除)以及检索汇总报告。Lua脚本在Redis服务器上执行。ServiceStack支持它们(SCRIPT LOAD+ EVALSHA或简单地EVAL),您还可以尝试BookSleeve C#客户端模块(我们使用它,并且速度更快。 “更快”
:良好的Redis数据设计是第一位的)。BookSleeve C#客户端专注于多线程Redis
管道,这可能是您在处理大型数据集时想要的。ServiceStack也应该可以进行流水线操作。

如果类别和产品具有整数ID,您也可以将其与结合使用ZSET,在其中您可以将ID用作得分字段。使用a,ZRANGEBYSCORE您可以直接获取“记录”。只要您的ID使用的是15位以下的数字,并且不使用“分数”的小数部分,该技术就很安全。因此,该ID必须保持在-999999999999999到999999999999999的范围内。注:存在这些限制是因为Redis服务器实际上将分数(浮点数)存储为内部的redis字符串表示形式。

希望这会有所帮助,TW



 类似资料:
  • 由于它是一种递归方法,我无法弄清楚如何使用这些stg参数来存储树元素数据。我希望将stg保留在那里,以便学习如何将字符串数据存储在递归方法中。我该怎么做呢?(基本上我想摆脱诱惑1) 编辑:我尝试了stg+=root.getElement()+“”;带返回STG;但这并不奏效 输出示例“树的顺序遍历:1 2 3 X Y Z X Y Z”

  • 这是我的阵列 我想做的是:写一个函数 例如:将返回18将返回19等等

  • 问题内容: 我想要一个自动完成功能。我对数据类型的属性有简短的描述性字符串。我在redis中有一个ID列表,其中包含按创建日期排序的数据类型,并且使用ID来设置和获取该数据类型的属性,如redis类型文档中所述。我不使用哈希表。在此设置下,获取与输入到自动完成输入框中的内容相匹配的字符串集的最佳方法是什么?遍历所有id并检查我要搜索的属性- 对于每次击键,这似乎是错误的方法。 编辑: 除了下面的答

  • 我试图使用selenium webdriver从给定搜索结果URL的IEEE Xplore搜索中提取搜索结果计数。我没有从下面的代码中得到任何错误,但我不确定如何从这里开始。

  • 问题内容: 这应该很简单,但是我无法理解-“编写一个在给定目录中搜​​索特定文件名的程序。” 我找到了一些硬编码的文件名和目录的示例,但是我需要目录名和文件名都与用户输入的相同。 问题答案: 您可以尝试这样的事情: 这是输出:

  • 如果我有一个平衡的二叉树,并且我想在其中搜索一个项目,那么大的oh时间复杂度会是O(n)吗?在二叉树中搜索一个项目,不管它是否平衡,会改变O(n)的大时间复杂性吗?我知道如果我们有一个平衡的BST,那么搜索一个项目就等于BST的高度so O(log n),但是普通的二叉树呢?