Heim Backend-Entwicklung PHP-Tutorial So verwenden Sie die Redis-Sperre, um Probleme mit hoher Parallelität zu lösen

So verwenden Sie die Redis-Sperre, um Probleme mit hoher Parallelität zu lösen

Sep 10, 2018 pm 02:45 PM
高并发

Das Problem der hohen Parallelität ist ein Problem, auf das wir häufig stoßen. Wie kann das Problem der hohen Parallelität gelöst werden? In diesem Artikel wird die Verwendung von Redis-Sperren zur Lösung von Problemen mit hoher Parallelität vorgestellt.

Hier verwenden wir hauptsächlich den Befehl setnx von Redis, um eine hohe Parallelität zu bewältigen.

setnx hat zwei Parameter. Der erste Parameter stellt den Schlüssel dar. Der zweite Parameter stellt den Wert dar. Wenn der aktuelle Schlüssel nicht vorhanden ist, wird der aktuelle Schlüssel eingefügt, wobei der zweite Parameter als Wert verwendet wird. Rückkehr 1. Wenn der aktuelle Schlüssel existiert, wird 0 zurückgegeben.

Bestandstabelle erstellen

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
Nach dem Login kopieren

Anfangsbestand auf 10 setzen

Bestelltabelle erstellen

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
Nach dem Login kopieren

Test ohne Sperre

$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);
    }
}
Nach dem Login kopieren

ab Der Test simulierte Parallelität und stellte fest, dass die Bestandsaufnahme korrekt war.

mysql> select * from storage;
+----+--------+
| id | number |
+----+--------+
|  1 |      0 |
+----+--------+
1 row in set (0.00 sec)
Nach dem Login kopieren

Beim Blick auf die Bestelltabelle

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)
Nach dem Login kopieren

wurde festgestellt, dass mehrere Bestellungen mit denselben Bestandsdaten ausgeführt werden, was zu überverkauften Konditionen führen kann.

Ändern Sie den Code und fügen Sie eine Redis-Sperre zur Datenkontrolle hinzu

<?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
{
    //加锁不成功执行其他操作。
}
Nach dem Login kopieren

Führen Sie den ab Test erneut durch und überprüfen Sie die Testergebnisse

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)
Nach dem Login kopieren

Sie haben festgestellt, dass die Bestelltabelle nicht funktioniert die gleichen Bestandsdaten. Daher kann die Verwendung der Redis-Sperre eine hohe Parallelität effektiv bewältigen.

Tatsächlich besteht keine Notwendigkeit, die Ablaufzeit beim Sperren zu beurteilen. Um einen Deadlock zu vermeiden, fügen wir hier eine Beurteilung der Ablaufzeit hinzu. Löschen Sie die Sperre aktiv, wenn sie abläuft.

Verwandte Empfehlungen:

PHP verwendet Dateisperren, um Probleme mit hoher Parallelität zu lösen

Wie wäre es mit der Verwendung von Redis zum Speichern von PHP-Sitzungen? Lösen Sie das Problem der Parallelität und Konsistenz

Das obige ist der detaillierte Inhalt vonSo verwenden Sie die Redis-Sperre, um Probleme mit hoher Parallelität zu lösen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Methoden zur Anforderungsplanung und Aufgabenzuweisung in einer PHP-Umgebung mit hoher Parallelität Methoden zur Anforderungsplanung und Aufgabenzuweisung in einer PHP-Umgebung mit hoher Parallelität Aug 10, 2023 pm 01:24 PM

Methoden zur Anforderungsplanung und Aufgabenzuweisung in einer PHP-Umgebung mit hoher Parallelität Mit der rasanten Entwicklung des Internets ist PHP als weit verbreitete Back-End-Entwicklungssprache mit immer mehr Anforderungen mit hoher Parallelität konfrontiert. In einer Umgebung mit hoher Parallelität ist die Implementierung der Anforderungsplanung und Aufgabenzuweisung zu einem wichtigen Problem geworden, das während der Entwicklung gelöst werden muss. In diesem Artikel werden einige Methoden zur Anforderungsplanung und Aufgabenzuweisung in einer PHP-Umgebung mit hoher Parallelität vorgestellt und Codebeispiele bereitgestellt. 1. Prozessverwaltung und Aufgabenwarteschlange In PHP-Umgebungen mit hoher Parallelität sind Prozessverwaltung und Aufgabenwarteschlange häufig verwendete Implementierungsmethoden.

So erreichen Sie eine hohe Parallelität und einen Lastausgleich von Anforderungen in FastAPI So erreichen Sie eine hohe Parallelität und einen Lastausgleich von Anforderungen in FastAPI Jul 31, 2023 pm 01:50 PM

So erreichen Sie eine hohe Parallelität und einen Lastausgleich von Anforderungen in FastAPI. Einführung: Mit der Entwicklung des Internets ist die hohe Parallelität von Webanwendungen zu einem häufigen Problem geworden. Bei der Bearbeitung einer großen Anzahl von Anfragen müssen wir effiziente Frameworks und Technologien einsetzen, um die Systemleistung und Skalierbarkeit sicherzustellen. FastAPI ist ein leistungsstarkes Python-Framework, das uns dabei helfen kann, eine hohe Parallelität und Lastverteilung zu erreichen. In diesem Artikel wird erläutert, wie Sie mit FastAPI eine hohe Parallelität und einen Lastausgleich für Anforderungen erreichen. Wir werden Python3.7 verwenden

Die Architektur des Golang-Frameworks in Systemen mit hoher Parallelität Die Architektur des Golang-Frameworks in Systemen mit hoher Parallelität Jun 03, 2024 pm 05:14 PM

Für Systeme mit hoher Parallelität bietet das Go-Framework Architekturmodi wie den Pipeline-Modus, den Goroutine-Pool-Modus und den Nachrichtenwarteschlangenmodus. In der Praxis verwenden Websites mit hoher Parallelität Nginx-Proxy, Golang-Gateway, Goroutine-Pool und Datenbank, um eine große Anzahl gleichzeitiger Anforderungen zu verarbeiten. Das Codebeispiel zeigt die Implementierung eines Goroutine-Pools zur Bearbeitung eingehender Anfragen. Durch die Auswahl geeigneter Architekturmuster und Implementierungen kann das Go-Framework skalierbare und hochgradig gleichzeitige Systeme mit hoher Parallelität erstellen.

Leistung des PHP-Frameworks in Szenarien mit hoher Parallelität Leistung des PHP-Frameworks in Szenarien mit hoher Parallelität Jun 06, 2024 am 10:25 AM

In Szenarien mit hoher Parallelität beträgt die Leistung des PHP-Frameworks laut Benchmark-Tests: Phalcon (RPS2200), Laravel (RPS1800), CodeIgniter (RPS2000) und Symfony (RPS1500). Tatsächliche Fälle zeigen, dass das Phalcon-Framework während des Double Eleven-Events auf der E-Commerce-Website 3.000 Bestellungen pro Sekunde erreichte.

Fähigkeiten zur Verarbeitung langer TCP-Verbindungen mit hoher Parallelität für die Swoole-Entwicklungsfunktion Fähigkeiten zur Verarbeitung langer TCP-Verbindungen mit hoher Parallelität für die Swoole-Entwicklungsfunktion Aug 25, 2023 pm 10:01 PM

[Titel] Hochgradig gleichzeitige TCP-Techniken zur Verarbeitung langer Verbindungen für Swoole-Entwicklungsfunktionen [Einleitung] Mit der rasanten Entwicklung des Internets stellen Anwendungen immer höhere Anforderungen an die gleichzeitige Verarbeitung. Als leistungsstarke Netzwerkkommunikations-Engine auf PHP-Basis bietet Swoole leistungsstarke asynchrone, Multiprozess- und Coroutine-Funktionen, wodurch die gleichzeitigen Verarbeitungsfähigkeiten von Anwendungen erheblich verbessert werden. In diesem Artikel wird erläutert, wie Sie die Swoole-Entwicklungsfunktion verwenden, um lange TCP-Verbindungen mit hoher Parallelität zu verarbeiten, und detaillierte Anweisungen mit Codebeispielen bereitstellen. 【Text】1

Anwendung von Golang-Funktionen in Szenarien mit hoher Parallelität in der objektorientierten Programmierung Anwendung von Golang-Funktionen in Szenarien mit hoher Parallelität in der objektorientierten Programmierung Apr 30, 2024 pm 01:33 PM

In Szenarien mit hoher Parallelität der objektorientierten Programmierung werden Funktionen häufig in der Go-Sprache verwendet: Funktionen als Methoden: Funktionen können an Strukturen angehängt werden, um objektorientierte Programmierung zu implementieren, Strukturdaten bequem zu bedienen und spezifische Funktionen bereitzustellen. Funktionen als gleichzeitige Ausführungskörper: Funktionen können als Goroutine-Ausführungskörper verwendet werden, um die gleichzeitige Aufgabenausführung zu implementieren und die Programmeffizienz zu verbessern. Funktion als Rückruf: Funktionen können als Parameter an andere Funktionen übergeben und aufgerufen werden, wenn bestimmte Ereignisse oder Vorgänge auftreten, wodurch ein flexibler Rückrufmechanismus bereitgestellt wird.

Nutzen Sie Swoole-Entwicklungsfunktionen, um eine hohe gleichzeitige Netzwerkkommunikation zu erreichen Nutzen Sie Swoole-Entwicklungsfunktionen, um eine hohe gleichzeitige Netzwerkkommunikation zu erreichen Aug 08, 2023 pm 01:57 PM

Nutzen Sie Swoole-Entwicklungsfunktionen, um eine Netzwerkkommunikation mit hoher Parallelität zu erreichen. Zusammenfassung: Swoole ist ein leistungsstarkes Netzwerkkommunikations-Framework, das auf der PHP-Sprache basiert. Es verfügt über Funktionen wie Coroutinen, asynchrone E/A und Multiprozesse und eignet sich für die Entwicklung von Hochgeschwindigkeitsnetzwerken. Parallelität von Netzwerkanwendungen. In diesem Artikel wird die Verwendung von Swoole zur Entwicklung von Netzwerkkommunikationsfunktionen mit hoher Parallelität vorgestellt und einige Codebeispiele gegeben. Einleitung Mit der rasanten Entwicklung des Internets werden die Anforderungen an die Netzwerkkommunikation immer höher, insbesondere in Szenarien mit hoher Parallelität. Bei der herkömmlichen PHP-Entwicklung sind die Fähigkeiten zur gleichzeitigen Verarbeitung schwach

Fähigkeiten zur Optimierung des Lesens und Schreibens von Datenbanken in PHP-Verarbeitung mit hoher Parallelität Fähigkeiten zur Optimierung des Lesens und Schreibens von Datenbanken in PHP-Verarbeitung mit hoher Parallelität Aug 12, 2023 pm 04:31 PM

Optimierungstechniken für das Lesen und Schreiben von Datenbanken in PHP mit hoher Parallelität. Mit der rasanten Entwicklung des Internets ist das Wachstum der Website-Besuche immer höher geworden. In heutigen Internetanwendungen ist die Verarbeitung mit hoher Parallelität zu einem Problem geworden, das nicht ignoriert werden kann. In der PHP-Entwicklung gehören Lese- und Schreibvorgänge in der Datenbank zu den Leistungsengpässen. Daher ist es in Szenarien mit hoher Parallelität sehr wichtig, die Lese- und Schreibvorgänge der Datenbank zu optimieren. Im Folgenden werden einige Datenbank-Lese- und Schreiboptimierungstechniken in der PHP-Verarbeitung mit hoher Parallelität vorgestellt und entsprechende Codebeispiele gegeben. Mithilfe der Verbindungspooling-Technologie wird eine Verbindung zur Datenbank hergestellt

See all articles