1

我有一个脚本 1) 经常运行 2) 由许多不同的进程运行并且 3) 需要很长时间。

更新:需要很长时间的东西是测试谁的结果对于每个过程都是一样的。完全多余。

我认为是时候做一些缓存了,但我担心种族、冲突、腐败、时间漩涡不稳定和鸡的可能性。

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

在我看来,这闻起来像是比我更聪明、受过更多教育的人可能已经想出来的东西。

无论如何,为了使这个问题更具体,这就是我到目前为止的想法。我在脑海中使用羊群,不确定这是否是个好主意。

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

希望这是有道理的...

4

1 回答 1

1

这是一个使用flock(2)在并发环境中进行文件锁定的方案。它解释了“安全缓存”是如何工作的。

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

  • 拥有 WLock 可确保可能生成新缓存的机会
  • 拥有共享 RLock 确保从缓存文件中安全读取
  • 并且拥有独占 RLock 确保安全写入缓存文件

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

请对此方案发表评论,并尽可能使其更简单。

缓存锁定图

于 2012-11-29T11:08:10.570 回答