Heim  >  Artikel  >  Datenbank  >  So beheben Sie den Redis-Fehler

So beheben Sie den Redis-Fehler

(*-*)浩
(*-*)浩Original
2019-11-22 11:40:093226Durchsuche

So beheben Sie den Redis-Fehler

Aufschlüsselung: bezieht sich auf einen einzelnen Schlüssel, der nicht im Cache gefunden werden kann, also wenn die Datenmenge nicht groß ist oder Die Parallelität ist nicht groß, es wird kein Problem geben.

Wenn das Datenbankdatenvolumen groß ist und die Parallelität hoch ist, kann dies dazu führen, dass die Datenbank aufgrund übermäßigen Drucks zusammenbricht

Hinweis: Dies bezieht sich auf Hohe Parallelität tritt auf einem einzigen Schlüssel auf!!! (Empfohlenes Lernen: Redis-Video-Tutorial)

Lösung:

1) Durch synchronisiert+doppelt Prüfmechanismus: Ein bestimmter Schlüssel ermöglicht nur die Abfrage eines Threads und blockiert andere Threads.

Beurteilen und prüfen Sie im Synchronisationsblock weiterhin, um sicherzustellen, dass er nicht vorhanden ist, bevor Sie die Datenbank überprüfen.

Zum Beispiel:

 private static volaite Object lockHelp=new Object();
   public String getValue(String key){
     String value=redis.get(key,String.class);
     if(value=="null"||value==null||StringUtils.isBlank(value){
         synchronized(lockHelp){
                value=redis.get(key,String.class);
                 if(value=="null"||value==null||StringUtils.isBlank(value){
                      value=db.query(key);
                      redis.set(key,value,1000);
                  }
            }
           }    
        return value;
   }

Nachteile: blockiert andere Threads

2 ) Festlegen, dass der Wert niemals abläuft

Diese Methode gilt als die zuverlässigste und sicherste, nimmt jedoch Platz ein, verbraucht viel Speicher und kann die Daten nicht aufrechterhalten Dies muss auf einer bestimmten Geschäftslogik basieren:

Wenn Sie die Daten auf dem neuesten Stand halten möchten, versuchen Sie dies nur als Referenz:

Starten Sie eine geplante Aufgabe oder verwenden Sie TimerTask Timing. Diese Werte werden in jedem Zeitraum abgefragt und im Cache aktualisiert. Voraussetzung ist natürlich, dass dadurch die Datenbank nicht übermäßig belastet wird (das ist sehr wichtig)

3) Verwenden Sie die gegenseitige Ausschlusssperre (Mutex-Schlüssel)

Ein in der Branche üblicher Ansatz ist die Verwendung von Mutex . Einfach ausgedrückt: Wenn der Cache fehlschlägt (der herausgenommene Wert wird als leer beurteilt), verwenden Sie, anstatt die Datenbank sofort zu laden, zunächst einige Vorgänge des Cache-Tools mit einem erfolgreichen Vorgangsrückgabewert (z. B. SETNX oder Memcache von Redis). ADD), um einen Mutex-Schlüssel festzulegen. Wenn der Vorgang erfolgreich zurückgegeben wird, wird der Vorgang zum Laden der Datenbank ausgeführt und der Cache wiederhergestellt. Andernfalls wird die gesamte Get-Cache-Methode erneut versucht.

SETNX ist die Abkürzung für „SET if Not eXists“, was bedeutet, dass es nur dann gesetzt wird, wenn es nicht existiert. Sie können es verwenden, um den Sperreffekt zu erzielen. Die Ablaufzeit von setnx war in Versionen vor redis2.6.1 nicht implementiert, daher finden Sie hier zwei Versionscode-Referenzen:

public String get(key) {
      String value = redis.get(key);
      if (value == null) { //代表缓存值过期
          //设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load db
          if (redis.setnx(key_mutex, 1, 3 * 60) == 1) {  //代表设置成功
               value = db.get(key);
                      redis.set(key, value, expire_secs);
                      redis.del(key_mutex);

                     return value;
              } else {  //这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可
                      sleep(10);
                      get(key);  //重试
              }
          } else {
              return value;      
          }

}

Weitere technische Artikel zu Redis finden Sie unter Erste Schritte-Tutorial zur Verwendung der Redis-Datenbank Kolumne zum Lernen!

Das obige ist der detaillierte Inhalt vonSo beheben Sie den Redis-Fehler. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn