À mon humble avis, la programmation réactive fonctionnelle (FRP) est en un sens un moyen général de résoudre l'invalidation du cache.
Voici pourquoi: les données périmées dans la terminologie FRP sont appelées un problème . L'un des objectifs de FRP est de garantir l'absence de problèmes.
Le PRF est expliqué plus en détail dans cet exposé sur «L'essence du PRF» et dans cette réponse SO .
Dans l' exposé, les Cell
s représentent un objet / une entité mis en cache et un Cell
est actualisé si l'une de ses dépendances est actualisée.
FRP masque le code de plomberie associé au graphe de dépendances et s'assure qu'il n'y a aucun Cell
s périmé .
Une autre façon (différente de FRP) à laquelle je peux penser consiste à envelopper la valeur calculée (de type b
) dans une sorte de Monad d'écrivain Writer (Set (uuid)) b
où Set (uuid)
(notation Haskell) contient tous les identificateurs des valeurs mutables dont b
dépend la valeur calculée . Donc, uuid
est une sorte d'identifiant unique qui identifie la valeur / variable mutable (par exemple une ligne dans une base de données) dont b
dépend le calcul .
Combinez cette idée avec des combinateurs qui fonctionnent sur ce type d'écrivain Monad et qui pourraient conduire à une sorte de solution générale d'invalidation de cache si vous n'utilisez ces combinateurs que pour calculer un nouveau b
. De tels combinateurs (disons une version spéciale de filter
) prennent les monades et (uuid, a)
-s Writer comme entrées, où a
est une donnée / variable mutable, identifiée par uuid
.
Ainsi, chaque fois que vous modifiez les données "originales" (uuid, a)
(disons les données normalisées dans une base de données à partir de laquelle dépend b
la valeur calculée de type, b
vous pouvez invalider le cache qui contient b
si vous modifiez une valeur a
dont b
dépend la valeur calculée , parce que sur la base Set (uuid)
de la Monade Writer, vous pouvez dire quand cela se produit.
Ainsi, chaque fois que vous mute quelque chose avec un donné uuid
, vous diffusez cette mutation à tous les cache-s et ils invalident les valeurs b
qui dépendent de la valeur mutable identifiée avec said uuid
car la monade Writer dans laquelle le b
est enveloppé peut dire si cela b
dépend de dit uuid
ou ne pas.
Bien sûr, cela ne paie que si vous lisez beaucoup plus souvent que vous n'écrivez.
Une troisième approche, pratique, consiste à utiliser des vues matérialisées dans des bases de données et à les utiliser comme cache-s. AFAIK ils visent également à résoudre le problème d'invalidation. Ceci limite bien sûr les opérations qui connectent les données mutables aux données dérivées.