元データとキャッシュデータが1:1で対応するとは、キャッシュ層に元データの一部を置いてある状態である。この場合、キャッシュのデータは元データのどの部分かはっきりしている。例えば、47都道府県の市町村リストがあり、その中で茨城と島根のデータをローカルにキャッシュしてあるような状況を想像してほしい。このようなキャッシュは、元データが変更されたらキャッシュデータの何を更新しないといけないかわかりやすい。比較的難易度が低いキャッシュと言える。
では、どのようにキャッシュを使おうか考えよう。
まずキャッシュがあってもなくても同じ動きになるようにしよう。get()メソッドの中で
String get(String id) {
if (cache.hasCache(id)) {
return cache.get(id);
} else {
return httpHandler.get(id);
}
}
のように自動的にキャッシュを使うかどうか判断してくれるとありがたい。こうしておけばいざという時はキャッシュを全部消せば良いので心配が減る。ただ、このライブラリが自動でキャッシュを使うということがライブラリ利用者側伝わりづらくトラブルの元になりかねない。意味もなくuseCacheをtrueにさせるという一手間をかけさせると「あ、キャッシュするんだな」と伝わって良い。たとえfalseという選択肢がなかったとしても。
class Api {
Api({bool useCache: true}) {
if (!useCache) {
throw "そんな選択肢はない!";
}
}
}
void main() {
var api = new API(useCache: true);
}
次に、元データ管理層からキャッシュの更新か破棄を指示できるようにしておこう。キャッシュ層が自分の管理するサーバー内にあるならそれようのプロトコルを作っておこう。WebシステムならURLの末尾にタイムスタンプをつけておくとCDNと併用できて手軽だ。
var modificateAt = <?php print $modificateAt; ?>;
$.ajax("/resources.json?" + modificateAt);
最後に、キャッシュを手動で破棄する方法を用意しよう。管理画面にデカデカとキャッシュクリアボタンを用意しておくと良い。いついかなる理由でキャッシュをクリアしなければいけないか未知なので必ず設けよう。だいたいキャッシュをクリアしたい時は超絶焦っている時だ。「SSH接続してこのファイルを削除ー」とかはやめよう。