読者です 読者をやめる 読者になる 読者になる

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);
    }
}