Heim  >  Artikel  >  Datenbank  >  Wie löst Redis Bestandsgleichzeitigkeitsprobleme und erreicht eine Mengenkontrolle?

Wie löst Redis Bestandsgleichzeitigkeitsprobleme und erreicht eine Mengenkontrolle?

PHPz
PHPznach vorne
2023-05-29 09:52:20922Durchsuche

Redis ist ein einzelner Prozess und Blockierungstyp. Es kann nur eine Anfrage gleichzeitig verarbeiten, und nachfolgende Anfragen müssen in die Warteschlange gestellt und gewartet werden.

Vorteile: Da es sich um einen einzelnen Prozess handelt, besteht keine Notwendigkeit, sich mit Parallelitätsproblemen zu befassen, was die Systemkomplexität verringert.

Nachteile: Nicht zum Zwischenspeichern großer Objekte (mehr als 100 KB) geeignet.

Grund: Da Redis nur a Ein einzelner Kern, Memcached kann mehrere Kerne verwenden. Daher weist Redis auf jedem Kern beim Speichern kleiner Daten eine höhere Leistung auf als Memcached.

Bei Daten von mehr als 100.000 ist die Leistung von Memcached höher als die von Redis. Obwohl Redis auch für die Leistung beim Speichern großer Datenmengen optimiert wurde, ist es Memcached immer noch etwas unterlegen.

Memcache ist multiprozessfähig und nicht blockierend. Wenn es nur als Cache verwendet wird, ist Memcache besser geeignet , existiert mycounter

set Setzt und initialisiert einen Schlüsselwert wie set mycounter 99Wie löst Redis Bestandsgleichzeitigkeitsprobleme und erreicht eine Mengenkontrolle?

get Ruft einen Schlüsselwert wie getmycounter

incr ab. Erhöhen Sie ihn um 1. Zum Beispiel incrmycounter // Das Ausgabeergebnis ist 100

incrby Geben Sie das Inkrement an Wert, z. B. incrbymycounter 2 // Das Ausgabeergebnis ist 102

Geben Sie den Wert an, z. B. incrbymycounter -2 // Das Ausgabeergebnis ist 100

setnx Wenn der Wert nicht vorhanden ist, wird der Wert beispielsweise erfolgreich festgelegt. setnxmycounter 99 // Das Ausgabeergebnis ist 0, was bedeutet, dass die Einstellung fehlgeschlagen ist und in Redis gespeichert wurde. setnx key1 12 // Das Ausgabeergebnis ist 1, was bedeutet, dass die Einstellung zuvor nicht vorhanden war

expire Legen Sie den Lebenszyklus eines Schlüssels fest, z. B. „expire mycounter 30“ // Stellen Sie die Gültigkeitsdauer auf 30 Sekunden ein . Wenn die Rückgabe -1 ist, bedeutet dies, dass sie nie abläuft und immer im Redis-Cache vorhanden ist, es sei denn, der Speicher reicht nicht aus.

// Wenn die Rückgabe -2 ist, bedeutet dies, dass Redis nicht abgelaufen ist Schlüsselwert. Sie können „exists“ zur Überprüfung verwenden. Wenn Sie „0“ zurückgeben, bedeutet dies, dass kein Lagerbestand vorhanden ist Kosten. (Zum Beispiel: Der Bestand beträgt 1.000, aber der Benutzer hat erfolgreich 2.000 Artikel gekauft und der Bestand reicht nicht aus.)

Die Lotterie ist begrenzt. Wenn Sie sie nicht kontrollieren, geben Sie zu viel Geld aus

Schnapp dir rote Umschläge

3. Flussdiagramm und Code

Option 1 Flussdiagramm:

Flussdiagramm von Option 2:

//方案1代码,测试坏境TP5
public function redisCountV1(){
    Log::record("测试版本1并发开始", Log::INFO);
    $redis = new Redis();
    //总库存数量
    $amountLimit = 100;
    //redis存储库存键名
    $keyName = "mycounter_v6";
    //假设每次消耗库存数为1
    $incrAmount = 1;
    //判断redis中是否 存在该值,如果不存在,则用set设置(问题是如果出现并发,两个或多个用户同时访问,会导致库存重新设置)
    if(!$redis->exists($keyName)){
        $redis->set($keyName, 95);
    }
    //从redis中取出当前库存数
    $currAmount = $redis->get($keyName);
    //如果当前库存数+增长的库存数>总库存,直接返回
    if($currAmount + $incrAmount > $amountLimit) {
        file_put_contents("/Users/han/Documents/www/cs/testv1.log", "bad luck \n", FILE_APPEND);
        Log::record("bad luck", Log::INFO);
        return false;
    }
    //缓存库存数量增加
    $redis->incrby($keyName, $incrAmount);
    file_put_contents("/Users/han/Documents/www/cs/testv1.log", "good luck \n", FILE_APPEND);
    Log::record("good luck", Log::INFO);
}

//测试方式:ab  -c 100 -n 200 http://www.fenleduo.com:8080/V7/Test/redisCountV1
rrree

Das obige ist der detaillierte Inhalt vonWie löst Redis Bestandsgleichzeitigkeitsprobleme und erreicht eine Mengenkontrolle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen