Cache-Konsistenz bei der Verwendung von memcached und einem rdbms wie MySQL

9

Ich habe in diesem Semester einen Datenbankkurs belegt und wir untersuchen, wie die Cache-Konsistenz zwischen dem RDBMS und einem Cache-Server wie memcached aufrechterhalten werden kann. Die Konsistenzprobleme treten auf, wenn es Rennbedingungen gibt. Zum Beispiel:

  1. Angenommen, ich mache eine get(key) aus dem Cache und es gibt einen Cache-Fehler. Da ich einen Cache-Fehltreffer bekomme, hole ich die Daten aus der Datenbank und führe dann einen put(key,value) in den Cache.
  2. Aber es könnte eine Race-Bedingung auftreten, bei der ein anderer Benutzer die Daten, die ich aus der Datenbank geholt habe, löschen könnte. Dieses Löschen kann passieren, bevor ich put in den Cache lege.

Daher sollte idealerweise der put im Cache nicht vorkommen, da die Daten länger in der Datenbank vorhanden sind.

Wenn der Cache-Eintrag eine TTL hat, läuft der Eintrag im Cache möglicherweise ab. Dennoch gibt es ein Fenster, in dem die Daten im Cache nicht mit der Datenbank übereinstimmen.

Ich habe nach Artikeln / Forschungsartikeln gesucht, die über diese Art von Problemen sprechen. Aber ich konnte keine nützlichen Ressourcen finden.

    
coder 18.10.2011, 05:26
quelle

4 Antworten

0

Wie wäre es mit einer Variablen, die in Memcache als Sperrsignal gespeichert wird?

Jeder einzelne Memcache-Befehl ist atomar

Nachdem Sie Daten aus db abgerufen haben, aktivieren Sie die Sperre für

Nachdem Sie Daten in Memcache eingegeben haben, schalten Sie die Sperre aus

vor dem Löschen aus db, überprüfen Sie den Sperrstatus

    
horsley 27.03.2013 02:10
quelle
0

Dieser Artikel gibt Ihnen einen interessanten Hinweis darüber, wie Facebook versucht, die Cache-Konsistenz beizubehalten: Ссылка

Hier ist ein Kern aus dem Artikel.

  1. Ich aktualisiere meinen Vornamen von "Jason" zu "Monkey"
  2. Wir schreiben "Monkey" in die Master-Datenbank in Kalifornien und löschen meinen Vornamen aus Memcache in Kalifornien, aber nicht in Virginia
  3. Jemand geht zu meinem Profil in Virginia
  4. Wir finden meinen Vornamen in memcache und geben "Jason"
  5. zurück
  6. Die Replikation holt auf und wir aktualisieren die Slave-Datenbank mit meinem Vornamen als "Monkey". Ich lösche auch meinen Vornamen aus Virginia memcache, weil das Cache-Objekt im Replikationsdatenstrom angezeigt wurde
  7. Jemand anderes geht zu meinem Profil in Virginia
  8. Wir finden meinen Vornamen nicht in Memcache, also lesen wir vom Sklaven und bekommen "Monkey"
sharath 08.09.2016 16:38
quelle
0

Der folgende Code gibt eine Vorstellung davon, wie die Operationen add , gets und cas von Memcached verwendet werden, um optimistisches Sperren zu implementieren, um die Konsistenz des Caches mit der Datenbank zu gewährleisten.
Haftungsausschluss: Ich kann nicht garantieren, dass alles korrekt ist und alle Rennbedingungen erfüllt. Auch Konsistenzanforderungen können zwischen Anwendungen variieren.

%Vor%     
Alexey 03.12.2017 19:10
quelle
-1

Wenn Sie lesen, passiert Folgendes:

%Vor%

Beim Schreiben passiert Folgendes:

%Vor%     
Quinton Hsu 29.12.2015 17:39
quelle