1

1) 頻繁に実行される、2) 多くの異なるプロセスによって実行される、3) 時間がかかるスクリプトがあります。

更新: 時間がかかるのは、すべてのプロセスで結果が同じになるテストです。完全に冗長です。

キャッシングを行う時期だと思いますが、人種、紛争、腐敗、時間の渦の不安定性、ニワトリの可能性について心配しています.

どのプロセスもキャッシュを更新するだけでなく、キャッシュを読み取る可能性があるため、複雑になります。そのため、これらすべての組み合わせを処理する方法を知る必要があります。

これは、私よりも頭が良く、教育を受けた誰かがおそらくすでに理解しているような匂いがします。

とにかく、この質問をより具体的にするために、これまでに私が考えたことは次のとおりです。私は頭の中で群れを使用していますが、それが良い考えかどうかはわかりません。

  • キャッシュが新鮮な場合は、それを読んで立ち去る
  • キャッシュが古い場合
    • 書き込みロックを取得しようとする
      • ロックを取得したら、テストを実行してキャッシュを更新します
      • 私がロックを取得できない場合、他の誰かが書き込みまたは読み取りロックを取得していますか?
      • 共有されている場合、なぜ彼らは古いキャッシュを読んでいるのですか? 私はそれらを無視し、テストを行い、キャッシュを更新しますか (または、これにより半分書き込まれたキャッシュが読み取られる可能性があります...えーと...)
      • 排他的である場合は、テストを完了してキャッシュを更新するための短い時間を与えます。

それが理にかなっていることを願っています...

4

1 に答える 1

1

これは、並行環境でのファイルロックにflock(2)を使用するスキームです。「セーフキャッシュ」の仕組みについて説明します。

すべてのキャッシュファイルには、2つのコンパニオンファイル(WLockとRLock)があります。最初の要求(NB WLock)を除いて、すべての群れ要求がブロックされています。

  • WLockを使用すると、新しいキャッシュを生成できる可能性があります。
  • RLockを共有することで、キャッシュファイルからの安全な読み取りが保証されます
  • 排他的なRLockを使用すると、キャッシュファイルへの安全な書き込みが保証されます

コンパニオンファイルが2つあるのは、1つの理由だけです。つまり、新しいキャッシュが生成され、古いキャッシュが古すぎない場合(キャッシュ時間+ Nの有効期限が切れていない場合)、クライアントはキャッシュが生成されるのを待つ代わりに古いキャッシュを使用できます。

このスキームについてコメントし、可能であれば単純化してください。

キャッシュロック図

于 2012-11-29T11:08:10.570 に答える