KEY更新によるキャッシュ破棄実装
最終更新日 : 2010-09-15 15:56:58
KEY更新によるキャッシュ破棄とは
一般的にCacheを破棄する際には以下のように明示的に$keyを指定して削除処理を行う。
my $key = 'user_id:3'; $cahce->delete($key);それに対しKEY更新によるキャッシュ破棄では
my $key = "user_id:$cache_no:3";
のようにcacheのkeyに$cache_noというのを埋め込み、$cache_noを変更することによりキャッシュの疑似破棄をおこなう。 $cache_no の値は、データの更新があった際にインクリメントするようにする。
長所
- キャッシュの破棄を明示的に記載する必要がない(奇麗なソースが書ける)
- 複数のキャッシュをまとめて破棄することができる(Cache::Memcached::ManagedのGroup的なこと)
- キャッシュKEYの一元管理がしやすい
短所
とくに短所は無いのだがあえて記載すると
- 値を更新時に$cache_noをインクリメントする必要がある(timestampを使うとかもアリかもしれない)
- cache_noをどこかに保持する必要がある
サンプルコード
sub cacheable() { my($code, $key, $exp) = @_; $exp ||= 60 * 5; my $cache = OreSama::Cache->instance; if (defined(my $data = $cache->get($key))) { return $data; } my $data = $code->(); $cache->set($key, $data, $exp); $data; } # SETするコード例 (フレンド一覧取得) my $key = join(":",'hoge',$user_cache_id,$user_id); my $res = cachable( $key , sub { my @friend_objs= DB::Friend->search( {user_id => $user_id} ); return \@friend_objs; } ); #破棄するコード例(ユーザ情報更新) $user_obj->user_cache_id( $user_obj->user_cache_id + 1); $user_obj->save;
まとめ
サービスにもよるとおもいますが、ありだと思います。