Cet article présente principalement la méthode de PHP utilisant Redis pour empêcher l'écriture secondaire en cas de concurrence importante. Il analyse les erreurs de lecture et d'écriture lorsque PHP utilise le mécanisme de verrouillage pour implémenter la lecture et l'écriture simultanées de Redis sous forme d'exemples. besoin peut s'y référer. Suivant
L'exemple de cet article décrit comment PHP utilise Redis pour empêcher l'écriture secondaire dans des conditions de concurrence importante. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :
PHP appelle redis pour effectuer des opérations de lecture et d'écriture, en cas de grande concurrence, il apparaîtra : lire la clé 1 et écrire le contenu s'il n'y a pas de contenu. , mais en cas de concurrence importante, plusieurs opérations simultanées apparaîtront. Dans le cas d'une écriture par le processus PHP, un verrou doit être ajouté à ce moment-là, c'est-à-dire que le processus PHP qui obtient le verrou a l'autorisation d'écrire.
$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; // 获取不到锁权限,直接返回 }
L'idée est : Définissez une clé de verrouillage, setnx est une opération atomique, un seul processus peut écrire avec succès, et l'écriture est renvoyé avec succès true (c'est-à-dire obtenir l'autorisation de verrouillage), puis écrivez le contenu, puis relâchez le verrou pour supprimer la clé de verrouillage. Les processus qui ne peuvent pas obtenir le verrou reviennent directement. Mais il existe une situation où le processus qui obtient l'autorisation de verrouillage signale une erreur lors de son exécution après l'obtention du verrou. Par conséquent, le verrou n'est pas libéré et le contenu ne peut pas être écrit. pour obtenir l'autorisation de verrouillage, il faut juger de la durée de validité restante du verrou, si elle est -1, définissez la durée effective du verrou sur 5 secondes (5 secondes sont réservées au temps d'exécution du processus qui obtient le verrou, ce qui c'est suffisant). Code amélioré :
$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; // 获取不到锁权限,直接返回 }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!