Maison  >  Article  >  développement back-end  >  Comment PHP utilise-t-il Redis pour empêcher l'écriture secondaire en cas de concurrence importante ?

Comment PHP utilise-t-il Redis pour empêcher l'écriture secondaire en cas de concurrence importante ?

小云云
小云云original
2018-03-27 13:30:591298parcourir

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.

  1. $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 la suivante : définir la clé d'un verrou, setnx est une opération atomique, un seul processus peut écrire avec succès et l'écriture renvoie vrai (c'est-à-dire Obtenez 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é :

  1. $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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn