À 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 Cells représentent un objet / une entité mis en cache et un Cellest 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 Cells 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)) boù Set (uuid)(notation Haskell) contient tous les identificateurs des valeurs mutables dont bdépend la valeur calculée . Donc, uuidest une sorte d'identifiant unique qui identifie la valeur / variable mutable (par exemple une ligne dans une base de données) dont bdé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ù aest 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 bla valeur calculée de type, bvous pouvez invalider le cache qui contient bsi vous modifiez une valeur adont bdé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 bqui dépendent de la valeur mutable identifiée avec said uuidcar la monade Writer dans laquelle le best enveloppé peut dire si cela bdépend de dit uuidou 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.