0

Redis の ltrim と rpush で競合状態になる可能性はありますか?

たとえば、私の redis リストに次の項目があるとします: [1, 2, 3, 4, 5]

そして、私はこれを呼び出しますltrim list 4 -1 基本的にリストをちょうど[5]にスライスする必要があります

しかし、たとえば、ltrim が開始されてから ltrim が終了するまでの 1 ミリ秒後に、別のスレッドが項目をリストにプッシュしています。

rpush list 6
rpush list 7

2 つの rpushes と ltrims の両方が終了すると、結果のリストは [5, 6, 7] で構成されますか?

それはおそらく[5]だけでしょうか?つまり、ltrim が [5] で一時的なリストを作成するようなことを行い、2 つの rpush が完了した後に [5,6,7] を [5] で上書きするという競合状態の可能性はありますか?

4

1 に答える 1

4

簡単な答え:いいえ、コマンドはアトミックであるためです。

正直な答え:操作はアトミックだと思うので、そうは思いません。ただし、Web サイトでは、それらがアトミックであると明示的に述べていないため、99.99999999% の確信しかありません。

論理的な答え: Redis はシングルスレッドであるため、ltrim コマンドをプリエンプトできる他のスレッドはありません。シングル スレッド アプリケーションで競合状態が発生するには、ltrim 操作が完了する前に明示的にその操作から抜け出し、他の処理を開始する必要がありますが、これはあまり意味がありません。

于 2013-05-13T00:00:31.387 に答える