suchen
HeimDatenbankRedisSo lösen Sie das Redis-Cache-Lawinenproblem

Die Cache-Schicht überträgt eine große Anzahl von Anforderungen und schützt so die Speicherschicht effektiv. Wenn jedoch aufgrund einer großen Anzahl von Cache-Ausfällen eine große Anzahl von Anforderungen auf der Speicherschicht eintrifft oder der gesamte Cache keine Dienste bereitstellen kann, erhöht sich die Belastung der Speicherschicht (eine große Anzahl von Anforderungen fragt die Datenbank ab). Dies ist das Szenario einer Cache-Lawine.

Um die Cache-Lawine zu lösen, können Sie von den folgenden Punkten ausgehen:

1 Halten Sie die Cache-Ebene hoch verfügbar.

Verwenden Sie den Redis-Sentry-Modus oder die Redis-Cluster-Bereitstellungsmethode, d. h. individuell Redis-Knoten gehen offline. Die gesamte Cache-Ebene ist weiterhin verfügbar. Darüber hinaus kann Redis in mehreren Computerräumen bereitgestellt werden, sodass die Cache-Schicht auch bei einem Computerraumabsturz weiterhin hochverfügbar ist.

2. Strombegrenzende und herabstufende Komponenten

Sowohl die Cache-Schicht als auch die Speicherschicht weisen eine Fehlerwahrscheinlichkeit auf und können als Ressourcen betrachtet werden. Da es sich um ein verteiltes System mit hoher Parallelität handelt, kann es, wenn eine Ressource nicht verfügbar ist, zu Ausnahmen kommen, wenn alle Threads diese Ressource erhalten, wodurch das gesamte System nicht verfügbar ist. Ein Downgrade ist in Systemen mit hoher Parallelität ganz normal. Wenn beispielsweise bei Empfehlungsdiensten der personalisierte Empfehlungsdienst nicht verfügbar ist, können Sie ein Downgrade durchführen, um die Hotspot-Daten zu ergänzen, sodass nicht der gesamte Empfehlungsdienst nicht verfügbar ist. Zu den gängigen strombegrenzenden Degradationskomponenten gehören Hystrix, Sentinel usw.

3. Der Cache läuft nicht ab

Die in Redis gespeicherten Schlüssel laufen nie ab, sodass es kein Problem gibt, dass eine große Anzahl von Caches gleichzeitig ausfällt, aber dann benötigt Redis mehr Speicherplatz.

4. Optimieren Sie die Cache-Ablaufzeit

Wählen Sie beim Entwerfen des Caches eine geeignete Ablaufzeit für jeden Schlüssel, um zu vermeiden, dass eine große Anzahl von Schlüsseln gleichzeitig ungültig wird und eine Cache-Lawine verursacht.

5. Verwenden Sie die Mutex-Sperre, um den Cache neu zu erstellen.

Um zu vermeiden, dass eine große Anzahl von Anforderungen gleichzeitig die Speicherebene erreicht, um Daten abzufragen und den Cache neu aufzubauen, können Sie die Mutex-Sperrsteuerung verwenden. B. das Abfragen von Daten auf der Cache-Schicht gemäß dem Schlüssel. Wenn die Cache-Schicht erreicht wird, wird der Schlüssel gesperrt, dann werden die Daten von der Speicherschicht abgefragt, die Daten werden in die Cache-Schicht geschrieben und schließlich wird die Sperre aufgehoben . Wenn andere Threads feststellen, dass das Erlangen der Sperre fehlschlägt, lassen Sie den Thread eine Zeit lang ruhen und versuchen Sie es erneut. Was den Sperrtyp betrifft: Wenn Sie sich in einer eigenständigen Umgebung befinden, können Sie Lock unter dem Java-Concurrent-Paket verwenden. Wenn Sie sich in einer verteilten Umgebung befinden, können Sie die verteilte Sperre (SETNX-Methode in Redis) verwenden.

Cache-Pseudocode für die Mutex-Sperre-Rekonstruktion in einer verteilten Umgebung

/**
 * 互斥锁建立缓存
 *
 **/
public String get(String key) {
   // redis中查询key对应的value
   String value = redis.get(key);
   // 缓存未命中
   if (value == null) {
      // 互斥锁
      String key_mutex_lock = "mutex:lock" + key; 
      // 互斥锁加锁成功
      if(redis.setnx(key_mutex_lock,"1")) { // 返回 0(false),1(true)
          try {
              // 设置互斥锁超时时间,这里设置的是锁的失效时间,而不是key的失效时间
              redis.expire(key_mutex_lock,3*60);
              // 从数据库查询
              value = db.get(key);
              // 数据写入缓存
              redis.set(key,value);
            
          } finally {
               // 释放锁
              boolean keyExist = jedis.exists(key_mutex_lock);
              if(keyExist){
                  redis.delete(key_mutex_lock);
               }
      } else { 
              // 加锁失败,线程休息50ms后重试
               Thread.sleep(50);
               return get(key); // 直接返回缓存结果  
     }
   }
}

Verwendung einer verteilten Redis-Sperre zur Implementierung der Cache-Rekonstruktion in einer verteilten Umgebung. Der Vorteil besteht darin, dass die Designidee einfach ist und die Datenkonsistenz gewährleistet ist , und es kann dazu führen, dass der Benutzer wartet. Gehen Sie davon aus, dass bei hoher Parallelität der Schlüssel während der Cache-Rekonstruktion gesperrt ist. Wenn derzeit 1.000 gleichzeitige Anforderungen vorliegen, werden 999 davon blockiert, was dazu führt, dass 999 Benutzeranforderungen blockiert werden und warten.

6. Asynchrone Cache-Rekonstruktion

Bei diesem Schema wird der Cache mithilfe einer asynchronen Strategie erstellt. Threads werden aus dem Thread-Pool abgerufen, sodass nicht alle Anforderungen direkt die Speicherschicht erreichen Dieses Schema bedeutet eine logische Zeitüberschreitung bei der Schlüsselwartung. Wenn die logische Zeitüberschreitung unter der aktuellen Zeit liegt, bedeutet dies, dass der aktuelle Cache abgelaufen ist und der Cache aktualisiert werden sollte wird direkt zurückgegeben. In Redis ist beispielsweise die Ablaufzeit des Schlüssels auf 60 Minuten und die logische Ablaufzeit im entsprechenden Wert auf 30 Minuten festgelegt. Auf diese Weise kann der Cache dieses Schlüssels asynchron aktualisiert werden, wenn der Schlüssel die logische Ablaufzeit von 30 Minuten erreicht. Während des Aktualisierungszeitraums des Caches ist der alte Cache jedoch weiterhin verfügbar. Diese asynchrone Cache-Rekonstruktionsmethode kann wirksam verhindern, dass eine große Anzahl von Schlüsseln gleichzeitig ungültig wird.

/**
  *  异步重建缓存: ValueObject为对应的封装的实体模型
  *
  **/
public String get(String key) {
    // 重缓存中查询key对应的ValueObject对象
    ValueObject valueObject = redis.get(key);
    // 获取存储中对应的value值
    String value = valueObject.getValue();
    // 获取实体模型中的缓存过期的时间:timeOut = 设置缓存时的当前时间+过期时间(如30秒,60秒等等)
    long logicTimeOut = valueObject.getTimeOut();  // 等位换算为long类型
    // 当前可以在逻辑上失效
    if (logicTimeOut <= System.currentTimeMillis()) {
         // 异步更新缓存
         threadPool.execute(new Runnable() {
             String key_mutex_lock = "mutex_lock" + key;
              // 互斥锁加锁成功
      if(redis.setnx(key_mutex_lock,"1")) { // 返回 0(false),1(true)
          try {
              // 设置互斥锁超时时间,这里设置的是锁的失效时间,而不是key的失效时间
              redis.expire(key_mutex_lock,3*60);
              // 从数据库查询
              dbValue = db.get(key);
              // 数据写入缓存
              redis.set(key,dbValue);
            
          } finally {
              // 释放锁
              boolean keyExist = jedis.exists(key_mutex_lock);
              if(keyExist){
                  redis.delete(key_mutex_lock);
               }
             
         }
      } else { 
             
              
             }
             
         
         });
       return value; // 直接返回缓存结果  
    }
}

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Redis-Cache-Lawinenproblem. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Dieser Artikel ist reproduziert unter:亿速云. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Redis: Die Vorteile eines NoSQL -AnsatzesRedis: Die Vorteile eines NoSQL -AnsatzesApr 27, 2025 am 12:09 AM

Redis ist eine NoSQL -Datenbank, die eine hohe Leistung und Flexibilität bietet. 1) Speichern Sie Daten über Schlüsselwertpaare, die für die Verarbeitung großer Daten und hoher Parallelität geeignet sind. 2) Speicherspeicher- und Single-Thread-Modelle sorgen für schnelles Lesen und Schreiben und Atomizität. 3) Verwenden Sie RDB- und AOF-Mechanismen, um Daten zu bestehen, wodurch hohe Verfügbarkeit und Skalierung unterstützt werden.

Redis: Verständnis seiner Architektur und des ZwecksRedis: Verständnis seiner Architektur und des ZwecksApr 26, 2025 am 12:11 AM

Redis ist ein Speichersystem für Speicherdatenstruktur, das hauptsächlich als Datenbank, Cache und Message Broker verwendet wird. Zu den Kernmerkmalen gehören ein Einzel-Thread-Modell, E/A-Multiplexing, Persistenzmechanismus, Replikations- und Clustering-Funktionen. Redis wird üblicherweise in praktischen Anwendungen für Caching-, Sitzungsspeicher- und Nachrichtenwarteschlangen verwendet. Es kann seine Leistung erheblich verbessern, indem die richtige Datenstruktur ausgewählt, Pipelines und Transaktionen verwendet und überwacht und stimmt.

Redis vs. SQL -Datenbanken: SchlüsselunterschiedeRedis vs. SQL -Datenbanken: SchlüsselunterschiedeApr 25, 2025 am 12:02 AM

Der Hauptunterschied zwischen Redis- und SQL-Datenbanken besteht darin, dass Redis eine In-Memory-Datenbank ist, die für hohe Leistung und Flexibilitätsanforderungen geeignet ist. Die SQL -Datenbank ist eine relationale Datenbank, die für komplexe Abfragen und Datenkonsistenzanforderungen geeignet ist. Insbesondere 1) REDIS bietet Hochgeschwindigkeits-Datenzugriffs- und Caching-Dienste und unterstützt mehrere Datentypen, die für die Verarbeitung von Caching und Echtzeit geeignet sind. 2) Die SQL-Datenbank verwaltet Daten über eine Tabellenstruktur, unterstützt komplexe Abfragen und Transaktionsverarbeitung und eignet sich für Szenarien wie E-Commerce- und Finanzsysteme, die Datenkonsistenz erfordern.

Redis: Wie es als Datenspeicher und Dienst fungiertRedis: Wie es als Datenspeicher und Dienst fungiertApr 24, 2025 am 12:08 AM

RedisactsasbothadatastoreandService.1) Asadatastore, itusesin-MemoryStorageForfastoperationen, unterstützende Variiousdatastructures Likekey-Valuepairs und sortierte Sets.2) Asasservice, ItprovidesFunctionalitys Likespub/SubMessing-SetsandluascriptingForComplexoperationen

Redis gegen andere Datenbanken: Eine vergleichende AnalyseRedis gegen andere Datenbanken: Eine vergleichende AnalyseApr 23, 2025 am 12:16 AM

Im Vergleich zu anderen Datenbanken hat Redis die folgenden einzigartigen Vorteile: 1) extrem schnelle Geschwindigkeit, und Lese- und Schreibvorgänge befinden sich normalerweise auf Mikrosekunde; 2) unterstützt reichhaltige Datenstrukturen und Operationen; 3) Flexible Nutzungsszenarien wie Caches, Zähler und Veröffentlichung von Abonnements. Bei der Auswahl von Redis oder anderen Datenbanken hängt dies von den spezifischen Anforderungen und Szenarien ab. Redis spielt eine gute Leistung in leistungsstarken und niedrigen Latenzanwendungen.

Redis 'Rolle: Erforschung der Datenspeicher- und VerwaltungsfunktionenRedis 'Rolle: Erforschung der Datenspeicher- und VerwaltungsfunktionenApr 22, 2025 am 12:10 AM

Redis spielt eine Schlüsselrolle bei der Datenspeicherung und -verwaltung und ist durch seine mehreren Datenstrukturen und Persistenzmechanismen zum Kern moderner Anwendungen geworden. 1) Redis unterstützt Datenstrukturen wie Zeichenfolgen, Listen, Sammlungen, geordnete Sammlungen und Hash -Tabellen und eignet sich für Cache und komplexe Geschäftslogik. 2) RDB und AOF sorgt durch zwei Persistenzmethoden für eine zuverlässige Speicherung und eine schnelle Wiederherstellung von Daten.

Redis: NoSQL -Konzepte verstehenRedis: NoSQL -Konzepte verstehenApr 21, 2025 am 12:04 AM

Redis ist eine NoSQL-Datenbank, die für einen effizienten Speicher und Zugriff auf groß angelegte Daten geeignet ist. 1.Redis ist ein Open Source -Speicherdatenstruktur -Speichersystem, das mehrere Datenstrukturen unterstützt. 2. Es bietet extrem schnelle Lektüre und Schreibgeschwindigkeiten, geeignet für Caching, Sitzungsmanagement usw. 3.Redis unterstützt die Persistenz und sorgt für die Datensicherheit durch RDB und AOF. 4. Verwendungsbeispiele umfassen grundlegende Schlüsselwertpaarvorgänge und erweiterte Sammeldeduplizierungsfunktionen. 5. Zu den häufigen Fehlern gehören Verbindungsprobleme, Datentypfehlanpassungen und Speicherüberlauf, sodass Sie auf das Debuggen achten müssen. 6. Vorschläge zur Leistungsoptimierung umfassen die Auswahl der geeigneten Datenstruktur und die Einrichtung von Strategien zur Speicherung der Speicherung.

Redis: Anwendungsfälle und Beispiele in realer WeltRedis: Anwendungsfälle und Beispiele in realer WeltApr 20, 2025 am 12:06 AM

Zu den Anwendungen von Redis in der realen Welt gehören: 1. Als Cache-System beschleunigen Sie die Datenbankabfrage, 2. Um die Sitzungsdaten von Webanwendungen zu speichern, um in Echtzeit-Rankings zu implementieren, 4. Um die Nachrichtenzustellung als Nachrichtenwarteschlange zu vereinfachen. Redis 'Vielseitigkeit und hohe Leistung lassen es in diesen Szenarien glänzen.

See all articles

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

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Sicherer Prüfungsbrowser

Sicherer Prüfungsbrowser

Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

Dreamweaver Mac

Dreamweaver Mac

Visuelle Webentwicklungstools

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools

EditPlus chinesische Crack-Version

EditPlus chinesische Crack-Version

Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

mPDF

mPDF

mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),