在spymemcached客户端使用'incr'

时间:2012-10-25 21:09:09

标签: memcached counter increment spymemcached hitcounter

我正在尝试使用spymemcached-2.8.4客户端在memcached中设置一个非常基本的命中率监视器但是存储在memcached中的值实际上似乎从未增加......这是一个错误还是我错过了什么?

public static void checkHitRate(String clientId) throws FatalException, ForbiddenException {
    MemcachedClient memcachedClient;
    try {
        memcachedClient = new MemcachedClient(new InetSocketAddress("localhost", 11211));

        Integer hitRate = (Integer) memcachedClient.get(clientId);

        if (hitRate == null) {
            memcachedClient.set(clientId, 1800, 1);
        } else if (hitRate > 500) {
            throw new ForbiddenException("Hit rate too high. Try again later");
        } else if (hitRate <= 500) { 
            memcachedClient.incr(clientId, 1);
        } 

    } catch (IOException e) {
        throw new FatalException("Could not read hit rate from Memcached.");
    }
}

我知道它在memcached中可行:

(TELENT输出)

set clientId_1 0 200 1
1
STORED
incr clientId_1 1
2
get clientId_1
VALUE clientId_1 0 1
2
END

2 个答案:

答案 0 :(得分:6)

对于incr / decr,memcached服务器将存储的值视为整数的字符串表示,

添加

之类的项目
    memcachedClient.set(clientId, 1800, 1);

将值添加为整数,这就是memcached无法递增的原因。

使用

    memcachedClient.set(clientId, 1800, "1");

代替。它会按你的需要工作。

答案 1 :(得分:2)

您可以使用其他incr签名:

System.out.println("Incr result: " + memcachedClient.incr("testIncrKey", 1, 1));

对我来说,spymemcached-2.8.4客户端适用。

此外,看起来有一个issue with incr spymemcached

您不应该使用Integer,因为它将被转换回String并在memcached服务器上存储为String。

如果使用xmemcached打开,则可以使用特定的Counter构造,例如

Counter counter=client.getCounter("counter",0);
counter.incrementAndGet();
counter.decrementAndGet();
counter.addAndGet(-10);

在xmemcached documentation中阅读更多内容: