我使用 amazon s3 来存储用户的个人资料图片。我发现许多网站会生成较大的随机文件名并将它们放入同一个根目录中,例如:
http://xxx.us-east-1.amazonaws.com/aHR0cHM6Ly9mYmNkbi1wcm9maWxlLWEuYWthbWFpaGQubmV0L2hwcm9maWxlLWFrLWFzaDIvMjczMzkxXzEwMDAwMDMxMjAxMzg5OV81NTk3MjM4Mzdfbi5qcGc.jpg
我的问题是:这种方法的优点和缺点是什么?
如果我将它们放在不同的目录中,将来会遇到什么问题?
http://xxx.us-east-1.amazonaws.com/users/id/username.jpg
或者
http://xxx.us-east-1.amazonaws.com/users/id/random_number.jpg
谢谢!
答案1
由于您使用的是 S3,因此文件数量不应该成为问题。但是,请考虑一下当您需要手动查找单个文件时会发生什么情况。在浏览器中列出数以亿计的文件并不是一件有趣的事情。
因此对于这种情况,您应该具有某种“人类可浏览”的树结构,其最终子目录包含合理数量的文件。
我建议扩展和拆分 id(假设它是数字)或者对用户名进行前缀拆分。
ID示例:
id1 = 123
id1_expanded = 000/000/000/123
http://xxx.us-east-1.amazonaws.com/users/000/000/000/123/username.jpg
id2 = 1000002
id2_expanded = 000/001/000/002
http://xxx.us-east-1.amazonaws.com/users/000/001/000/002/username.jpg
用户名示例:
username1 = luccas
http://xxx.us-east-1.amazonaws.com/users/l/lu/luc/luccas/random_number.jpg
username2 = ukautz
http://xxx.us-east-1.amazonaws.com/users/u/uk/uka/ukautz/random_number.jpg
无论如何,大多数为存储结构设计而发明的策略都试图解决 S3 中根本没有的问题:每个目录的文件数量、跨存储服务器的分片......诸如此类。
编辑:您描述的长文件名通常是出于“安全”原因而选择的 -> 只要您不使用算法从用户名 + ID 等中得出它,文件与特定用户之间的任何关系都是隐藏的(仅给出文件名)。再次:使用某种子目录策略(出于上述原因)。
答案2
这取决于您要使用多少张图片。如果您的应用程序使用数百万张图片,您最好将它们集群到另一台服务器上,以平衡负载。您还可以根据用户配置文件的类型划分图像。根据类别放置所有用户配置文件。归根结底,您需要知道的只是您的服务器将如何很好地平衡请求。这只是理论假设。拥有硬件规格和图片数量是有意义的。