IMHO、Functional Reactive Programming(FRP)は、キャッシュの無効化を解決する一般的な方法です。
理由は次のとおりです。FRP用語で古いデータはグリッチと呼ばれます。FRPの目標の1つは、グリッチがないことを保証することです。
FRPについては、この「Essence of FRP」トークとこのSO回答で詳しく説明しています。
では話Cell
Sは、キャッシュされたオブジェクト/エンティティを表し、Cell
それの依存関係のいずれかが更新された場合に更新されます。
FRPは、依存関係グラフに関連付けられた配管コードを非表示にし、古いCell
s がないことを確認します。
私が考えることができる別の方法(FRPとは異なります)は、計算された値が依存する変更可能な値のすべての識別子を(Haskell表記)が含むb
、ある種のライターモナドWriter (Set (uuid)) b
にSet (uuid)
(タイプ)の計算値をラップすることですb
。したがって、uuid
計算がb
依存する変更可能な値/変数(データベースの行など)を識別する、ある種の一意の識別子です。
このアイデアを、この種のライターモナドで動作するコンビネータと組み合わせると、これらのコンビネータを使用して新しいを計算するだけの場合、ある種の一般的なキャッシュ無効化ソリューションにつながる可能性がありますb
。このようなコンビネータ(たとえば、特別なバージョンのfilter
)は、Writerモナドと(uuid, a)
-sを入力として使用a
しuuid
ます。ここで、は、で識別される変更可能なデータ/変数です。
あなたは「オリジナル」のデータを変更するたびだから、(uuid, a)
(そこから、データベースの正規化されたデータと言うb
タイプの計算値がどの計算された)をb
、あなたが含まれているキャッシュを無効にすることができます依存しb
ますが、任意の値突然変異した場合a
、計算されているb
値が依存は、Set (uuid)
Writerモナドに基づいているので、これがいつ発生するかを知ることができます。
与えられたとだから、いつでもあなたのmutate何かuuid
、あなたはすべてのキャッシュ-Sにこの変異をブロードキャストし、彼らが値を無効b
として識別される可変値に依存uuid
するライターモナドので、b
それがあれば言うことができる包まれb
たに依存しuuid
たりしますない。
もちろん、これはあなたが書くよりもはるかに頻繁に読む場合にのみ効果があります。
3番目の実用的なアプローチは、データベースでマテリアライズドビューを使用し、それらをキャッシュとして使用することです。私の知る限り、彼らはまた、無効化の問題を解決することを目指しています。もちろんこれは、可変データを派生データに接続する操作を制限します。