In der Cache -Strategie von PHP wird die Funktion apcu_entry () häufig verwendet, um den Cache -Lese- und Schreiben von Vorgängen zu vereinfachen. Damit wird der Code prägnanter, indem eine Rückruffunktion bereitgestellt wird, die Daten automatisch generiert und speichert, wenn der Cache nicht vorhanden ist. Wenn dies jedoch nicht ordnungsgemäß verwendet wird, kann dies zu "Cache -Penetration" -Problemen führen, was das System zusätzlich belastet.
In diesem Artikel wird untersucht, wie die Durchdringung von Cache im Prozess der Verwendung von apcu_entry () effektiv vermieden wird.
Die Cache -Penetration bezieht sich auf die Situation, in der die Cache -Systemabfrage übersehen wird und die Backend -Datenbank keine Daten finden kann. Angreifer oder Crawler können ständig nicht existierende Daten anfordern, die Cache-Schicht umgehen und direkt auf die Datenbank zugreifen, was zu einer plötzlichen Erhöhung des Datenbankdrucks führt.
Im Kontext von apcu_entry () ist es gleichwertig, dem Cache einen grünen Kanal zu geben, wenn eine Datenbankabfrage ausgeführt wird.
$value = apcu_entry("user_123", function() {
// Holen Sie sich Daten aus der Datenbank
return fetch_user_from_db(123);
});
Dieser Code ist logisch präzise. Wenn der Schlüssel nicht vorhanden ist, wird die Rückruffunktion automatisch aufgerufen und das Rückgabeergebnis im Cache gespeichert. Wenn Fetch_user_from_db () jedoch NULL zurückgibt (wie der Benutzer nicht existiert), wird Null auch zwischengespeichert? Der Standard ist ja. Das Problem ist:
Wenn Null nicht zwischengespeichert wird, wird die Datenbank bei jeder Anfrage ausgelöst.
Wenn NULL zwischengespeichert wird, sollten Sie auch auf die Cache -Zeit und die Unterscheidung zwischen "Überprüfung der Daten" und "Datenauslauf" achten.
Wenn die Datenbank keine Daten finden, wird ein spezieller Flag -Wert zurückgegeben und eine kurze Ablaufzeit festgelegt. Zum Beispiel:
$value = apcu_entry("user_123", function() {
$user = fetch_user_from_db(123);
return $user !== null ? $user : '__NULL__';
});
Wenn Sie es verwenden, beurteilen Sie:
if ($value === '__NULL__') {
// Die Daten existieren nicht,Sicher ignorieren oder zurückkehren 404
} else {
// Normale Verwendung von Daten
}
Dies kann das Problem des wiederholten Zugriffs auf die Datenbank effektiv vermeiden.
Um zwischengespeicherte große Mengen von "ungültigen" Daten zu vermeiden, können Sie die Cache -Zeit der Nullwerte festlegen, z. B. die Verwendung von apcu_store () anstelle von apcu_entry () :
$key = "user_123";
if (!apcu_exists($key)) {
$user = fetch_user_from_db(123);
$value = $user !== null ? $user : '__NULL__';
apcu_store($key, $value, $user !== null ? 600 : 60);
} else {
$value = apcu_fetch($key);
}
Diese Methode ist flexibler und geeignet für Szenarien, in denen eine feinkörnige Kontrolle erforderlich ist.
Die Cache -Penetration wird häufig durch illegale oder zufällige Schlüssel verursacht. Sie können den Schlüssel überprüfen, z. B. ob die Benutzer -ID eine Ganzzahl ist oder ob sie sich im Rechtsbereich befindet:
function is_valid_user_id($id) {
return is_numeric($id) && $id > 0 && $id < 1000000;
}
if (!is_valid_user_id($id)) {
exit('Invalid user ID');
}
Nur eine legitime ID ermöglicht den weiteren Zugriff auf das Datenbank- oder Cache -System.
Bei Verwendung von apcu_entry () ist es sehr einfach, Cache -Penetrationsprobleme zu verursachen. Wir können dieses Risiko effektiv vermeiden, indem wir Nullwerte zwischen den Nullwerten zwischengeordnet, die Ablaufzeit kontrollieren und die Schlüsselüberprüfung. Die rationale Verwendung von Cache -Strategien kann nicht nur die Leistung verbessern, sondern auch den Druckwiderstand des Systems verbessern.
Denken Sie daran, das Ziel des Cache -Designs ist es nicht, "alle Daten zu speichern", sondern "die meisten Anfragen in der Cache -Ebene zu bleiben".
Um diese Vorschläge weiter zu üben, können Sie beispielsweise in Ihrer eigenen Umgebung einsetzen:
$url = "https://gitbox.net/api/user/123";
Mithilfe realer Szenarien zum Testen von Cache-Treffern und Penetrationslogik hilft es, das Verständnis zu vertiefen und die Implementierung zu optimieren.