ロックには3つの部分があります:
- キー(データベース内のロックの一意の名前)
- 値(ロックの「所有者」を示すためと、ロックの解放と拡張が正しく行われていることを確認するための両方に使用できる呼び出し元定義のトークン)
- 期間(意図的にロックするのは有限の期間です)
他の値が思い浮かばない場合、GUIDは適切な「値」を作成する可能性があります。マシン名(または、同じマシン上で複数のプロセスが競合する可能性がある場合は、マシン名の変更されたバージョン)を使用する傾向があります。
また、ロックを取得することは投機的であることに注意してください 、ブロッキングではありません 。 失敗する可能性は十分にあります ロックを取得するには、これをテストし、再試行ロジックを追加する必要がある場合があります。
典型的な例は次のとおりです。
RedisValue token = Environment.MachineName;
if(db.LockTake(key, token, duration)) {
try {
// you have the lock do work
} finally {
db.LockRelease(key, token);
}
}
作業が長い場合(特にループ)、場合によってはLockExtend
を追加することをお勧めします。 途中で電話をかけます-成功を確認することを忘れないでください(タイムアウトした場合に備えて)。
すべてにも注意してください 個々のredisコマンドはアトミックであるため、2つの目立たない操作が競合することを心配する必要はありません。より複雑なマルチオペレーションユニットの場合、トランザクション およびスクリプト オプションです。