2012-08-03 58 views
1

我有一个脚本,1)经常运行2)由许多不同的进程运行,3)需要很长时间。缓存锁定了很多进程?

更新:需要很长时间的东西是测试谁的结果将在每个进程相同。完全多余。

我认为是时候做一些缓存,但我担心种族,冲突,腐败,时空涡不稳定和鸡的潜力。

因为任何进程都可以更新缓存以及读取缓存,所以我必须知道如何处理所有这些组合。

这让我觉得有点像某人比我更聪明,受过更多教育的东西已经可能想到了。

无论如何,为了使这个问题更加具体,这是我迄今为止想到的。我在脑海中使用羊群,不知道这是个好主意。

  • 如果缓存是新鲜的,阅读并走开
  • 如果缓存过期
    • 试图得到一个写锁
      • ,如果我得到的锁,执行测试和更新缓存
      • 如果我没有获得锁定,其他人是否有写入锁定或读取锁定?
      • 如果它共享,他们为什么要读一个陈旧的缓存?我是否忽略它们,进行测试并更新缓存(或者这可能导致它们读取半写入缓存......呃......)
      • 如果它是独占的,给它们一小段时间以完成测试并且更新缓存。

希望是有道理的......

回答

1

下面是使用flock(2)在并发环境文件锁定的方案。 它解释了“safe-cache”是如何工作的。

每个缓存文件都有两个伴随文件(WLock和RLock)。 除了第一个请求之外,所有的flock请求都被阻塞(NB WLock)。

  • 有WLock确保了可能产生新的缓存
  • 的机会有共享RLOCK确保从缓存中的文件安全读
  • ,并具有独特的RLOCK确保安全写入缓存文件

有两种伴随文件只有一个原因,那就是当生成新缓存时, 和旧缓存不会过时(缓存时间+ N未过期),客户端仍然可以使用旧缓存 而不是等待缓存正在生成。

请对此方案发表评论,并尽可能简化。

cache locking diagram

+0

嘿,我忘了我发布了这个问题,刚才又跑过去了。感谢您的答案和漂亮的图表。 +1 – pileofrogs 2015-10-30 17:08:31