データをどのようにキャッシュするか
こんにちわ! Yappo です!
2十3日目は Data::Model でどのようにデータをキャッシュし、
キャッシュしたデータをどう扱うかについてです。
アプリケーションの負荷軽減策の一つとしてデータを memcached にキャッシュしてしまい、
DB アクセスをすくなくすることで、レスポンスを早くする手法はみなさん良く使われていると思います。
Data::Model では Driver の機能として、データを透過キャッシュするなどの便利機能が存在しています。
そこで、いろいろ工夫擦る必要は特にありません。 Driver::Cache を使うと透過的キャッシュが利用できます。
このあたりの仕組は Data::ObjectDriver から拝借してます。
ただし Data::Model::Driver::Cache の戦略は全てのキャッシュを透過的に行ってしまうので、アプリケーションによっては無駄にキャッシュしすぎてしまうとかありえます。
ユーザの必要なケースに応じてキャッシュしてもらった方が効率が良いケースももちろんあるでしょうし Driver::Cache を使って楽をしたいときもあるでしょう。
幸い Data::Model では、特定のテーブルの Driver だけ変更する事ができるので一番重くて効果的なテーブルだけ memcached で透過的にキャッシュするという戦略も取れるのです。
では、早速データのキャッシュ方法についてみていきましょう。
# base driver を設定 my $driver = Data::Model::Driver::Memory->new; base_driver $driver; # user テーブルだけ透過キャッシュを指定 my $cache = Data::Model::Driver::Cache::HASH->new( fallback => $driver, ); install_model user => schema { driver $cache; };
これだけです。
これで user というテーブルだけ透過的に on memory な HASH driver にキャッシュされるようになります。
あとはそのデータが DB から取得したものなのか、 DB から取得したものなのかを気にする必要は全くありません。
fallback というオプションは、 get したときに cache がなかったときに利用される Driver です。
きちんと Data::Model の Driver の規格にあったものなら何でも使えます。
Data::Model::Driver::Cache::HASH の fallback に Data::Model::Driver::Cache::HASH を指定するアホな事もできるし、 Data::Model::Driver::Memcached も使えます。
まぁ KVS ストレージを透過的に memcached でキャッシュするなんて無意味すぎるので誰もやらないけど。
もちろん Driver::Cache を base_driver として指定してもいいです。それは自己責任で。
上記の例は単純な Perl の HASH にキャッシュするだけの Driver でしたが memcached にキャッシュする時は Driver::Cache::Memcached を使います。
my $driver = Data::Model::Driver::Memory->new; my $cache_driver = Data::Model::Driver::Cache::Memcached->new( fallback => $driver, memcached => Cache::Memcached::Fast->new({ servers => [ { address => "localhost:11211" }, ], }), );
memcached オプションに任意の Cache::Memcached オブジェクトを入れるだけです。
簡単ですね。
明日は、自作 Driver について掘り下げていこうかと思います。
have a nice data-model days!:)