5

我正在尝试使用 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
4

2 回答 2

6

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

添加一个项目,如

    memcachedClient.set(clientId, 1800, 1);

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

利用

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

反而。它会根据您的需要工作。

于 2013-10-31T10:33:24.760 回答
2

您可以使用另一个 incr 签名:

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

这适用于 spymemcached-2.8.4 客户端。

此外, incr spymemcached似乎存在问题。

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

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

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

在 xmemcached文档中阅读更多内容:

于 2012-10-26T17:11:29.343 回答