1. 程式人生 > >Memcached的幾種Java客戶端

Memcached的幾種Java客戶端

nts utils single false public java客戶端 服務器列表 iop 集成

其實現在來嘗試Memcached的客戶端估計會有點過氣,因為現在大勢基本都在Redis那邊。

Memcached Client目前有3種:

  • Memcached Client for Java(已經停止更新)
  • SpyMemcached(已經停止更新)
  • XMemcached(一直更新,且支持客戶端分片實現集群,基本現在是它的天下)
    • 高性能
    • 支持完整的Memcached文本協議,二進制協議。
    • 支持JMX,可以通過MBean調整性能參數、動態添加/移除Server、查看統計等。
    • 支持客戶端統計
    • 支持Memcached節點的動態增減。
    • 支持Memcached分布:余數分布和一致性哈希分布。
    • 更多的性能調整選項。
    • XMemcached更容易與Spring集成。
    • 支持客戶端分片實現集群。

三種API的比較

1、較早推出的memcached JAVA客戶端API,應用廣泛,運行比較穩定。

2、A simple, asynchronous, single-threaded memcached client written in java. 支持異步,單線程的Memcached客戶端,用到了Java1.5版本的concurrent和nio,存取速度會高於前者,但是穩定性不好,測試中常 報timeOut等相關異常。

3、XMemcached同樣是基於java nio的客戶端,Java nio相比於傳統阻塞IO模型來說,有效率高(特別在高並發下)和資源耗費相對較少的優點。傳統阻塞IO為了提高效率,需要創建一定數量的連接形成連接 池,而nio僅需要一個連接即可(當然,nio也是可以做池化處理),相對來說減少了線程創建和切換的開銷,這一點在高並發下特別明顯。因此XMemcached與Spymemcached在性能都非常優秀,在某些方面(存儲的數據比較小的情況下)Xmemcached比Spymemcached的表現更為優秀,具體可以看這個Java Memcached Clients Benchmark。

示例代碼

Memcached Client for Java

官網:https://github.com/gwhalin/Memcached-Java-Client

這個已經停止跟新。放棄使用!

import java.util.Date;  
  
import com.danga.MemCached.*;  
  
public class MemcacheManagerForGwhalin {  
  
    // 構建緩存客戶端  
    private static MemCachedClient cachedClient;  
    // 單例模式實現客戶端管理類  
private static MemcacheManagerForGwhalin INSTANCE = new MemcacheManagerForGwhalin(); private MemcacheManagerForGwhalin() { cachedClient = new MemCachedClient(); // 初始化SockIOPool,管理memcached的連接池 SockIOPool pool = SockIOPool.getInstance(); // 設置緩存服務器列表,當使用分布式緩存的時,可以指定多個緩存服務器。(這裏應該設置為多個不同的服務器) String[] servers = { "192.168.163.10:11211", "192.168.163.11:11211" // 也可以使用域名 "server3.mydomain.com:1624" }; pool.setServers(servers); pool.setFailover(true); pool.setInitConn(10); // 設置初始連接 pool.setMinConn(5);// 設置最小連接 pool.setMaxConn(250); // 設置最大連接 pool.setMaxIdle(1000 * 60 * 60 * 3); // 設置每個連接最大空閑時間3個小時 pool.setMaintSleep(30); pool.setNagle(false); pool.setSocketTO(3000); pool.setAliveCheck(true); pool.initialize(); } /** * 獲取緩存管理器唯一實例 * * @return */ public static MemcacheManagerForGwhalin getInstance() { return INSTANCE; } public void add(String key, Object value) { cachedClient.set(key, value); } public void add(String key, Object value, int milliseconds) { cachedClient.set(key, value, milliseconds); } public void remove(String key) { cachedClient.delete(key); } public void remove(String key, int milliseconds) { cachedClient.delete(key, milliseconds, new Date()); } public void update(String key, Object value, int milliseconds) { cachedClient.replace(key, value, milliseconds); } public void update(String key, Object value) { cachedClient.replace(key, value); } public Object get(String key) { return cachedClient.get(key); } public static void main(String[] args) { //將對象加入到memcached緩存 cachedClient.add("keke", "This is a test String"); //從memcached緩存中按key值取對象 String result = (String) cachedClient.get("keke"); System.out.println(result); } }

Spymemcached

官網:http://code.google.com/p/spymemcached/

這個是不錯的選擇,但是有吭,在GitHub上找不到。

public class MemcacheManagerForSpy implements IMemcacheManager {  
    // 緩存客戶端  
    private MemcachedClient memcacheCient;  
    // Manager管理對象,單例模式  
    private static MemcacheManagerForSpy INSTANCE = new MemcacheManagerForSpy();  
  
    private MemcacheManagerForSpy() {  
        try {  
            memcacheCient = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
  
    public static MemcacheManagerForSpy getInstance() {  
        return INSTANCE;  
    }  
  
    @Override  
    public void add(String key, Object value, int milliseconds) {  
        memcacheCient.add(key, milliseconds, value);  
    }  
  
    @Override  
    public void add(String key, Object value) {  
        memcacheCient.add(key, 3600, value);  
  
    }  
  
    @Override  
    public void remove(String key, int milliseconds) {  
        memcacheCient.delete(key);  
    }  
  
    @Override  
    public void remove(String key) {  
        memcacheCient.delete(key);  
    }  
  
    @Override  
    public void update(String key, Object value, int milliseconds) {  
        memcacheCient.replace(key, milliseconds, value);  
    }  
  
    @Override  
    public void update(String key, Object value) {  
        memcacheCient.replace(key, 3600, value);  
    }  
  
    @Override  
    public Object get(String key) {  
        return memcacheCient.get(key);  
    }  
}  

Xmemcached

官網:https://github.com/killme2008/xmemcached

操作指南:https://github.com/killme2008/xmemcached/wiki/Xmemcached%20%E4%B8%AD%E6%96%87%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97

目前最火,且時長更新,截止今天都還在更新。

import java.io.IOException;  
import java.util.concurrent.TimeoutException;  
import net.rubyeye.xmemcached.utils.AddrUtil;  
import net.rubyeye.xmemcached.MemcachedClient;  
import net.rubyeye.xmemcached.MemcachedClientBuilder;  
import net.rubyeye.xmemcached.XMemcachedClientBuilder;  
import net.rubyeye.xmemcached.exception.MemcachedException;  
public class TestXMemcache {  
      
    public static void main(String[] args) {  
        MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("10.11.15.222:10000"));  
        MemcachedClient memcachedClient;  
        try {  
            memcachedClient = builder.build();  
            memcachedClient.set("hello", 0, "Hello,xmemcached");  
            String value = memcachedClient.get("hello");  
            System.out.println("hello=" + value);  
            memcachedClient.delete("hello");  
            value = memcachedClient.get("hello");  
            System.out.println("hello=" + value);  
            // close memcached client  
            memcachedClient.shutdown();  
        } catch (MemcachedException e) {  
            System.err.println("MemcachedClient operation fail");  
            e.printStackTrace();  
        } catch (TimeoutException e) {  
            System.err.println("MemcachedClient operation timeout");  
            e.printStackTrace();  
        } catch (InterruptedException e) {  
            // ignore  
        } catch (IOException e) {  
            System.err.println("Shutdown MemcachedClient fail");  
            e.printStackTrace();  
  
        }  
  
    }  
  
}  

參考:

http://blog.csdn.net/xuke6677/article/details/38706501

http://blog.csdn.net/hardy008/article/details/37738901

http://blog.csdn.net/arui_email/article/details/8129400

http://blog.csdn.net/heiyueya/article/details/64441901

http://exceptioneye.iteye.com/blog/1927741

http://blog.csdn.net/hengyunabc/article/details/20735701(緩存失效後的策略處理)

Memcached的幾種Java客戶端