


PHP verwendet die Redis-Sperre, um den gleichzeitigen Zugriff einzuschränken. Klassenbeispiel
In diesem Artikel wird die Verwendung von Redis-Sperren in PHP zur Begrenzung gleichzeitiger Zugriffsklassen vorgestellt und die Methoden zur gleichzeitigen Zugriffsbeschränkung im Detail vorgestellt.
1. Probleme mit der gleichzeitigen Zugriffsbeschränkung
Für einige Szenarien, in denen der gleichzeitige Zugriff desselben Benutzers eingeschränkt werden muss, wenn der Benutzer mehrere Male gleichzeitig Anfragen stellt, und der Server Für den Prozess gibt es keine Sperrbeschränkungen. Der Benutzer kann mehrere Male erfolgreich anfordern.
Wenn der Benutzer beispielsweise beim Einlösen von Gutscheinen den Einlösungscode gleichzeitig einreicht, kann der Benutzer denselben Einlösungscode verwenden, um mehrere Gutscheine gleichzeitig einzulösen, ohne Einschränkungen zu sperren.
Der Pseudocode lautet wie folgt:
wenn A (kann eingelöst werden)
B (Einlösung wird ausgeführt)
C (aktualisiert, um eingelöst zu werden)
D (Ende)
Wenn Benutzer gleichzeitig Einlösungscodes einreichen, können sie alle als einlösbar (A) beurteilt werden, da eine Einlösung (B) ausgeführt werden muss, bevor sie auf das eingelöste Collar aktualisiert wird ( C). Wenn der Benutzer daher mehrere Anfragen stellt, bevor eine Aktualisierung als eingelöst vorliegt, können diese Anfragen erfolgreich ausgeführt werden.
2. Methode zur gleichzeitigen Zugriffsbeschränkung
Durch die Verwendung von Dateisperren können gleichzeitige Zugriffsbeschränkungen erreicht werden. In Umgebungen mit verteilter Architektur kann die Verwendung von Dateisperren jedoch keine gleichzeitigen Zugriffsbeschränkungen auf mehreren Servern garantieren.
Redis ist eine Open-Source-Schlüsselwertdatenbank vom Protokolltyp, die in der ANSI-C-Sprache geschrieben ist, Netzwerke unterstützt, speicherbasiert und persistent sein kann und APIs in mehreren Sprachen bereitstellt.
In diesem Artikel wird die setnx-Methode verwendet, um die verteilte Sperrfunktion zu implementieren. setnx ist Set it N**ot eX**ists.
Wenn der Schlüsselwert nicht vorhanden ist, ist das Einfügen erfolgreich (die Sperre wurde erfolgreich erworben). Wenn der Schlüsselwert bereits vorhanden ist, schlägt das Einfügen fehl (der Sperrenerwerb schlägt fehl)
RedisLock.class.PHP
<?php /** * Redis锁操作类 * Date: 2016-06-30 * Author: fdipzone * Ver: 1.0 * * Func: * public lock 获取锁 * public unlock 释放锁 * private connect 连接 */ class RedisLock { // class start private $_config; private $_redis; /** * 初始化 * @param Array $config redis连接设定 */ public function __construct($config=array()){ $this->_config = $config; $this->_redis = $this->connect(); } /** * 获取锁 * @param String $key 锁标识 * @param Int $expire 锁过期时间 * @return Boolean */ public function lock($key, $expire=5){ $is_lock = $this->_redis->setnx($key, time()+$expire); // 不能获取锁 if(!$is_lock){ // 判断锁是否过期 $lock_time = $this->_redis->get($key); // 锁已过期,删除锁,重新获取 if(time()>$lock_time){ $this->unlock($key); $is_lock = $this->_redis->setnx($key, time()+$expire); } } return $is_lock? true : false; } /** * 释放锁 * @param String $key 锁标识 * @return Boolean */ public function unlock($key){ return $this->_redis->del($key); } /** * 创建redis连接 * @return Link */ private function connect(){ try{ $redis = new Redis(); $redis->connect($this->_config['host'],$this->_config['port'],$this->_config['timeout'],$this->_config['reserved'],$this->_config['retry_interval']); if(empty($this->_config['auth'])){ $redis->auth($this->_config['auth']); } $redis->select($this->_config['index']); }catch(RedisException $e){ throw new Exception($e->getMessage()); return false; } return $redis; } } // class end ?>
demo.php
<?php require 'RedisLock.class.php'; $config = array( 'host' => 'localhost', 'port' => 6379, 'index' => 0, 'auth' => '', 'timeout' => 1, 'reserved' => NULL, 'retry_interval' => 100, ); // 创建redislock对象 $oRedisLock = new RedisLock($config); // 定义锁标识 $key = 'mylock'; // 获取锁 $is_lock = $oRedisLock->lock($key, 10); if($is_lock){ echo 'get lock success<br>'; echo 'do sth..<br>'; sleep(5); echo 'success<br>'; $oRedisLock->unlock($key); // 获取锁失败 }else{ echo 'request too frequently<br>'; } ?>
Testmethode:
Öffnen Sie zwei verschiedene Browser und greifen Sie gleichzeitig auf demo.php in A und B zu
Wenn Sie zuerst darauf zugreifen, erhalten Sie die Sperre
Ausgabe
Sperre erhalten Erfolg
etwas tun.
Erfolg
Wenn eine weitere Erfassungssperre fehlschlägt, wird die Anforderung zu häufig sein Ausgabe
um sicherzustellen, dass zur gleichen Zeit nur ein Zugriff gültig ist, wodurch der gleichzeitige Zugriff effektiv eingeschränkt wird.
Um Deadlocks durch plötzliche Systemfehler zu vermeiden, wird beim Erwerb der Sperre eine Ablaufzeit hinzugefügt. Wenn die Ablaufzeit abgelaufen ist, wird die Sperre auch im gesperrten Zustand aufgehoben, um Probleme durch Deadlocks zu vermeiden .
Weitere PHP-bezogene Artikel zur Verwendung der Redis-Sperre zur Begrenzung gleichzeitiger Zugriffsklassenbeispiele finden Sie auf der chinesischen PHP-Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Alipay PHP ...

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Die Anwendung des soliden Prinzips in der PHP -Entwicklung umfasst: 1. Prinzip der Einzelverantwortung (SRP): Jede Klasse ist nur für eine Funktion verantwortlich. 2. Open and Close Principle (OCP): Änderungen werden eher durch Erweiterung als durch Modifikation erreicht. 3.. Lischs Substitutionsprinzip (LSP): Unterklassen können Basisklassen ersetzen, ohne die Programmgenauigkeit zu beeinträchtigen. 4. Schnittstellen-Isolationsprinzip (ISP): Verwenden Sie feinkörnige Schnittstellen, um Abhängigkeiten und nicht verwendete Methoden zu vermeiden. 5. Abhängigkeitsinversionsprinzip (DIP): Hoch- und niedrige Module beruhen auf der Abstraktion und werden durch Abhängigkeitsinjektion implementiert.

So setzen Sie die Berechtigungen von Unixsocket automatisch nach dem Neustart des Systems. Jedes Mal, wenn das System neu startet, müssen wir den folgenden Befehl ausführen, um die Berechtigungen von Unixsocket: sudo ...

In Artikel wird die in PHP 5.3 eingeführte LSB -Bindung (LSB) erörtert, die die Laufzeitauflösung der statischen Methode ermöglicht, um eine flexiblere Vererbung zu erfordern. Die praktischen Anwendungen und potenziellen Perfo von LSB

Senden von JSON -Daten mithilfe der Curl -Bibliothek von PHP in der PHP -Entwicklung müssen häufig mit externen APIs interagieren. Eine der gängigen Möglichkeiten besteht darin, die Curl Library zu verwenden, um Post � ...

Wie debugge ich den CLI -Modus in PhpStorm? Bei der Entwicklung mit PHPSTORM müssen wir manchmal den PHP im CLI -Modus (COMS -Zeilenschnittstellen) debuggen ...

In Artikel werden wichtige Sicherheitsfunktionen in Frameworks erörtert, um vor Schwachstellen zu schützen, einschließlich Eingabevalidierung, Authentifizierung und regelmäßigen Aktualisierungen.
