Memcached 客戶端程序三種API的比較

http://blog.csdn.net/yanweijie0317/article/details/6406652


七、            Memcached 客戶端程序

Memcached的java客戶端已經存在三種了:

?  官方提供的基於傳統阻塞io由Greg Whalin維護的客戶端

?  Dustin Sallings實現的基於java nio的Spymemcached

?  XMemcached


1. 三種API比較 
1)      memcached client for java

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


2)      spymemcached

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


3)      xmemcached

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


2.  建議

由於memcached client for java發佈了新版本,性能上有所提高,並且運行穩定,所以建議使用memcached client for java。

XMemcached也使用得比較廣泛,而且有較詳細的中文API文檔,具有如下特點:高性 能、支持完整的協議、支持客戶端分佈、允許設置節點權重、動態增刪節點、支持JMX、與Spring框架和Hibernate-memcached的集 成、客戶端連接池、可擴展性好等。

下面給出這三種客戶端的示例程序。


3.  示例程序 
1)      memcached client for java

從前面介紹的Java環境的Memcached客戶端程序項目網址裏,下載最新版的客戶端程 序包:java_memcached-release_2.5.1.zip,解壓後,文件夾裏找到java_memcached- release_2.5.1.jar,這個就是客戶端的JAR包。將此JAR包添加到項目的構建路徑裏,則項目中,就可以使用Memcached了。

示例代碼如下:

package temp;

 

import com.danga.MemCached.*;

import org.apache.log4j.*;

 

public class CacheTest {

    public static void main(String[] args) {

       /**

        * 初始化SockIOPool,管理memcached的連接池

        * */

       String[] servers = { "10.11.15.222:10000" };

       SockIOPool pool = SockIOPool.getInstance();

       pool.setServers(servers);

       pool.setFailover(true);

       pool.setInitConn(10);

       pool.setMinConn(5);

       pool.setMaxConn(250);

       pool.setMaintSleep(30);

       pool.setNagle(false);

       pool.setSocketTO(3000);

       pool.setAliveCheck(true);

       pool.initialize();

 

       /**

        * 建立MemcachedClient實例

        * */

       MemCachedClient memCachedClient = new MemCachedClient();

       for (int i = 0; i < 1000; i++) {

           /**

            * 將對象加入到memcached緩存

            * */

           boolean success = memCachedClient.set("" + i, "Hello!");

           /**

            * 從memcached緩存中按key值取對象

            * */

           String result = (String) memCachedClient.get("" + i);

           System.out.println(String.format("set( %d ): %s", i, success));

           System.out.println(String.format("get( %d ): %s", i, result));

       }

    }

}


2)      spymemcached

spymemcached當前版本是2.5版本,官方網址是:http://code.google.com/p/spymemcached/。可以從地址:http://spymemcached.googlecode.com/files/memcached-2.5.jar 下載最新版本來使用。

示例代碼如下:

package temp;

 

import java.net.InetSocketAddress;

import java.util.concurrent.Future;

 

import net.spy.memcached.MemcachedClient;

 

public class TestSpyMemcache {

    public static void main(String[] args) {

       // 保存對象

       try {

           /* 建立MemcachedClient 實例,並指定memcached服務的IP地址和端口號 */

           MemcachedClient mc = new MemcachedClient(new InetSocketAddress("10.11.15.222", 10000));

           Future<Boolean> b = null;

           /* 將key值,過期時間(秒)和要緩存的對象set到memcached中 */

           b = mc.set("neea:testDaF:ksIdno", 900, "someObject");

           if (b.get().booleanValue() == true) {

              mc.shutdown();

           }

       } catch (Exception ex) {

           ex.printStackTrace();

       }

       // 取得對象

        try {

           /* 建立MemcachedClient 實例,並指定memcached服務的IP地址和端口號 */

           MemcachedClient mc = new MemcachedClient(new InetSocketAddress("10.11.15.222", 10000));

           /* 按照key值從memcached中查找緩存,不存在則返回null */

           Object b = mc.get("neea:testDaF:ksIdno");

           System.out.println(b.toString());

           mc.shutdown();

       } catch (Exception ex) {

           ex.printStackTrace();

       }

    }

}


3)      xmemcached

Xmemcached的官方網址是:http://code.google.com/p/xmemcached/,可以從其官網上下載最新版本的1.2.4 來使用。地址是:http://xmemcached.googlecode.com/files/xmemcached-1.2.4-src.tar.gz 。

示例代碼如下:

package temp;

 

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();

       }

    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章