Djangoのキャッシュ機能を試してみた、ただしmemcachedじゃなくて。

 Django のキャッシュフレームワーク : Django オンラインドキュメント和訳

 前々から「さして必要ではないけれども取り組みたい」と思っていたDjangoのキャッシュ機能を少し試してみています。ただし、当サイトは現在Dreamhost上で運用していて「かなり自由であるけれども、決して本当に自由ではない」のでmemcachedは使わない方向で。そして、まずは“サイト単位”とか“ビュー単位”とかではなく、“低水準のキャッシュAPI”を使う方向で。

 サイドバーにある以前のエントリーを抜き出した「過去“にっき”らんだむ」は適当にDBへアクセスして規定の件数を抜き出す様な処理ですが、そうすると最低でも毎回10件のフェッチがかかってしまうわけで少し勿体ない。て事で、手始めにそれにキャッシュを適用しました(←あとアマゾンWebサービスのレスポンスにも適用済み)。抜き出したエントリーオブジェクトを含むリストをキャッシュしています。
 Dreamhostさんで動いているRDBMSはMySQLという事もあり、最初は“データベースを使ったキャッシュ”を試していたのですが、あっさり使える様になってしまった後に“ローカルメモリ上のキャッシュ”というものに気が付いたので今はそちらを用いています。このローカルメモリというのはどこの事だかよくわかりませんが(←わからないのか)、このサーバではFastCGIを使って運用しておりますから、そこらのプロセスのメモリって事だとろくに調べもせずに勝手に理解しました。

 “ローカルメモリ上のキャッシュ”を有効にする為にsettings.pyを編集します。

CACHE_BACKEND = 'locmem:///'

 と追記します。

 後は使いたいところでdjango.core.cacheをimportして処理を記述すればOKです。cacheオブジェクトは辞書の様に扱えます。今回は、

from django.core.cache import cache

if cache.('キー名'):
    キャッシュが存在したときの処理
else:
    キャッシュが存在しないときの処理
    cache.set('キー名', キャッシュしたいオブジェクト, キャッシュしておきたい秒数)

 みたいな処理を記述しています(←近々このblogのソースも改訂しないとね)。

 内容を変更してしまう様な処理の場合、キャッシュの存在が都合が悪くなる場合がありますが、そういうときは、

cache.delete('キー名')

 とすれば削除できます。キャッシュは存在していてもいなくても問題ありません。

キャッシュにはほとんど制限がありません: 安全に pickle 化でき るオブジェクトならなんでもキャッシュできます.ただし,キーは文字列でなけれ ばなりません.

 とありますし、非常に簡単楽々で逆にあっさり過ぎてテンション下がるくらいですので、ガンガン使って行きたい! 効果のあるなしも別で!(←ダメじゃん)

 ちなみに、今回有効期限を24時間にしたのですけど、途中でFastCGIのプロセスが起動し直したり、複数あったりするのか数時間程度しか持たないですね。ここいらの時間をきっちりしたい場合は“データベースを使ったキャッシュ”を利用した方が良さそう。
 使いどころを見出したら“ビュー単位”や“サイト単位”も試してみるつもりだけども、“ファイルシステムを使ったキャッシュ”は何だか燃えないので試さないかもー。