IMHO, Functional Reactive Programming (FRP) è in un certo senso un modo generale per risolvere l'invalidazione della cache.
Ecco perché: i dati obsoleti nella terminologia FRP sono chiamati glitch . Uno degli obiettivi di FRP è garantire l'assenza di difetti.
FRP è spiegato più dettagliatamente in questo discorso "Essence of FRP" e in questa risposta SO .
Nel discorso le Cell
s rappresentano un Oggetto / Entità memorizzato nella cache e un Cell
viene aggiornato se una delle sue dipendenze viene aggiornata.
FRP nasconde il codice idraulico associato al grafico delle dipendenze e si assicura che non ci siano messaggi obsoleti Cell
.
Un altro modo (diverso da FRP) a cui posso pensare è avvolgere il valore calcolato (di tipo b
) in una sorta di Monade di scrittore in Writer (Set (uuid)) b
cui Set (uuid)
(notazione Haskell) contiene tutti gli identificatori dei valori mutabili da cui b
dipende il valore calcolato . Quindi, uuid
è una sorta di identificatore univoco che identifica il valore / variabile modificabile (ad esempio una riga in un database) da cui b
dipende il calcolo .
Combina questa idea con combinatori che operano su questo tipo di writer Monad e ciò potrebbe portare a una sorta di soluzione generale di invalidazione della cache se usi questi combinatori solo per calcolare un nuovo b
. Tali combinatori (diciamo una versione speciale di filter
) prendono le monadi e (uuid, a)
-s di Writer come input, dove a
è un dato / variabile mutabile, identificato da uuid
.
Quindi ogni volta che modifichi i dati "originali" (uuid, a)
(ad esempio i dati normalizzati in un database da cui è b
stato calcolato) da cui b
dipende il valore calcolato di tipo , puoi invalidare la cache che contiene b
se muti qualsiasi valore a
da cui b
dipende il valore calcolato , perché in base Set (uuid)
a Writer Monad puoi dire quando questo accade.
Quindi ogni volta che muti qualcosa con un dato uuid
, trasmetti questa mutazione a tutti i cache e questi invalidano i valori b
che dipendono dal valore mutabile identificato con detto uuid
perché la monade dello scrittore in cui b
è avvolto può dire se ciò b
dipende da detto uuid
o non.
Naturalmente, questo ripaga solo se leggi molto più spesso di quanto scrivi.
Un terzo approccio pratico consiste nell'utilizzare le visualizzazioni materializzate nei database e utilizzarle come cache. AFAIK mirano anche a risolvere il problema dell'invalidazione. Questo ovviamente limita le operazioni che collegano i dati mutabili ai dati derivati.