0

キー/値ストアの上に incr/decr を実装するにはどうすればよいですか?

incr と decr をサポートしていないキー値ストアを使用しているため、これを作成したいと考えています。私はRedisとMemcachedのincrとdecrを使用したので、いくつかの回答で述べたように、これはincrとdecrをどのように動作させたいかの完璧な例です。これについて言及した人に感謝します。

4

5 に答える 5

1

Memcacheにはこの機能が組み込まれています

編集:ロック機能がないように見えるため、ソースを更新せずにアトミック更新を取得することはないようです。ある場合(そしてこれはきれいではありません)、値をロックして取得し、アプリケーションでインクリメントして配置し、ロックを解除できます。しかし、次善です。

于 2010-03-11T13:50:13.627 に答える
1

機能を持つことのポイントは、incr()それがすべてストアの内部にあるということです。データを引き出して押し戻す必要はありません。

あなたがしていることは、データを引き出し、インクリメントし、押し戻すロジックをコードに入れたいように聞こえます...それほど難しいことではありませんが(私はあなたがどのように行うかを説明したと思いますそれ)、それはポイントをいくらか打ち負かします。

メリットを得るには、キーストアのソースを変更する必要があります。簡単かもしれません。

しかし、多くのキャッシュにはすでにこれがあります。スピードのためにこれが本当に必要な場合は、おそらくそれをサポートするmemcachedのような代替ストアを見つける必要があります。

于 2010-03-11T13:51:49.337 に答える
1

compareAndSet がないと、運が悪いようです。しかし、別の角度から問題を検討することは役に立ちます。たとえば、質問に対する賛成票の数を示すアトミック カウンターを実装する場合、1 つの方法は、質問ごとに「テーブル」を用意し、賛成票ごとに +1、反対票ごとに -1 を付けることです。次に、「取得」するには、「テーブル」を合計します。これが機能するためには、「テーブル」は安価であり、「get」の計算にかかる時間は気にしないと仮定します.incr/decrについてのみ言及しました。

于 2010-03-12T15:37:17.993 に答える
1

inttype などのキーに関連付けられた値をアトミックにインクリメントまたはデクリメントしたい場合string、およびそれらのいずれかに対してアトミック操作を実行する必要がある前にすべてのキーを知っている場合はDictionary<string, int[]>、辞書を使用して事前に入力します各キー値の単一項目配列。のようなコードを介して、項目に対してアトミック操作 (インクリメントなど) を実行できるようになりますThreading.Interlocked.Increment(MyDict[keyString][0]);。事前に知られていないキーを処理できるようにする必要がある場合は、 のConcurrentDictionary代わりにa を使用する必要Dictionaryがある場合がありますが、2 つのスレッドが同じキーの辞書エントリを同時に作成しようとする場合は注意が必要です。

于 2012-12-12T20:13:01.213 に答える
0

インクリメントとデクリメントは「可換」な単純な加算と減算演算であるため、実装する必要があるのは PN-Counter です。これは、CRDT (可換複製データ型) です。これを Riak に実装する方法のさまざまな例が、Web や Github で入手できます。

于 2013-02-18T10:11:28.900 に答える