我正在寻找一个Perl库来处理数据库查询的缓存,但它需要处理比典型应用程序大得多的缓存。它需要:
一次缓存大约200,000条记录,平均每条大约2 MB左右(因此,总缓存大小约为400GB)
没有最大记录大小(或至少相当大的记录,如几GB)
具有尺寸感知功能,因此当总存储量超过预设最大值时,它会自动删除最早的(就上次访问时间而言)
在给定上述要求的情况下尽可能快
我到目前为止看过的库是CHI和Cache :: SizeAwareFileCache(Cache :: Cache的扩展)。
我对CHI的主要担心是我需要在打开is_size_aware时使用CHI :: Driver :: File,但文档特别警告:
...对于无法自动读取和更新值的驱动程序 - 例如,CHI :: Driver :: File - 更新大小时存在竞争条件,这可能导致大小随时间增长不准确。 / p>
我对Cache :: SizeAwareFileCache的主要关注是Cache :: Cache是旧的,目前还没有维护。我在文档中看到的第一件事是建议我使用CHI的部分。
有什么建议吗?我应该使用这两个库中的任何一个,还是其他什么?我是否因为想要使用缓存而疯狂?有没有人有类似要求的经验?我很感激任何建议。
有关该应用程序的一些详细信息:
我有一个分析大型网站的应用程序,用于查找HTML代码中难以找到的错误/效率低下的问题,这些问题通常隐藏在数十万个页面中。应用程序抓取整个网站并将每个页面的HTML代码存储在数据库中。 (在单独的机器上运行的MySQL服务器)爬网完成后,用户可以运行各种软件工具来分析站点上每个页面的HTML。
工具在队列中等待,并一次运行一个。每个工具都需要加载爬网中每个页面的HTML,始终以相同的顺序。因此,如果抓取抓取100,000页,并且用户需要在其上运行15个不同的工具,则缓存需要至少保留100,000条记录,每条记录将被读取15次。高速缓存能够同时存储来自给定站点的所有页面是至关重要的。 (否则每个页面都会被删除,然后再为每个工具重新缓存,这将比没有缓存更糟糕)
最大的目标是减少数据库的负载。次要(但仍然非常重要)的目标是提高速度。
答案 0 :(得分:2)
Perl在文件上比DB更好。如果在200,000页内有400GB HTML代码(即每个HTML文件大约2MB),而不是将400GB数据放在DB上,再读入缓存(最后再写入磁盘),为什么不在磁盘和DB记录上写HTML内容只链接文件路径?
在有越来越多的“页面”和“工具”进行分析之后,您可能希望拥有更多的分析机器。缓存后,您无法保持400GB DB同步。保持DB小而高效,并将文件复制到每台分析机器的本地磁盘上以便直接访问(尽可能快)。对于不具有依赖关系且更新DB记录上的不同字段的不同工具,它们可以并发运行。对于具有依赖性的工具,它取决于您的工作流程设计。
答案 1 :(得分:1)
我建议使用像Memcached之类的东西,而不是使用自己实现缓存的模块。然后使用其中一个Perl绑定,例如Cache::Memcached,CHI::Driver::Memcached,Memcached::Client或其他人。