PHP appelle redis pour lire et écrire. Dans une grande concurrence, il apparaîtra : lire la clé 1 et écrire le contenu s'il n'y a pas de contenu. Cependant, dans une grande concurrence, plusieurs processus PHP écriront en même temps. cette fois, un verrou doit être ajouté, c'est-à-dire que le processus php qui acquiert le verrou a la permission 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éfinir la clé d'un verrou, setnx est une opération atomique, un seul processus peut écrire avec succès, et l'écriture retournera vrai (indiquant que l'autorisation de verrouillage est obtenue), puis écrivez le contenu, puis relâchez le verrou. Autrement dit, supprimez 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!