IMHO, Functional Reactive Programming (FRP) ist in gewissem Sinne eine allgemeine Methode zur Lösung der Cache-Ungültigkeit.
Hier ist der Grund: Veraltete Daten in der FRP-Terminologie werden als Panne bezeichnet . Eines der Ziele von FRP ist es, das Fehlen von Störungen zu gewährleisten.
FRP wird in diesem 'Essence of FRP'-Vortrag und in dieser SO-Antwort ausführlicher erläutert .
Im Vortrag stellen die Cell
s ein zwischengespeichertes Objekt / eine zwischengespeicherte Entität dar und a Cell
wird aktualisiert, wenn eine ihrer Abhängigkeiten aktualisiert wird.
FRP verbirgt den mit dem Abhängigkeitsdiagramm verknüpften Installationscode und stellt sicher, dass keine veralteten Cell
s vorhanden sind.
Eine andere Möglichkeit (anders als FRP), die ich mir vorstellen kann, besteht darin, den berechneten Wert (vom Typ b
) in eine Art Schreibmonade zu verpacken, Writer (Set (uuid)) b
in der Set (uuid)
(Haskell-Notation) alle Bezeichner der veränderlichen Werte enthält, von denen der berechnete Wert b
abhängt. Es handelt sich also uuid
um eine Art eindeutigen Bezeichner, der den veränderlichen Wert / die veränderbare Variable (z. B. eine Zeile in einer Datenbank) identifiziert, von der der berechnete Wert b
abhängt.
Kombinieren Sie diese Idee mit Kombinatoren, die mit dieser Art von Writer-Monade arbeiten und die zu einer allgemeinen Lösung für die Ungültigmachung des Caches führen können, wenn Sie diese Kombinatoren nur zur Berechnung einer neuen verwenden b
. Solche Kombinatoren (z. B. eine spezielle Version von filter
) verwenden Writer-Monaden und (uuid, a)
-s als Eingaben, wobei a
es sich um veränderbare Daten / Variablen handelt, die durch gekennzeichnet sind uuid
.
Jedes Mal, wenn Sie die "ursprünglichen" Daten (uuid, a)
(z. B. die normalisierten Daten in einer Datenbank, aus der b
berechnet wurde) ändern, von denen der berechnete Wert vom Typ b
abhängt, können Sie den enthaltenen Cache ungültig machen, b
wenn Sie einen Wert mutieren, a
von dem der berechnete b
Wert abhängt , weil anhand der Set (uuid)
in der Writer-Monade können Sie erkennen, wann dies geschieht.
Jedes Mal, wenn Sie etwas mit einem bestimmten Wert mutieren uuid
, senden Sie diese Mutation an alle Cache-s, und sie machen die Werte ungültig, die b
von dem mit dem genannten veränderlichen Wert abhängen, uuid
da die Writer-Monade, in die der Wert eingeschlossen ist, erkennen b
kann, ob dies b
vom uuid
oder abhängt nicht.
Das zahlt sich natürlich nur aus, wenn Sie viel öfter lesen als schreiben.
Ein dritter praktischer Ansatz besteht darin, materialisierte Ansichten in Datenbanken zu verwenden und sie als Cache zu verwenden. AFAIK zielen sie auch darauf ab, das Invalidierungsproblem zu lösen. Dies begrenzt natürlich die Operationen, die die veränderlichen Daten mit den abgeleiteten Daten verbinden.