IMHO, Функціональне реактивне програмування (FRP) є в певному сенсі загальним способом вирішення недійсного кешу.
Ось чому: несвіжі дані в термінології FRP називаються глюком . Одна з цілей FRP - гарантувати відсутність збоїв.
FRP пояснюється більш докладно в цій розмові «Суть FRP» та в цій відповіді «SO» .
У розмові , що Cell
s є кешированниє Object / Entity і Cell
оновлюється , якщо один з його залежності оновлюється.
FRP приховує код сантехніки, пов'язаний з графіком залежності, і переконує, що немає несвіжих Cell
s.
Іншим способом (відмінним від FRP), про який я можу придумати, є введення обчисленої величини (типу b
) в якусь письменницю Монаду, Writer (Set (uuid)) b
де Set (uuid)
(позначення Haskell) містяться всі ідентифікатори змінних значень, від яких b
залежить обчислене значення . Отже, uuid
це якийсь унікальний ідентифікатор, який ідентифікує змінне значення / змінну (скажімо, рядок у базі даних), від якої b
залежить обчислене .
Поєднайте цю ідею з комбінаторами, які працюють над цим автором Monad, і це може призвести до якогось загального рішення про відключення кешу, якщо ви використовуєте лише ці комбінатори для обчислення нового b
. Такі комбінатори (скажімо, спеціальну версію filter
) приймають монарди та (uuid, a)
-s Writer як вхідні дані, де a
є змінні дані / змінна, ідентифікована uuid
.
Отже, кожного разу, коли ви змінюєте "вихідні" дані (uuid, a)
(скажімо, нормалізовані дані в базі даних, з якої b
було обчислено), від якого b
залежить обчислене значення типу, ви можете визнати недійсним кеш, який міститься, b
якщо змінити будь-яке значення, a
від якого b
залежить обчислене значення. , тому що, виходячи з Set (uuid)
монади Writer Monad, ви можете сказати, коли це станеться.
Отже, щоразу, коли ви щось мутуєте із заданим uuid
, ви транслюєте цю мутацію в усі кеш-пам'ятки, і вони призначають недійсні значення, b
які залежать від значення, що змінюється, ідентифікованого з сказаним, uuid
оскільки монада Writer, в яку b
вкладено, може сказати, чи b
залежить це від сказаного uuid
чи ні.
Звичайно, це окупається, лише якщо ти читаєш набагато частіше, ніж пишеш.
Третій, практичний підхід - використовувати матеріалізовані представлення даних у базах даних та використовувати їх як кеші. AFAIK вони також прагнуть вирішити проблему недійсності. Це, звичайно, обмежує операції, які з'єднують мутаційні дані з отриманими даними.