09-磁盘缓存缺点
[toc]
3.3.5 磁盘缓存缺点
基于磁盘的缓存系统比较容易实现,无须安装其他模块,并且在文件管理器中就能查看结果。但是,该方法存在一个缺点,即受制于本地文件系统的限制。本章早些时候,为了将URL映射为安全文件名,我们应用了多种限制,然而该系统又会引发另一个问题,那就是一些URL会被映射为相同的文件名。比如,在对如下几个URL进行字符替换之后就会得到相同的文件名。
http://example.com/?a+bhttp://example.com/?a*bhttp://example.com/?a=bhttp://example.com/?a!b
这就意味着,如果其中一个URL生成了缓存,其他3个URL也会被认为已经生成缓存,因为它们映射到了同一个文件名。另外,如果一些长URL只在第255个字符之后存在区别,截断后的版本也会被映射为相同的文件名。这个问题非常重要,因为URL的最大长度并没有明确限制。尽管在实践中URL很少会超过2000个字符,并且早期版本的IE浏览器也不支持超过2083个字符的URL。
避免这些限制的一种解决方案是使用URL的哈希值作为文件名。尽管该方法可以带来一定改善,但是最终还是会面临许多文件系统具有的一个关键问题,那就是每个卷和每个目录下的文件数量是有限制的。如果缓存存储在FAT32文件系统中,每个目录的最大文件数是65535。该限制可以通过将缓存分割到不同目录来避免,但是文件系统可存储的文件总数也是有限制的。我使用的 ext4 分区目前支持略多于3100万个文件,而一个大型网站往往拥有超过1亿个网页。很遗憾, DiskCache 方法想要通用的话存在太多限制。要想避免这些问题,我们需要把多个缓存网页合并到一个文件中,并使用B+树或类似数据结构进行索引。我们并不会自己进行实现,而是在下一节中使用已有的键值对存储。