4

get()私の理解では、これらの各メソッドput()はアトミックです。

ただし、ehcacheやmemcachedなどのキャッシュにアクセスするCheckThenActと、競合状態が発生します。

Get()thread1がaを実行し、thread2がaにGet()続いて、Put()を実行する場合、最初Get()の値がによって追加された新しい値を受け取るようにするには、何を同期する必要がありthread2ますか?

4

2 に答える 2

3

この種の状況に対処する方法は、複数の場所からの書き込みをキャッシュしないか、別の方法でアクセスを制御することです。

これに対する簡単な解決策は、クライアントからキャッシュへの書き込みを行わないことです。代わりに、値を更新する場合は、値を更新するリクエストを発行します。その値が別の場所から取得された場合、これはうまく機能します。それが計算されたものであるか、クライアントからのものである場合は、より問題になる可能性があります。

少なくとも PHP の世界では、memcache と共に使用する一般的なコンポーネントは、分散ワーク キュー プロセッサとしての beanstalkd です。このシナリオでは、「キャッシュの更新」リクエストを作業単位として開始できます。

入力として既存の値を使用するキャッシュ エントリに対して操作を実行している場合、または他の方法で競合状態が発生する場合 (get-then-update がアトミック操作でない場合)、別の方法は作業単位を作成することです。これには、古い値と新しい値が含まれます。そうすれば、更新を処理するプロセスが何であれ、現在の値が期待値ではない状況を無効にしたり、処理したりできます。

インクリメントとデクリメントは memcached インターフェイスによって処理されるため、アクセスがそのタイプの場合 (またはその種類の操作に減らすことができる場合) は、問題も解決します。

于 2009-09-17T02:54:24.330 に答える
1

memcachedの場合、cas()操作を利用して、put()を実行する前に、別の操作がデータを更新していないことを確認できます。

于 2011-10-11T21:57:26.420 に答える