脚本
用户可以发布项目并在帖子中包含最多5个图像,上传的每个图像都需要重新采样和调整大小 - 总共创建4个额外图像.这意味着,如果用户上传了5张图像,最后总共存储了25张图像.
假设
可能的方法
任何人都有关于以可伸缩方式存储图像的最佳实践/方法的经验?
注意:我预先有人会提到S3 - 让我们假设我们想暂时保留本地图像.
谢谢你的期待
gah*_*ooa 12
我们有一个大规模生产的系统,迄今为止有30,000多个文件和20多GB ...
Column | Type | Modifiers
-------------+-----------------------------+----------------------------------------------------------
File_ID | integer | not null default nextval('"ACRM"."File_pseq"'::regclass)
CreateDate | timestamp(6) with time zone | not null default now()
FileName | character varying(255) | not null default NULL::character varying
ContentType | character varying(128) | not null default NULL::character varying
Size | integer | not null
Hash | character varying(40) | not null
Indexes:
"File_pkey" PRIMARY KEY, btree ("File_ID")
Run Code Online (Sandbox Code Playgroud)
这些文件只存储在一个目录中,其中整数File_ID作为文件名.我们超过30,000没有问题.我测试得更高没有任何问题.
这是使用RHEL 5 x86_64和ext3作为文件系统.
我会这样做吗?不,请允许我分享一些关于重新设计的想法.
数据库仍然是文件信息的"主要来源".
每个文件都是sha1()散列并基于该散列存储在文件系统层次结构中:
/FileData/ab/cd/abcd4548293827394723984723432987.jpg
关于在每个文件上存储元信息,数据库有点聪明.这将是一个三表系统:
File:存储名称,日期,IP,所有者和指向Blob(sha1)的指针等信息
File_Meta:根据文件类型在文件上存储键/值对.这可能包括Image_Width等信息......
Blob:存储对sha1的引用及其大小.
该系统通过存储由散列引用的数据来重复复制文件内容(多个文件可以引用相同的文件数据).使用rsync备份同步文件数据库非常容易.
此外,将消除包含大量文件的给定目录的限制.
文件扩展名将存储为唯一文件哈希的一部分.例如,如果空文件的哈希是abcd8765...空.txt文件和空.php文件将引用相同的哈希.相反,他们应该参考abcd8765.php和abcd8765.txt.为什么?
Apache等可以配置为根据文件扩展名自动选择内容类型和缓存规则.使用有效名称和反映文件内容的扩展名存储文件非常重要.
你看,这个系统可以通过委托通过nginx传递文件来真正提高性能.请参见http://wiki.nginx.org/XSendfile.
我希望这在某种程度上有所帮助.照顾自己.
| 归档时间: |
|
| 查看次数: |
2810 次 |
| 最近记录: |