如何提供 50m 文件,就像它们在一个目录中一样?

如何提供 50m 文件,就像它们在一个目录中一样?

我将生成大约 5000 万个 HTML 文件以供使用。每个文件都有一个唯一的 ID(例如,thingy),我希望将它们都放在同一个目录中(例如,example.com/thingy)。

我怀疑把 5000 万个文件放在一个目录中是求神拜佛,所以我倾向于使用嵌套目录(例如,thingy 位于 /t/h/i/thingy 中)。我认为我可以使用 Apache 和 mod_rewrite 轻松完成此操作,但我想知道是否还有其他更有意义的选择。

如果这很重要的话,我打算在 Linux 上执行此操作。

答案1

您确定所有(或大多数)50M 文件都会被请求吗?如果不能,并且您的问题域允许,您可以考虑采用“惰性计算”方法。也就是说,只生成(然后缓存)那些实际被请求的文件。

不过,是的,您将需要使用嵌套目录结构(例如深度为 3 层以上),以便单个目录中的文件数不超过几千个。然后,使用 mod_rewrite 将请求转换为实际的物理文件名,如下所示(但可能包含更多检查和逻辑):

RewriteRule (\w)(\w)(\w)(\w+) /path/to/cache/$1/$2/$3/$1$2$3$4 [L]

最后,一些文件系统在高效处理大量文件方面比其他文件系统更好,因此您可能需要在投入生产之前对一些候选系统(例如 ext4、xfs、jfs、reiserfs)进行一些测试和基准测试。

答案2

不,您可以通过 mod_rewrite 来实现这一点。

答案3

对于这种情况,我会使用数据库,并从数据库中提供文件。您可能能够模板化页面,这样您就不必在数据库中保存整个页面。

根据您生成页面的方式,考虑将生成页面的源放入数据库中,并根据需要生成页面。可以使用缓存技术来避免每次请求时都需要生成页面。

相关内容