2012-10-25 36 views
3

我想在memcached中使用spymemcached-2.8.4客戶端設置一個非常基本的命中率監視器,但存儲在memcached中的值實際上似乎從未增加......這是一個錯誤還是我錯過了什麼嗎?使用'incr'與spymemcached客戶端

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

我知道它可能在分佈式緩存:

(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

您是否嘗試過使用telnet連接到memcached服務器並手動執行此操作?它工作嗎?請參閱memcached命令:http://www.javaworld.com/javaworld/jw-04-2012/120418-memcached-for-java-enterprise-performance.html?page=3 – user1697575

+0

是的,它是defo可能的(請參閱編輯)。 .. – travega

+0

嘗試啓用詳細模式爲memcached服務器(例如,在comman-line運行memcached -vv)查看在incr操作期間服務器上的錯誤(它抱怨「CLIENT_ERROR不能遞增或遞減非數值」)也在您的Java應用程序,你應該得到例外... – user1697575

回答

4

對於增量DECR分佈式緩存服務器認爲存儲/值作爲整數的字符串表示,

添加項目等

memcachedClient.set(clientId, 1800, 1); 

增加值作爲整數,這就是memcached無法增加它的原因。

使用

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

代替。它會按需要工作。

2

您可以使用另一種增量簽名:

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

,對我spymemcached-工作2.8.4客戶端。

此外,看起來像有一個issue with incr spymemcached

您不應該使用Integer,因爲它將被轉換回String,並以String形式存儲在memcached服務器上。

如果你打開使用xmemcached那麼你可以使用特定的計數器結構,例如,

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

閱讀更多的它在xmemcached documentation

相關問題