Heim >Datenbank >MySQL-Tutorial >Was ist die Aktualisierungsstrategie für die Konsistenz von MySQL-Datenbank und Redis-Cache?
1 Wenn Daten in Redis vorhanden sind, müssen diese mit dem Wert in der Datenbank übereinstimmen.
2. Wenn in Redis keine Daten vorhanden sind, muss Redis synchron mit dem neuesten Wert in der Datenbank aktualisiert werden.
2. Asynchrone langsame Schreibstrategie
Wenn eine ungewöhnliche Situation auftritt, muss die fehlgeschlagene Aktion repariert und mit Rabbitmq oder Kafka neu geschrieben werden.
3. Überprüfen Sie die Sperrstrategie noch einmal.
Andere Threads können warten, bis sie die Sperre zu diesem Zeitpunkt nicht mehr erhalten können, darauf warten, dass der erste Thread die Daten abfragt, und sie dann zwischenspeichern.
Der nachfolgende Thread kommt herein und stellt fest, dass bereits ein Cache vorhanden ist, also geht er direkt zum Cache.
public String get(String key){ // 从Redis缓存中读取 String value = redisTemplate.get(key); if(value != null){ return value; } synchronized (RedisTest.class){ // 重新尝试从Redis缓存中读取 value = redisTemplate.get(key); if(value != null){ return value; } // 从MySQL数据库中查询 value = studentDao.get(key); // 写入Redis缓存 redisTemplate.setnx(key,value,time); return value; } }
4. Update-Strategie für Datenbank- und Cache-Konsistenz
Die Datenbank stimmt nicht mit den zwischengespeicherten Daten in Redis überein.
2. Aktualisieren Sie zuerst den Cache und dann die Datenbank.
In Multithread-Situationen treten Probleme auf.
Thread 1 aktualisiert Redis = 200;
Thread 2 aktualisiert Redis = 100;
Thread 1 aktualisiert MySQL = 200;
Das Ergebnis ist: Redis=100, MySQL=200; ich werde es löschen!
Thread 1 löscht die Redis-Cache-Daten und aktualisiert dann die MySQL-Datenbank.
Bevor das MySQL-Update abgeschlossen ist, liest Thread 2 jedoch die Cache-Daten , Dies Zu diesem Zeitpunkt wurde die MySQL-Datenbank nicht aktualisiert, und Thread 2 hat den alten Wert auch als Datencache in Redis geschrieben./** * 延时双删 * @autor 哪吒编程 */ public void deleteRedisData(Student stu){ // 删除Redis中的缓存数据 jedis.del(stu); // 更新MySQL数据库数据 studentDao.update(stu); // 休息两秒 try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } // 删除Redis中的缓存数据 jedis.del(stu); }
2 das Binärprotokoll auf dem Master-Server innerhalb des Zeitintervalls, um zu erkennen, ob es sich geändert hat. Wenn festgestellt wird, dass sich das binäre Ereignisprotokoll des Master-Servers geändert hat, starten Sie einen E/A-Thread, um das Master-Binärereignisprotokoll anzufordern
4 Der Slave-Server speichert das empfangene binäre Ereignisprotokoll in seinem eigenen lokalen Relay Datei;
5. Der Salve-Slave-Server startet den SQL-Thread, um das Binärprotokoll aus dem Relay-Protokoll zu lesen und es lokal wiederzugeben, um seine Daten mit dem Hauptserver in Einklang zu bringen. O-Thread und SQL-Thread gehen in den Ruhezustand und warten auf das nächste Mal, wenn sie aktiviert werden.
Das obige ist der detaillierte Inhalt vonWas ist die Aktualisierungsstrategie für die Konsistenz von MySQL-Datenbank und Redis-Cache?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!