この記事では、PHP が大規模な同時実行下での二次書き込みを防止するために Redis を使用する方法を主に紹介し、PHP がロック機構を使用して Redis の同時読み取りと書き込みを実装する際の読み取りと書き込みのエラーを例の形で分析します。参照してください
この記事の例では、PHP が Redis を使用して大規模な同時実行下での二次書き込みを防ぐ方法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです。
PHP は、読み取りおよび書き込み操作を実行するために redis を呼び出します。ただし、key1 を読み取り、コンテンツがない場合はコンテンツを書き込みます。同時実行性が高い場合、複数の PHP プロセスが同時に書き込みを行うことになります。この場合、この時点でロックを追加する必要があります。つまり、ロックを取得する PHP プロセスには書き込み権限が与えられます。
$lock_key = 'LOCK_PREFIX' . $redis_key; $is_lock = $redis->setnx($lock_key, 1); // 加锁 if($is_lock == true){ // 获取锁权限 $redis->setex($redis_key, $expire, $data); // 写入内容 // 释放锁 $redis->del($lock_key); }else{ return true; // 获取不到锁权限,直接返回 }
アイデアは次のとおりです。 ロックのキーを設定する setnx は、書き込みが成功すると true を返します (ロック許可が取得されたことを示します)。コンテンツを書き込み、ロックを解除します。ロック キーを削除します。ロックを取得できないプロセスは直接戻ります。ただし、ロック許可を取得したプロセスがロックを取得した後に実行するときにエラーを報告する状況があり、その結果、ロックが解放されず、コンテンツを書き込むことができません。ロック許可を取得するには、ロックの残り有効時間を判断する必要があります。-1 の場合、ロックの有効時間を 5 秒に設定します (5 秒は、ロックを取得するプロセスの実行時間のために予約されています)。十分です)。改善されたコード:
$lock_key = 'LOCK_PREFIX' . $redis_key; $is_lock = $redis->setnx($lock_key, 1); // 加锁 if($is_lock == true){ // 获取锁权限 $redis->setex($redis_key, $expire, $data); // 写入内容 // 释放锁 $redis->del($lock_key); }else{ // 防止死锁 if($redis->ttl($lock_key) == -1){ $redis->expire($lock_key, 5); } return true; // 获取不到锁权限,直接返回 }
以上がPHP は Redis を使用して、大規模な同時実行下での二次書き込みを防止するメソッドを実装します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。