GAE + GWT プログラミングメモ

Google App Engine とGoogle Web Toolkit のメモ

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にあることを前提としてはいけない。