0

spymemcached クライアントを使用してキャッシュ ロジックを実装しています。どういうわけか、キャッシュ内の一部のコンテンツを同時に変更するために CAS を使用する必要があります。

所有者がここからCASMutationの使用方法の非常に良い例をすでに示しているのを見ました: http://code.google.com/p/spymemcached/wiki/Examples#Using_CAS

しかし、コードのこの部分について 1 つの質問があります。

 // Not strictly necessary if you specify the storage as
 // LinkedList (our initial value isn't), but I like to keep
 // things functional anyway, so I'm going to copy this list
 // first.
 LinkedList<Item> ll = new LinkedList<Item>(current);

コメントを注意深く読んでも、ここで何をしようとしているのか正確にはわかりません。「ll」にコピーせずに「current」だけを使用するとどうなるでしょうか。潜在的な問題は何ですか?

[アップデート]

サンプル コードに従って、次のようなメソッドを実装しています。うまくいきますか?

public <T> Set<T> addItemToSet(String key, int expire, final T newItem) throws Exception     {

    // This is how we modify a list when we find one in the cache.
    CASMutation<Set<T>> mutation = new CASMutation<Set<T>>() {

        // This is only invoked when a value actually exists.
        public Set<T> getNewValue(Set<T> current) {
            current.add( newItem );
            return current;
        }

    };

    HashSet<T> initialValue= new HashSet<T>();
    initialValue.add( newItem );

    CASMutator<Set<T>> mutator = new CASMutator<Set<T>>( memClient, getTranscoder() );

    return mutator.cas(key, initialValue, expire, mutation);
}

スレッドセーフかどうかが一番心配です。

4

1 に答える 1

2

ライブラリを使用していない場合、この特定のケースでコピーしなかった場合に起こることは、 を変更しようとすると例外が発生することCollections.singletonList()あり、これは不変です。の一部の実装はList単純に変更できないため、変更できると仮定するのは一般的に悪い考えです。(Java が a の概念をList、インデックス付きの読み取り可能なシーケンスとして分離しMutableList、すべてのaddandset操作を含むサブインターフェイスとして分離するのは素晴らしいことですが、まあまあです)。

広い意味では、「厳密には必要ない」かどうかさえわかりません。ここで何が起こっているかというと、既存のアイテムのリストが与えられ、CAS 条件が満たされている場合に使用される新しい値を返すように求められます。リストをその場で変更してから を返すcurrent場合、問題は条件を失ったことです。提案された新しい値が拒否されることを CAS ロジックが意味している場合でも、現在のリスト(あなたによって) 変更されています。

ライブラリのロジックは、キャッシュに実際に格納されている値が更新されないことを意味するため、これは実際には問題にならないかもしれません。また、一時的な状態を変更することも問題ではありません。十分に試行すると、更新が成功するからです。

しかし、関数型アプローチを使用しない理由はまったくないことに同意します。read への入力引数が与えられており、変更を含むリストを返すことが期待されています。プログラムの明快さ、堅牢性、および推論のためには、正しい値で新しいリストを作成し、それを返す方がはるかに優れています。そうしないとうまくいかないかもしれませんが、明確なものを書くオプションがあるときに、セマンティクスが他のライブラリの実装の詳細に依存するコードを書きたい人はいますか?

于 2012-04-24T08:15:05.017 に答える