Aktueller Standort: Startseite> Neueste Artikel> So vermeiden Sie Cache -Rennbedingungen mithilfe der APCU_CAS -Funktion

So vermeiden Sie Cache -Rennbedingungen mithilfe der APCU_CAS -Funktion

gitbox 2025-05-29

Was sind Cache -Rennbedingungen?

Wenn mehrere Prozesse oder Threads versuchen, gleichzeitig Cache -Missen zu lesen und in Cache zu schreiben, können mehrere Prozesse gleichzeitig dieselbe langsame Abfrage oder komplexe Berechnungen ausführen, was zu Ressourcenverschwendung führt. Diese Situation wird als Cache -Rennbedingung bezeichnet.

Zum Beispiel:

 if (!apcu_exists('my_cache_key')) {
    $data = get_data_from_db(); // Komplexe Abfrage
    apcu_store('my_cache_key', $data);
}
echo apcu_fetch('my_cache_key');

In einer Umgebung mit hoher Genauigkeit stellen mehrere Anfragen fest, dass der Cache nicht gleichzeitig vorhanden ist und Datenbankabfragen gleichzeitig ausgeführt werden, was zu Leistungsproblemen führt.


Einführung in die Funktion apcu_cas

Der vollständige Name von apcu_cas lautet "Vergleiche und Swap". Dies ist eine atomare Operation, mit der verglichen wird, ob der zwischengespeicherte Wert dem erwarteten Wert entspricht und wenn er gleich ist, wird er durch einen neuen Wert ersetzt. Dieser Vorgang kann das durch mehrere Anfragen verursachte Wettbewerbsprobleme vermeiden, um den Cache gleichzeitig zu ändern.

Funktionsprototyp:

 bool apcu_cas(string $key, mixed $old, mixed $new)
  • $ Key : Cache -Schlüssel

  • $ Old : Der erwartete alte Wert

  • $ new : Der neue Wert ersetzt werden

  • Rückgabe true bedeutet, dass der Ersatz erfolgreich ist. Falsch bedeutet, dass der alte Wert nicht übereinstimmt und der Ersatz fehlgeschlagen ist.


Wie benutze ich apcu_cas, um Rassenbedingungen zu vermeiden?

Wir implementieren MUTEX Access Cache, indem wir ein "Sperren" -Flag einstellen. Spezifische Ideen:

  1. Lesen Sie Cache und kehren Sie direkt zurück, wenn er existiert.

  2. Wenn der Cache nicht vorhanden ist, stellen Sie versuchen, ein "Sperren" -Flag einzustellen, um anzuzeigen, dass der Cache generiert wird.

  3. Das Einstellen der "Sperre" fehlgeschlagen und zeigt an, dass andere Prozesse bereits Cache generieren, warten oder erneut versuchen.

  4. Führen Sie nach erfolgreicher Einstellung eine langsame Abfrage aus, um Daten zu generieren.

  5. Schreiben Sie Daten in den Cache und geben Sie das "Sperren" -Flag.

  6. Daten zurückgeben.


Beispielcode Demonstration

 function getCacheData() {
    $cacheKey = 'my_cache_key';
    $lockKey = 'my_cache_key_lock';

    // 1. Versuchen Sie zuerst, den Cache zu lesen
    $data = apcu_fetch($cacheKey, $success);
    if ($success) {
        return $data;
    }

    // 2. Versuchen Sie zu bestehenapcu_casSchloss einstellen,Verhindern, dass mehrere Anfragen gleichzeitig Caches generieren
    // 先尝试Schloss einstellen标志位为false(Anfangsstatus)
    apcu_add($lockKey, false);

    // Erwartete Schloss istfalse,Versuchen Sie zu wechselntrue(Sperren)
    if (!apcu_cas($lockKey, false, true)) {
        // Zeigt an, dass andere Anfragen gesperrt wurden,Warten Sie auf die Cache -Generation
        // Kann einfach seinsleepOder in einer Schleife warten
        usleep(100000); // Warten100Millisekunde
        return getCacheData(); // Versuchen Sie es rekursiv
    }

    // 3. Das Schloss erhalten,Langsame Anfragen ausführen
    $data = get_data_from_db();

    // 4. Schreiben Sie Cache
    apcu_store($cacheKey, $data);

    // 5. Lösen Sie das Schloss(Schloss einstellen为false)
    apcu_store($lockKey, false);

    return $data;
}

function get_data_from_db() {
    // Simuliere langsame Abfrage
    sleep(1);
    return ['time' => time(), 'data' => 'sample'];
}

Im obigen Code sorgt APCU_CAS sicher, dass die Atomwechsel von "Sperre" die Anfragen vermeidet, um langsame Abfragen gleichzeitig auszuführen, und vermeidet den Cache -Wettbewerb.


Zusammenfassung

  • Rassenbedingungen zwischen den Rassenbedingungen sind ein häufiges Problem in hohen Parallelitätsszenarien.

  • APCU_CAS ist ein leistungsstarkes Instrument zur Implementierung von Atomoperationen und kann einen effizienten Verriegelungsmechanismus realisieren.

  • Durch den "Sperren" -Mechanismus wird sichergestellt, dass nur eine Anfrage langsame Abfragen ausführen und Cache schreiben kann, und andere Anfragen können warten oder es erneut versuchen.

  • Diese Methode ist für APCU-Cache in eigenständigen Umgebungen geeignet, und komplexere Verriegelungslösungen können in verteilten Umgebungen berücksichtigt werden.

Durch das Beherrschen der Verwendung von APCU_CAs können Sie Ihren PHP -Cache -Mechanismus robuster und effizienter machen und die durch Cache -Aufschlüsselung verursachten Leistung Engpässe erheblich vermeiden.


<Code> <? PHP -Funktion getCachedata () {$ cachekey = 'my_cache_key'; $ lockkey = 'my_cache_key_lock';
 $data = apcu_fetch($cacheKey, $success);
if ($success) {
    return $data;
}

apcu_add($lockKey, false);

if (!apcu_cas($lockKey, false, true)) {
    usleep(100000);
    return getCacheData();
}

$data = get_data_from_db();

apcu_store($cacheKey, $data);

apcu_store($lockKey, false);

return $data;

}

Funktion get_data_from_db () {
Schlaf (1);
return ['time' => time (), 'data' => 'sample'];
}
?>
</code>