我的脚本通过一个缓慢的连接获取很多JPEG文件。我将下载的文件存储在本地缓存中,并重复使用它们,直到它们被更改。
问题是:如何确保这个缓存不大于16 is (比方说)?
我想要的时候可以把它清理干净:
但是,如果脚本的两个实例会这样做呢?确保1Mb是免费的,然后每个使用1Mb,缓存现在是17 1Mb。16 is规则被打破。
我知道我可以使“惰性缓存”:只是不时地清理它。但是,恶意用户可能触发大量缓存并耗尽磁盘空间。这是一个共享的主机,所以没有人能做到。
--我想出的唯一解决方案(糟糕):
在存储任何东西之前,锁定整个缓存,清理所需的空间,存储文件,解锁缓存。为什么不好:我缓存了很多文件,所以很多锁定和清理。慢的。(还如何在PHP中锁定/等待锁?)
发布于 2011-08-25 13:37:42
我误会你了-这看起来太容易了。如果您没有数据库avaliable数据库=具有某种数据格式的某个文件。
在数据库中创建一个包含以下列的表:文件名、文件大小、如果文件仍在下载,则标记(true/false)。
当您收到下载文件的新请求时-锁定此表。计算和(文件大小)。
每次打开桌子后,每次都要锁上几毫秒,这样就不用等任何人了。
发布于 2011-08-25 13:54:50
我不会按照你的规定去做,但你可以使用以下方法:
目录 -
LOCK_EX -在进行写入过程中获取文件的独占锁。
在某个地方创建一个.txt文件,让脚本尝试获取内容。如果已经有一个脚本正在运行,它将对文件进行锁定,因此新脚本将无法访问该文件。如果无法访问该文件,请不要执行缓存代码。
发布于 2011-08-25 14:04:54
你需要一个漏水的水桶。您需要存储最后一次(unix时间戳)和桶(整数)。每次存储东西时,计算上次保存到缓存后的时间差,以秒为单位将其从桶中减少,然后将INSA桶减少x字节。如果存储桶大于jpeg文件大小,则删除最老的对象以释放所需的空间。
https://stackoverflow.com/questions/7190678
复制相似问题