[解決済み] SETNXでシングルインスタンスのRedisをロックする
質問
アプリケーションクライアントから1つのRedisインスタンスに接続する必要があります。
クライアントはKubernetesで複製されるので、クライアントレプリカ間の競合を防ぐために、ロックに関するRedisのドキュメントを勉強しています。
ググって読み漁った結果、この2つのリソースにたどり着きました。
-
その
SETNX
コマンドを使用します。 https://redis.io/commands/setnx - Redlockアルゴリズムについて説明します。 https://redis.io/topics/distlock
興味深いことに
SETNX
を使用しないよう、文書で明示的にアドバイスしています。
SETNX
を使用してロックを実装することは、基本的に時代遅れであると述べています。
次のようなパターンは推奨されず、Redlockアルゴリズムが推奨されます[...]。
既存の実装の中には、このページをリファレンスとしてリンクしているものがあるため、とにかく古いパターンを文書化しています。
しかし、レッドロックのアルゴリズムは、特に 分散型 ロックされるため、複数のRedisインスタンスをロックしようとする場合、実際には複数の マスター .
もうちょっと踏み込むと、ライブラリの
レッドシンク
(golang)で宣言されている
New
関数は次のようになります。
func New(pools []Pool) *Redsync {
return &Redsync{
pools: pools,
}
}
まぎれもなく、Redisクラスタでのロックをサポートするために設計されているようです。
私の使用例では、1つのRedisインスタンスにのみ接続するつもりです。
おそらく、redsync パッケージを使用して、長さ 1 のスライスを渡すことができると思いますが、私には
SETNX
のパターンは、単一のRedisインスタンスで同様にうまく機能する可能性があります。
これは正しい理解でしょうか? ありがとうございます。
解決方法は?
Redlockのアルゴリズムは分散Redisシステム用に設計されています。 SET と SETNX のドキュメントを参照してください。
しかし、もっと重要なポイントはこれです。 複数のRedisクライアント間の競合を回避するためにロックを使用する必要はないでしょう。 . Redisロックは、通常、いくつかの 外部 分散されたリソース(私の回答 こちら を参照してください)。Redisはシングルスレッドなので、多くのコマンドはすでにアトミックです。また、トランザクションやLuaスクリプトを使用して、任意の複雑なアトミック操作を構成することができます。
ですから、私のアドバイスは、(分散型であろうとなかろうと)ロックを使おうとするのではなく、衝突を避けるために原子性を使用するようにクライアントコードを設計することです。
関連
-
[解決済み】Goプロジェクトのビルド時に「XXXパッケージはGOROOTにありません」と表示される。
-
[解決済み] MISCONF RedisがRDBスナップショットを保存するように設定されている。
-
[解決済み] Cgo: すみません、未実装です: 64ビットモードはコンパイルされていません。
-
[解決済み] SETNXでシングルインスタンスのRedisをロックする
-
[解決済み] Redisですべてを削除するには?
-
[解決済み] 揮発性 vs. 連動性 vs. ロック性
-
[解決済み] Redisを使用してパターンに一致するキーをアトミックに削除する方法
-
[解決済み] Goのオプションのパラメータ?
-
[解決済み] 利用可能なすべてのキーを取得するためのRedisコマンド?
-
[解決済み] lock(this){...}はなぜダメなのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] GO言語:致命的なエラー:すべてのゴルーチンがスリープしている - デッドロック
-
[解決済み] Notepad++ 用の Go 言語プラグイン
-
[解決済み] 関数呼び出しで「値として使用」される
-
[解決済み] go install` は `go.mod` にレコードを追加します。
-
[解決済み] インポートサイクル不可
-
[解決済み】関数宣言の構文:関数名の前に括弧でくくられたもの
-
[解決済み】なぜmake()やnew()をするのでしょうか?)
-
[解決済み】Goでディレクトリを一覧表示する
-
[解決済み】チャンネルを開いたままにしておいてもいいのでしょうか?
-
[解決済み】Goの構造体のスタックとヒープ割り当て、およびガベージコレクションとの関連性