MemcacheでDatastoreへのアクセスを減らす
作成中のアニメ特化アンテナサイト
http://kumo2ji.appspot.com/
GAEではDatastoreへのRead、Writeの回数に対して、課金している。
なので、Datastoreへのアクセスはなるべく減らしたほうがよい。
Memcacheを使えば、応答性を上げつつ、Datastoreへのアクセスを減らすことができる。
Memcacheを利用するためには、まず、MemcacheServiceFactory.getMemcacheService("namespace")でMemcacheServiceを得る。
namespaceはキャッシュの名前空間を指定している。
このMemcacheServiceに対して、第1引数keyオブジェクト、第2引数valueオブジェクトを指定して、putすることで、キャッシュすることができる。
MemcacheServiceFactory.getMemcacheServiceで得られるMemcacheServiceはリクエストを跨ぐので、異なるリクエストに対してもputしたvalueを返すことができる。
MemcacheService cache = MemcacheServiceFactory.getMemcacheService("namespace"); cache.put("key", "value");
試しに、KeyからEntityを得るメソッドgetEntityにMemcacheの仕組みを入れてみる。
cache.contains(key)で登録されているかどうか調べ、登録されていなければ、cache.put(key, ds.get(key))でEntityをキャッシュに登録。
登録されていれば、(Entity)cache.get(key)でキャッシュの値を返す。
public static Entity getEntity(Key key) throws EntityNotFoundException { MemcacheService cache = MemcacheServiceFactory.getMemcacheService(); if (!cache.contains(key)) { DatastoreService ds = DatastoreServiceFactory.getDatastoreService(); cache.put(key, ds.get(key)); } return (Entity)cache.get(key); }
Memcacheがキャッシュできる容量は1Mでそのときの使用状況でクリアされるので、Memcacheにあることを前提としてはいけない。