1
merlin852 2014-05-06 17:05:44 +08:00
2. mv -->cp
不懂js,瞎猜的 |
2
shiye515 2014-05-06 17:11:55 +08:00
我司的cms就能实现这种需求,不过我一个小前端没研究过是怎么实现的
|
3
ibudao 2014-05-06 17:44:07 +08:00
主从备份不就是处理这种场景的么。。request的handler这样写:
if exists /path/foo then return; else return /path/foo.bak; 你只需要保证每份资源有一个冗于备份/path/*.bak 。 |
4
notcome OP |
5
rrfeng 2014-05-06 18:17:36 +08:00
mv foo foo.bak
mv tmp foo rm foo.bak 再配合 if exists |
6
Mutoo 2014-05-06 18:20:41 +08:00
先内存缓存,然后再文件IO.
|
7
Ever 2014-05-06 18:23:19 +08:00
写入filename.new, 再mv filename.new filename就行。
一般情况下, 打开一个文件获取到一个fd不关闭, 就算期间这个文件被删除或者被mv替换,通过保留的fd还是能读完原文件。 |
8
tangzx 2014-05-06 19:55:16 +08:00 via iPhone
楼主放心,如果调用sync自然会block整个程序,不用再额外写了
|
9
notcome OP |
10
rrfeng 2014-05-06 22:08:26 +08:00
@notcome
写错了,第一个 mv 改成 cp 仔细想想其实直接 mv / cp 覆盖被访问的文件,是不会存在 404 出现的状况的! 这是由文件系统(内核)决定的! 所以这样 1. buffer => tmpfile 2. cp /path/foo => /history/bar 3. mv tmpfile => /path/foo 把你的第二步 mv 换成 cp 就 OK 了…… |
11
ibudao 2014-05-06 22:21:54 +08:00
在高并发的情形中,冗余备份显然比同步有更好的响应速度。但如果并发量不高,并且磁盘容量吃紧时,则同步的方案更好。权衡一下空间和时间,最终还是看你的需求。。
|
12
notcome OP 我明白了一个问题……
mv a b 能直接把 b 覆盖掉…… 那我直接: ln foo bar mv tmp foo 就可以了…… 我还是太愚蠢,打扰各位了,对不起! |