redis リスト、プロデューサーは lpush を保持します。別のスレッドでは、コンシューマーが定期的にリストからすべてを取り出し、要素を分類します。プロデューサーは押し続けるので、総出しはアトミックに行わなければなりません。では、これを行う効果的な方法はありますか?spring-data-redisを使用できます。
// producer
getOpsForList.push(k, v);
// consumer
alist = range(k,0,-1); // take all out
alist.parallelStream() // during which a producer thread could push but I hope it is "blocked".
delete(k); // list is now empty and push from producer is unblocked.
multi
実際にはを送信し、1 回のトランザクションで送信するため、私の目標は達成されexec
ません。これまでのところ、私が考えることができる唯一の方法は、リストが空になるまで保持して追加することです。lrange
lpush
delete
lpop
alist
EDIT、これは私が思うことです:操作が1回だけ実行されることを確認したい場合は、次を使用しwatch
ます:
watch key
val = get key
val = val + 1
multi
set key val
exec
「中断」されたくない場合 (マルチスレッド割り込みではなく)、実行回数を気にしない場合は、トランザクション (multi
およびexec
) で十分です。
multi
val = lrange key 0 -1
delete key
exec
val
公式ドキュメントで述べられているように、終了後もリストです
トランザクション内のすべてのコマンドはシリアル化され、順番に実行されます。Redis トランザクションの実行中に、別のクライアントによって発行されたリクエストが処理されることは決してありません。
redis 以外では、データ操作を取り除き、list.stream.parallelism
関数はデータ ゲッターのみに焦点を当てています。これは、最後のコード パラグラフとまったく同じです。;)