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;

まとめ


サービスにもよるとおもいますが、ありだと思います。
  • カテゴリ:
  • Tech