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 Cells stanowią buforowane Object / podmiot i Celljest 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)) bktórym Set (uuid)(notacja Haskell) zawiera wszystkie identyfikatory zmiennych wartości, od których bzależy obliczona wartość . Tak więc uuidjest to jakiś unikalny identyfikator, który identyfikuje zmienną wartość / zmienną (powiedzmy wiersz w bazie danych), od której bzależ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 asą 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 bzostała obliczona), od której bzależy obliczona wartość typu , możesz unieważnić pamięć podręczną, która zawiera, bjeśli zmienisz jakąkolwiek wartość, aod której bzależ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, bktóre zależą od wartości mutowalnej identyfikowanej za pomocą said, uuidponieważ monada Writer, w której bjest zapakowana, może stwierdzić, czy bzależy to od said, uuidczy 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.