4

同時 Memcache 更新の安全な処理に関する Google Apps Engine ドキュメント:

Memcache サービスの putIfUntouched メソッドと getIdentifiable メソッドを使用すると、アトミックな方法で同じ memcache キーを更新する必要がある複数のリクエストが同時に処理されるシナリオで、memcache のキーと値の更新を安全に行う方法を提供できます。(これらのシナリオでは、競合状態が発生する可能性があります。)

私は正確なキャッシュ値を必要とするアプリケーションを構築しています。以下は私のコードです。それが正しいかどうかを確認してください:

        ...
        IdentifiableValue oldCountIdValue = mc.getIdentifiable( cacheKey );
        Long count = ( Long ) oldCountIdValue.getValue();
        if( count != null )
        {
            this.oldCountValue = oldCountIdValue;
            return count;
        }

        Long result = new Long( q.count() );
        mc.putIfUntouched( cacheKey, oldCountValue, result );
        return result;

私の質問は: putIfuntouched() が false を返すとどうなりますか? コードは何を返す必要がありますか? そしてどうやって?

データストアが 1 つのエンティティを追加するときは、以下を使用します。

mc.increment( cacheKey, 1, initValue );

この使い方は正しいですか?

どうもありがとう。

4

1 に答える 1

1

私はあなたのコードについて何かを理解する必要があります:
まず、count != null かどうかをチェックしている理由は? does not oldCountIdValue == null は count == null を意味し、その逆: if oldCountIdValue != null then count != null

その場合、コードは次のようになります。

IdentifiableValue oldCountIdValue = mc.getIdentifiable( cacheKey );
if (oldCountIdValue != null) {
   return ( Long ) oldCountIdValue.getValue();
}

Long result = new Long( q.count() );
mc.putIfUntouched( cacheKey, oldCountValue, result );
return result;

putIfUntouched が null を返す場合は、結果変数がもはや正確ではないことを意味します。現在の結果を無視して返すか、キャッシュから結果を読み込むことができます。

于 2012-05-08T16:03:11.247 に答える