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

小云云
Libérer: 2023-03-22 12:32:01
original
1296 Les gens l'ont consulté

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; // 获取不到锁权限,直接返回
    }
    Copier après la connexion

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; // 获取不到锁权限,直接返回
    }
    Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!