[解決済み] キャッシュの無効化 - 一般的な解決策はありますか?
質問
コンピュータサイエンスには、キャッシュの無効化と名前の付け方という2つの難しい問題しかありません。
フィル カールトン
キャッシュを無効にする一般的な解決策や方法はありますか?エントリが古くなったときにそれを知ることで、常に新鮮なデータを得られることが保証されますか?
たとえば、ある関数
getData()
で、ファイルからデータを取得するとします。
これはファイルの最終更新時刻に基づいてデータをキャッシュし、呼び出されるたびにそれをチェックします。
次に、2番目の関数
transformData()
を追加します。この関数はデータを変換し、次にこの関数が呼ばれたときのためにその結果をキャッシュします。 ファイルが変更された場合、このキャッシュは無効になるという依存関係をどのように追加するのでしょうか?
あなたは
getData()
毎回
transformData()
が呼び出されるたびに、キャッシュを構築するために使用された値と比較しますが、これは非常にコストがかかることになります。
どのように解決するのか?
あるものが別のものに依存し、その依存したものが自分のコントロール外で変更される可能性がある、ということです。
からのべき乗関数がある場合、それは
a
,
b
から
c
ここで、もし
a
と
b
が同じであれば
c
は同じですが、チェックのコストは
b
が高いのであれば、どちらかです。
-
古い情報を使って操作することがあり、常に
b
-
チェックするように最善を尽くす
b
をできるだけ速くする
ケーキを食べることはできない...
に基づいて追加のキャッシュを重ねることができるのであれば、そのキャッシュは
a
に基づいて追加のキャッシュを重ねることができるなら、これは最初の問題に少しも影響しません。もし 1 を選んだのであれば、自分自身に与えた自由があるので、より多くのキャッシュを行うことができますが、キャッシュされた
b
. 2 を選んだ場合は
b
を毎回チェックしなければなりませんが、キャッシュを利用することで
a
もし
b
がチェックアウトします。
キャッシュを重ねる場合、組み合わせた動作の結果、システムの「ルール」に違反したかどうかを検討する必要があります。
もし、あなたが
a
が常に有効であるならば
b
が有効であれば、以下のようにキャッシュを配置することができます(擬似コード)。
private map<b,map<a,c>> cache //
private func realFunction // (a,b) -> c
get(a, b)
{
c result;
map<a,c> endCache;
if (cache[b] expired or not present)
{
remove all b -> * entries in cache;
endCache = new map<a,c>();
add to cache b -> endCache;
}
else
{
endCache = cache[b];
}
if (endCache[a] not present) // important line
{
result = realFunction(a,b);
endCache[a] = result;
}
else
{
result = endCache[a];
}
return result;
}
明らかに連続したレイヤー(例えば
x
) は、各段階で新しく追加された入力の妥当性が
a
:
b
の関係
x
:
b
と
x
:
a
.
しかし、有効性が完全に独立している(あるいは循環している)3つの入力を得ることは十分に可能であり、レイヤリングは不可能でしょう。この場合、「//重要」とマークされた行は次のように変更する必要があります。
if (endCache[a]) が期限切れか が存在しない場合)
関連
-
[解決済み] 最小スパニングツリーは負の重みを恐れているのか?
-
[解決済み] どのようにすれば、ほとんどすべてのアルゴリズムを修正して、最良の場合の実行時間を持つようにできるか?
-
[解決済み] ビッグシータ記法の証明
-
[解決済み] 2進数が3で割れているかどうかを知るには?
-
[解決済み] 解いてみてください。T(n) = T(n-1) + n [重複] とする。
-
[解決済み] ウェブサイト制作のためのChromeキャッシュの無効化
-
[解決済み] キャッシュフレンドリーコードとは何ですか?
-
[解決済み] Cache-Control: max-age=0とno-cacheの違いは何ですか?
-
[解決済み] クライアントにJavaScriptファイルを強制的に更新させるには?
-
[解決済み] フラットテーブルをツリーにパースする最も効率的/エレガントな方法は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Dijkstraのアルゴリズムが負の重みのエッジに対して機能しないのはなぜですか?
-
[解決済み】whileループの時間複雑性とは?
-
[解決済み] クイックソートとヒープソートの比較
-
[解決済み] NPとco-NPの違いは何ですか?
-
[解決済み] Octave : ロジスティック回帰 : fmincg と fminunc の違い
-
[解決済み] ベルマンフォードとダイクストラの比較。どのような状況下でベルマンフォードが優れているか?
-
[解決済み] k-meansの時間計算量はどの程度ですか?
-
[解決済み] 複雑さ O(log(n)) は O(sqrt(n)) と同等か?
-
[解決済み] (関数型)リアクティブプログラミングとは?
-
[解決済み] ある問題がNP完全であることをどのように証明するか?