ehcache、memcached、&へのアクセスを同期する方法他のキーバリューストア?
-
07-07-2019 - |
質問
私の理解では、これらのメソッドのそれぞれ: get()
と put()
はアトミックです。
ただし、ehcache&などのキャッシュにアクセスする場合memcached、 CheckThenAct
形式で、競合状態が発生します。
thread1が Get()
を実行し、thread2が Get()
の後に Put()
、最初の Get()
は thread2
によって追加された新しい値を受け取りますか?
解決
この種の状況を処理する方法は、複数の場所からの書き込みをキャッシュしないか、他の方法でアクセスを制御することです。
これに対する簡単な解決策は、クライアントからキャッシュへの書き込みを行わないことです。代わりに、値を更新する場合は、値を更新する要求を実行します。その値が他の場所から取得された場合、これはうまく機能します。計算されるか、クライアントから取得される場合は、より問題が大きくなります。
少なくともPHPの世界でmemcacheで使用する一般的なコンポーネントは、分散ワークキュープロセッサとしてbeanstalkdです。このシナリオでは、「キャッシュの更新」を実行できます。作業単位として要求します。
既存の値を入力として使用するキャッシュエントリで操作を行っている場合、またはget-then-updateがアトミック操作ではない場合に他の方法で競合状態が発生する場合は、代わりに古い値と新しい値を含む作業単位。そうすれば、どのプロセスが更新を処理しても、現在の値が期待された値ではない状況を無効にするか、そうでなければ処理できます。
増分および減分はmemcachedインターフェイスによって処理されるため、アクセスがそのタイプの場合(またはその種の操作に減らすことができる場合)、問題も解決します。
他のヒント
memcachedの場合、cas()操作を使用して、put()を実行する前に、別の操作がデータを更新していないことを確認できます。