redisロックに基づく実装
1336 ワード
redisロックの実装は、次の2つの条件に基づいています.
1つ目:
2.6から12リリースでは、redisは です. です. が設定されます. が設定されます.
2番目:
redisベースのコマンドeval実行luaコマンド原子性保証
まず例を見てみましょう.まずToken値を生成し、redisにロックをかけ、trueを返すとロックに成功します.そうしないと、他のプロセスがロックを取得します.
ロック解除はredis luaスクリプトの原子性に依存し、ロックが存在し、key値がtokenの場合にロックが解除されます.他のプロセスのロックを誤解しないでください.
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=<ロック解除はredis luaスクリプトの原子性に依存し、ロックが存在し、key値がtokenの場合にロックが解除されます.他のプロセスのロックを誤解しないでください.