我正在尝试使用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
答案 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中阅读更多内容: