7

リストからアイテムをアトミックにポップしてセットに追加する方法はありますか?

私のケースシナリオは、一意のアイテムの「作業キュー」リストがあり、「進行中」のセットで何が処理されているかを追跡したいというものです。これにより、アイテムの作業中にワーカープロセスがクラッシュした場合に、「進行中」セットのアイテムを再キューイングすることもできます。

リストからポップされたものが常にセットに含まれるように、アトミックであることが望ましいです。MULTI / EXECでこれを行う方法がわかりません。つまり、次のようになります。

redis> MULTI
OK
redis> LPOP workqueue
"foobar"
redis> SADD inprog "foobar"
redis> EXEC
4

2 に答える 2

5

「進行中の」コレクションをセットにしたいのはなぜですか?進行中のアイテムのリストを使用するだけで済みます。

コマンドRPOPLPUSH "RightPop、Left Push"は、まさにこのユースケースのために作成されました。

ソースに保存されているリストの最後の要素(テール)をアトミックに返し、削除し、宛先に保存されているリストの最初の要素(ヘッド)にある要素をプッシュします

進行中のアイテムにSetを使用する場合は、luaスクリプトを使用し、evalを使用して呼び出す必要があります。

于 2012-08-27T07:52:46.437 に答える
1

2番目のコマンドは最初のコマンドの戻り値に依存するため、MULTI / EXECは機能しないようですが、EXECが呼び出されるまでどちらのコマンドも実行されません。Redis 2.6(現在はRC)を使用している場合は、 evalを介してluaスクリプトを使用できる可能性があります。

一般的に、ここでは原子性はそれほど重要ではないと思います。この場合、実際には競合状態はありません。発生する可能性がある唯一の悪いことは、アイテムをキューからポップしてからセットに追加するまでの間にサーバーがクラッシュした場合です。これはかなりありそうもないようです。

于 2012-08-27T00:38:19.377 に答える