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:
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. 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.
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
Dieser Artikel gibt Ihnen einen interessanten Hinweis darüber, wie Facebook versucht, die Cache-Konsistenz beizubehalten: Ссылка
Hier ist ein Kern aus dem Artikel.
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.
Wenn Sie lesen, passiert Folgendes:
%Vor%Beim Schreiben passiert Folgendes:
%Vor%Tags und Links race-condition distributed-computing caching memcached consistency