appengine用のMemcacheCounterを作ったので紹介
仕組みは以前書いたこの方法
MemcacheService s = MemcacheServiceFactory.getMemcacheService(); if (!s.contains("MemcacheCounter")) { s.put("MemcacheCounter", 1); // 初期化は1 } else { s.increment("MemcacheCounter", 1); // 2回目以降は値に+1する } System.out.println(s.get("MemcacheCounter")); // 実行のたびに1,2,3,4,5になる
MemcacheCounterの使い方
MemcacheCounter counter = MemcacheCounter.getCounter("TestCounter"); counter.countUp(); // 1 counter.countUp(); // 2 counter.countDown(); // 1 counter.getCount(); // 1 counter.clear(); // 0
※なんらかの理由でキャッシュがクリアされた場合は0に戻ります。
短期間のカウンターに使ってます。
MemcacheCounter.class
import java.util.logging.Logger; import com.google.appengine.api.memcache.MemcacheService; import com.google.appengine.api.memcache.MemcacheServiceFactory; import com.google.apphosting.api.ApiProxy; public class MemcacheCounter { private static final Logger logger = Logger.getLogger(MemcacheCounter.class.getName()); private static final String KEY_PREFIX = ApiProxy.getCurrentEnvironment().getVersionId() + ".MemcacheCounter."; private String key; private MemcacheCounter(String key) { this.key = KEY_PREFIX + key; } private static MemcacheService service = MemcacheServiceFactory.getMemcacheService(); public synchronized static MemcacheCounter getCounter(String key) { MemcacheCounter counter = new MemcacheCounter(key); if (!counter.initialized()) { counter.initialize(); } return counter; } private boolean initialized() { return service.contains(key); } private void initialize() { logger.info("call initialize"); // ※キャッシュが突然消失してしまった場合もinitializeが実行されるので0に戻る service.put(key, new Long(0)); } public long getCount() { if (!canGetCount()) { throw new NullPointerException("MemcacheCounter.getCount is null"); } Long count = (Long) service.get(key); return count; } public long countUp() { if (!canGetCount()) { throw new NullPointerException("MemcacheCounter.countUp is null"); } return service.increment(key, new Long(1)); } public long countDown() { if (!canGetCount()) { throw new NullPointerException("MemcacheCounter.countDown is null"); } return service.increment(key, new Long(-1)); } public void clear() { service.put(key, new Long(0)); } private boolean canGetCount() { return service.contains(key); } }