Performance 以良好的性能服务数百万条路线
我正在为一个新项目做一些研究,这个项目的约束条件和规格还没有确定。需要的一件事是在根域的正下方有大量的路径。这可能会增加到数百万条路径。路径没有共同的结构或唯一的部分,因此我必须寻找精确的匹配 现在我知道分解这些路径更有效,这也有助于路径查找。不过,我正在研究这种可能性,所以请容忍我 我正在评估实现这一目标的方法,同时保持优异的性能。我想到了以下方法:Performance 以良好的性能服务数百万条路线,performance,routes,bigdata,Performance,Routes,Bigdata,我正在为一个新项目做一些研究,这个项目的约束条件和规格还没有确定。需要的一件事是在根域的正下方有大量的路径。这可能会增加到数百万条路径。路径没有共同的结构或唯一的部分,因此我必须寻找精确的匹配 现在我知道分解这些路径更有效,这也有助于路径查找。不过,我正在研究这种可能性,所以请容忍我 我正在评估实现这一目标的方法,同时保持优异的性能。我想到了以下方法: 将路径存储在SQL数据库中,并对每个请求进行查找。这似乎是最糟糕的选择,绝对不会被使用 将路径存储在像Redis这样的键值存储中。这会好得多,
- 将路径存储在SQL数据库中,并对每个请求进行查找。这似乎是最糟糕的选择,绝对不会被使用
- 将路径存储在像Redis这样的键值存储中。这会好得多,而且我认为表现相当好(不过必须对其进行基准测试)
- 与许多框架一样,对字符串/正则表达式进行匹配(即开箱即用),以获得如此多的可能匹配是不可能的,因此不是一个真正的选项。但我可以看到,在进行某种算法时,你可以逐个字母进行比较,并结合一些智能优化,这是如何工作的
更新 我已经测试了Redis方法。基于两组关键字,我得到了1.5亿条路径。我使用
set
命令添加了它们中的每一个,该值是一个id的序列化字符串,我可以使用它来标识请求中的实际关键字。(设置“关键字1-关键字2”
)
在本地VM中使用一百万条记录的数据集进行快速测试,结果令人鼓舞:对1000个请求进行基准测试平均需要2毫秒。这是在我的笔记本电脑上,里面有很多其他的东西
接下来,我在一个VPS上做了一个完整的测试,这个VPS有4个内核和8GB的RAM,有一整套1.5亿条记录。这产生了一个文件大小为3.1G、内存约为9GB的数据库。由于数据库无法完全加载到内存中,Redis开始交换,这导致了可怕的结果:平均约100毫秒
显然,这将不起作用,也无法很好地扩展。要么每个web服务器都需要大量的RAM,要么我们必须使用专用的Redis路由服务器。我读过Instagram的工程师们的文章,他们想出了一个大大减小数据库大小的窍门,但我还没有尝试过。不管怎样,这似乎都不是正确的方法。回到绘图板。我建议使用某种键值存储(即散列存储),可能同时对键值进行散列,使其更短(像SHA-1这样的东西就可以了)。我认为Redis是您最好的选择。SQL会很慢,而根据我的经验,正则表达式在查询中总是非常慢 我将执行以下步骤来测试Redis:
ryan
,得到了ea3cd978650417470535f3a4725b6b5042a6ab59
作为散列。原始文本要小得多才能放入RAM中,这将有助于Redis。显然,对于较长的路径,哈希会更好,但您的示例非常小李>