


Comment utiliser le verrouillage Redis pour résoudre des problèmes de concurrence élevée
Le problème de la haute concurrence est un problème que nous rencontrons souvent, alors comment résoudre le problème de la haute concurrence ? Cet article présente l'utilisation des verrous Redis pour résoudre des problèmes de concurrence élevée. Jetons un coup d'œil.
Ici, nous utilisons principalement la commande setnx de Redis pour gérer une simultanéité élevée.
setnx a deux paramètres. Le premier paramètre représente la clé. Le deuxième paramètre représente la valeur. Si la clé actuelle n'existe pas, la clé actuelle sera insérée, en utilisant le deuxième paramètre comme valeur. Retour 1. Si la clé actuelle existe, 0 sera renvoyé.
Créer un tableau d'inventaire
CREATE TABLE `storage` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `number` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
Définir l'inventaire initial sur 10
Créer un tableau de commande
CREATE TABLE `order` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `number` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
Test sans verrouillage
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'root'); $sql="select `number` from storage where id=1 limit 1"; $res = $pdo->query($sql)->fetch(); $number = $res['number']; if($number>0) { $sql ="insert into `order` VALUES (null,$number)"; $order_id = $pdo->query($sql); if($order_id) { $sql="update storage set `number`=`number`-1 WHERE id=1"; $pdo->query($sql); } }
Le test ab a simulé la concurrence et a révélé que l'inventaire était correct.
mysql> select * from storage; +----+--------+ | id | number | +----+--------+ | 1 | 0 | +----+--------+ 1 row in set (0.00 sec)
En regardant le tableau des commandes
mysql> select * from `order`; +----+--------+ | id | number | +----+--------+ | 1 | 10 | | 2 | 10 | | 3 | 9 | | 4 | 7 | | 5 | 6 | | 6 | 5 | | 7 | 5 | | 8 | 5 | | 9 | 4 | | 10 | 1 | +----+--------+ 10 rows in set (0.00 sec)
J'ai découvert que plusieurs commandes fonctionnent sur les mêmes données d'inventaire, ce qui peut entraîner des conditions de survente.
Modifiez le code et ajoutez un verrouillage Redis pour le contrôle des données
<?php /** * Created by PhpStorm. * User: daisc * Date: 2018/7/23 * Time: 14:45 */ class Lock { private static $_instance ; private $_redis; private function __construct() { $this->_redis = new Redis(); $this->_redis ->connect('127.0.0.1'); } public static function getInstance() { if(self::$_instance instanceof self) { return self::$_instance; } return self::$_instance = new self(); } /** * @function 加锁 * @param $key 锁名称 * @param $expTime 过期时间 */ public function set($key,$expTime) { //初步加锁 $isLock = $this->_redis->setnx($key,time()+$expTime); if($isLock) { return true; } else { //加锁失败的情况下。判断锁是否已经存在,如果锁存在切已经过期,那么删除锁。进行重新加锁 $val = $this->_redis->get($key); if($val&&$val<time()) { $this->del($key); } return $this->_redis->setnx($key,time()+$expTime); } } /** * @param $key 解锁 */ public function del($key) { $this->_redis->del($key); } } $pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'root'); $lockObj = Lock::getInstance(); //判断是能加锁成功 if($lock = $lockObj->set('storage',10)) { $sql="select `number` from storage where id=1 limit 1"; $res = $pdo->query($sql)->fetch(); $number = $res['number']; if($number>0) { $sql ="insert into `order` VALUES (null,$number)"; $order_id = $pdo->query($sql); if($order_id) { $sql="update storage set `number`=`number`-1 WHERE id=1"; $pdo->query($sql); } } //解锁 $lockObj->del('storage'); } else { //加锁不成功执行其他操作。 }
Effectuez à nouveau le ab
test et vérifiez les résultats du test
mysql> select * from `order`; +----+--------+ | id | number | +----+--------+ | 1 | 10 | | 2 | 9 | | 3 | 8 | | 4 | 7 | | 5 | 6 | | 6 | 5 | | 7 | 4 | | 8 | 3 | | 9 | 2 | | 10 | 1 | +----+--------+ 10 rows in set (0.00 sec)
Il s'avère que la table de commande n'opère pas le même inventaire La situation des données. Par conséquent, l’utilisation du verrouillage Redis peut gérer efficacement une concurrence élevée.
En fait, il n'est pas nécessaire de juger le délai d'expiration lors du verrouillage. Ici, afin d'éviter une impasse, nous ajoutons un jugement sur le délai d'expiration. Supprimez activement le verrou lorsqu'il expire.
Recommandations associées :
php utilise des verrous de fichiers pour résoudre les problèmes de concurrence élevée
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Méthodes de planification des requêtes et d'allocation des tâches dans un environnement PHP à haute concurrence Avec le développement rapide d'Internet, PHP, en tant que langage de développement back-end largement utilisé, est confronté à de plus en plus de demandes à haute concurrence. Dans un environnement à forte concurrence, la manière de mettre en œuvre la planification des requêtes et l’allocation des tâches est devenue un problème important qui doit être résolu lors du développement. Cet article présentera certaines méthodes de planification des requêtes et d'allocation de tâches dans un environnement PHP à haute concurrence et fournira des exemples de code. 1. Gestion des processus et file d'attente des tâches Dans l'environnement PHP à haute concurrence, la gestion des processus et la file d'attente des tâches sont des méthodes d'implémentation couramment utilisées.

Comment obtenir une concurrence élevée et un équilibrage de charge des requêtes dans FastAPI Introduction : Avec le développement d'Internet, la concurrence élevée des applications Web est devenue un problème courant. Lorsque nous traitons un grand nombre de demandes, nous devons utiliser des frameworks et des technologies efficaces pour garantir les performances et l’évolutivité du système. FastAPI est un framework Python hautes performances qui peut nous aider à atteindre une concurrence élevée et un équilibrage de charge. Cet article explique comment utiliser FastAPI pour obtenir une concurrence élevée et un équilibrage de charge des requêtes. Nous utiliserons Python3.7

Pour les systèmes à haute concurrence, le framework Go fournit des modes architecturaux tels que le mode pipeline, le mode pool Goroutine et le mode file d'attente de messages. Dans des cas pratiques, les sites Web à haute concurrence utilisent le proxy Nginx, la passerelle Golang, le pool Goroutine et la base de données pour gérer un grand nombre de requêtes simultanées. L'exemple de code montre l'implémentation d'un pool Goroutine pour gérer les requêtes entrantes. En choisissant des modèles architecturaux et des implémentations appropriés, le framework Go peut créer des systèmes à haute concurrence évolutifs et hautement simultanés.

Dans les scénarios à haute concurrence, selon les tests de référence, les performances du framework PHP sont : Phalcon (RPS2200), Laravel (RPS1800), CodeIgniter (RPS2000) et Symfony (RPS1500). Des cas réels montrent que le framework Phalcon a réalisé 3 000 commandes par seconde lors de l'événement Double Eleven sur le site de commerce électronique.

[Titre] Techniques de traitement de connexions longues TCP hautement concurrentes pour les fonctions de développement Swoole [Introduction] Avec le développement rapide d'Internet, les applications ont des exigences de plus en plus élevées en matière de traitement simultané. En tant que moteur de communication réseau hautes performances basé sur PHP, Swoole offre de puissantes capacités asynchrones, multi-processus et coroutine, qui améliorent considérablement les capacités de traitement simultané des applications. Cet article présentera comment utiliser la fonction de développement Swoole pour gérer les techniques de traitement des connexions longues TCP à haute concurrence et fournira des explications détaillées avec des exemples de code. 【Texte】1.

Dans les scénarios de programmation orientée objet à forte concurrence, les fonctions sont largement utilisées dans le langage Go : Fonctions en tant que méthodes : des fonctions peuvent être attachées à des structures pour implémenter une programmation orientée objet, exploitant facilement les données de structure et fournissant des fonctions spécifiques. Fonctions en tant qu'organismes d'exécution simultanés : les fonctions peuvent être utilisées comme organes d'exécution de goroutines pour mettre en œuvre l'exécution de tâches simultanées et améliorer l'efficacité du programme. Fonction de rappel : les fonctions peuvent être transmises en tant que paramètres à d'autres fonctions et être appelées lorsque des événements ou des opérations spécifiques se produisent, offrant ainsi un mécanisme de rappel flexible.

Utiliser les fonctions de développement de Swoole pour obtenir une communication réseau à haute concurrence Résumé : Swoole est un cadre de communication réseau hautes performances basé sur le langage PHP. Il possède des fonctionnalités telles que des coroutines, des E/S asynchrones et des processus multiples, et convient au développement de hautes performances. applications de réseau simultané. Cet article expliquera comment utiliser Swoole pour développer des fonctions de communication réseau à haute concurrence et donnera quelques exemples de code. Introduction Avec le développement rapide d'Internet, les exigences en matière de communication réseau sont de plus en plus élevées, en particulier dans les scénarios à forte concurrence. Le développement PHP traditionnel est confronté à de faibles capacités de traitement simultané

Techniques d'optimisation de lecture et d'écriture de bases de données dans le traitement PHP à haute concurrence Avec le développement rapide d'Internet, la croissance des visites de sites Web est devenue de plus en plus élevée. Dans les applications Internet actuelles, le traitement à haute concurrence est devenu un problème incontournable. Dans le développement PHP, les opérations de lecture et d’écriture de la base de données sont l’un des goulots d’étranglement des performances. Par conséquent, dans les scénarios à forte concurrence, il est très important d’optimiser les opérations de lecture et d’écriture de la base de données. Ce qui suit présentera quelques techniques d'optimisation de lecture et d'écriture de base de données dans le traitement PHP à haute concurrence et donnera des exemples de code correspondants. L'utilisation de la technologie de regroupement de connexions pour se connecter à la base de données
