IMHO, funkcjonalne programowanie reaktywne (FRP) jest w pewnym sensie ogólnym sposobem rozwiązania problemu unieważnienia pamięci podręcznej.
Oto dlaczego: nieaktualne dane w terminologii FRP nazywane są usterką . Jednym z celów FRP jest zagwarantowanie braku usterek.
FRP jest wyjaśnione bardziej szczegółowo w tym wykładzie „Essence of FRP” oraz w tej odpowiedzi SO .
W rozmowie z Cell
s stanowią buforowane Object / podmiot i Cell
jest odświeżany jeśli jeden jest to zależność jest odświeżany.
FRP ukrywa kod hydrauliczny powiązany z wykresem zależności i zapewnia, że nie ma nieaktualnych plików Cell
.
Innym sposobem (innym niż FRP), który przychodzi mi do głowy, jest zawijanie obliczonej wartości (typu b
) do pewnego rodzaju pisarza Monad, w Writer (Set (uuid)) b
którym Set (uuid)
(notacja Haskell) zawiera wszystkie identyfikatory zmiennych wartości, od których b
zależy obliczona wartość . Tak więc uuid
jest to jakiś unikalny identyfikator, który identyfikuje zmienną wartość / zmienną (powiedzmy wiersz w bazie danych), od której b
zależy obliczenie .
Połącz ten pomysł z kombinatorami, które działają na tego rodzaju pisarzu Monad, a to może prowadzić do pewnego rodzaju ogólnego rozwiązania do unieważniania pamięci podręcznej, jeśli użyjesz tych kombinatorów tylko do obliczenia nowego b
. Takie kombinatory (powiedzmy specjalna wersja filter
) przyjmują monady i (uuid, a)
-s Writer'a jako dane wejściowe, gdzie a
są zmiennymi danymi / zmiennymi, identyfikowanymi przez uuid
.
Tak więc za każdym razem, gdy zmieniasz "oryginalne" dane (uuid, a)
(powiedzmy znormalizowane dane w bazie danych, z której b
została obliczona), od której b
zależy obliczona wartość typu , możesz unieważnić pamięć podręczną, która zawiera, b
jeśli zmienisz jakąkolwiek wartość, a
od której b
zależy obliczona wartość , ponieważ na podstawie Set (uuid)
Monady Writer możesz powiedzieć, kiedy to się stanie.
Więc za każdym razem, gdy mutujesz coś z danym uuid
, transmitujesz tę mutację do wszystkich pamięci podręcznych i unieważniają one wartości, b
które zależą od wartości mutowalnej identyfikowanej za pomocą said, uuid
ponieważ monada Writer, w której b
jest zapakowana, może stwierdzić, czy b
zależy to od said, uuid
czy nie.
Oczywiście opłaca się to tylko wtedy, gdy czytasz znacznie częściej niż piszesz.
Trzecim, praktycznym podejściem jest użycie zmaterializowanych widoków w bazach danych i wykorzystanie ich jako pamięci podręcznych. AFAIK mają również na celu rozwiązanie problemu unieważnienia. To oczywiście ogranicza operacje, które łączą zmienne dane z danymi pochodnymi.