Maison > Article > développement back-end > Comment PHP empêche la concurrence élevée et les requêtes répétées basées sur les verrous distribués Redis
Exigences :
Donnons d'abord un exemple d'une certaine vérification de système : (Système de canal A, système B d'entreprise, système C de fabricant externe)
(1) Le système d'entreprise B appelle le système de canal A pour vérifier si le téléphone mobile, la carte d'identité et le nom entrants sont cohérents.
(2) Le système du canal A appelle ensuite le système C du fabricant externe.
(3) Le système du canal A renvoie les résultats au système métier B.
Parmi ces trois processus, (2) processus, l'appel à des fournisseurs externes nécessite une facturation.
Lorsque la concurrence du système métier B est très élevée, il y a 100 mêmes vérifications à trois facteurs. Puisqu'il s'agit des trois mêmes facteurs, le canal A n'a besoin d'appeler qu'une seule fois le fabricant pour connaître le résultat. Afin d'empêcher d'autres requêtes d'appeler des systèmes externes alors qu'une certaine requête n'a pas encore répondu, un verrouillage est requis à ce moment
Caractéristiques des verrous distribués
Quantity Atomicité : Dans le même temps, un seul thread d'une machine peut obtenir le verrou ;
● Réentrance : le même objet (tel qu'un thread, une classe) peut appeler le verrou de manière répétée et récursive sans mort
.● Blocable : avant l'acquisition du verrou, vous pouvez uniquement bloquer et attendre que le verrou soit obtenu.
● Haute disponibilité : même en cas de panne de programme ou de dommage de la machine, le verrou peut toujours être acquis ; , est libéré
gi Haute performance : Les opérations d'acquisition et de libération des verrous sont peu coûteuses.
Pour réaliser : verrouillage, réduction du verrouillage, délai d'expiration du verrouillage
La méthode d'implémentation peut être : base de données mc redis fichier système zookeeper
Je suis maintenant un système de canaux, quand 100 sont la même chose La demande commerciale est transmise. Ma première demande doit d'abord être verrouillée, puis je demande au système du fournisseur externe. Après avoir attendu le résultat de la réponse, j'insère une autre clé, puis je supprime le verrou.
Les autres requêtes obtiennent d'abord le verrou inférieur. Si le verrou existe déjà, elles attendront à leur tour. Si le verrou n'existe plus, elles interrogeront directement le résultat.
Si la première requête échoue et que le résultat n'est pas inséré en place, continuez à acquérir le verrou et interrogez le système externe.
Récupérez le verrou :
$redis->set('lock:手机号&身份证&姓名', 1, ['nx', 'ex'=>10]);
Libérez le verrou :
Supprimez simplement la clé directement
Délai d'expiration du verrouillage :
La clé de verrouillage a expiré Time
La nouvelle version de la commande redis set peut implémenter des verrous distribués, et peut simultanément implémenter set et timeout s'il n'existe pas.
4b7f0a7304beadcaaaaa0874072c18ecconnect("127.0.0.1",6379); //高并发时防止重复请求 //渠道系统传递过来的key $lockKey='lock:18806767777&37781991111629092&taoshihan'; $resultKey='res:18806767777&37781991111629092&taoshihan'; //如果已经查询过值,可以直接返回 $info=$redis->get($resultKey); if($info){ exit($info); } //如果没有值的,获取锁 $lock=$redis->set($lockKey, 1, ['nx', 'ex'=>10]); if($lock){ //请求外部系统获取结果,比如响应结果比较慢 sleep(8); $info='{"name":"taoshihan"}'; $ret=$redis->set($resultKey,$info); if($ret){ //删除锁 $redis->del($lockKey); exit($info); } } echo "请稍后重试!";
Apprentissage recommandé : Tutoriel PHP
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!