redisロックに基づく実装

1336 ワード

redisロックの実装は、次の2つの条件に基づいています.
1つ目:
2.6から12リリースでは、redisはSETコマンドに一連のオプションを追加しました.
  • EX  seconds – Set the specified expire time, in seconds.
  • PX  milliseconds – Set the specified expire time, in milliseconds.
  • NX  – Only set the key if it does not already exist.
  • XX  – Only set the key if it already exist.
  • EX seconds–キーキーキーの有効期限を設定します.単位時間は秒
  • です.
  • PX milliseconds–キーキーキーの有効期限を設定します.単位はミリ秒
  • です.
  • NX–キーキーキーが存在しない場合にのみキーの値
  • が設定されます.
  • XX–キーキーキーが存在する場合にのみキーの値
  • が設定されます.
    2番目:
    redisベースのコマンドeval実行luaコマンド原子性保証
    まず例を見てみましょう.
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    
    $lockKey = 'lock';
    $token = uniqid("lock".rand(),true);$ttl = '5000';//NXはKEYが存在しない場合の設定を表し、setNX//PX設定の有効期限に相当し、単位はミリ秒$res=$redis->set($lockKey,$token,['NX','PX'=>$ttl]);if($res){//ロックが得られた}//ロック解除$script=<まずToken値を生成し、redisにロックをかけ、trueを返すとロックに成功します.そうしないと、他のプロセスがロックを取得します.
    ロック解除はredis luaスクリプトの原子性に依存し、ロックが存在し、key値がtokenの場合にロックが解除されます.他のプロセスのロックを誤解しないでください.