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 Cells rappresentano un Oggetto / Entità memorizzato nella cache e un Cellviene 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)) bcui Set (uuid)(notazione Haskell) contiene tutti gli identificatori dei valori mutabili da cui bdipende 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 bdipende 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 è bstato calcolato) da cui bdipende il valore calcolato di tipo , puoi invalidare la cache che contiene bse muti qualsiasi valore ada cui bdipende 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 bche dipendono dal valore mutabile identificato con detto uuidperché la monade dello scrittore in cui bè avvolto può dire se ciò bdipende da detto uuido 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.