1. 程式人生 > >Memcache客戶端安裝和使用

Memcache客戶端安裝和使用

一、memcached客戶端安裝
Memcached本身是使用C開發的,客戶端可以是php、C#、或者java。我是做java的,所以這裡只介紹基於java的客戶端。
Memcached目前有三種java的客戶端
(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。

本人屬於學習,選擇了較為穩定的memcached client for java。下面以 memcached client for java講解下客戶端使用方法。
1.安裝。
點選進入 java memcached client的jar包下載地址
由於目前java memcached java memcached client要依賴slf4j-simple、slf4j-api、commons-pool三個包,因此我們需要為其編輯一個pom檔案,將java memcached client的jar包和pom檔案一起安裝,解決java memcached client對其他jar包的依賴。

安裝步驟:
1. 下載 memcached.jar(放到d:/)
2. 編寫 java-memcached-2.6.6.pom檔案(d:/)
3. 執行安裝命令:
mvn install:install-file-Dfile=d:/java_memcached_2.6.6.jar-DpomFile=d:/java-memcached-2.6.6.pom
4. 在 專案中引入memcache

<dependency>
 <groupId>com.danga</groupId>
 <artifactId>java-memcached</artifactId>
 <version>2.6.6</version>    
</dependency>

java-memcached-2.6.6.pom的內容為:

<?xml version="1.0" encoding="UTF-8"?>
    <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
    <modelVersion>4.0.0</modelVersion>     <groupId>com.danga</groupId>    
    <artifactId>java-memcached</artifactId>     <version>2.6.2</version>
    <dependencies>  
        <dependency>  
            <groupId>org.slf4j</groupId>  
            <artifactId>slf4j-simple</artifactId>  
            <version>1.6.2</version>  
        </dependency>  
        <dependency>  
            <groupId>org.slf4j</groupId>  
            <artifactId>slf4j-api</artifactId>  
            <version>1.6.2</version>  
        </dependency>  
        <dependency>  
            <groupId>commons-pool</groupId>  
            <artifactId>commons-pool</artifactId>  
            <version>1.5.6</version>  
        </dependency>   
</project>

二、DEMO的實現
memcached包結構
memcached包結構

在Dao層編寫所對應的memcached的單例,程式碼如下:

/**
 * memcache 客戶端
 *
 * Created by ydw on 15/4/15.
 */
public class MemCacheDao {
    // 建立全域性的唯一例項
    protected static MemCachedClient mcc = new MemCachedClient();
    protected static MemCacheDao memCachedManager = new MemCacheDao();
    // 設定與快取伺服器的連線池
    static {
        // 伺服器列表和其權重
        String[] servers = {"Ip:port"};
        Integer[] weights = {3};

        // 獲取soket 連線池的例項物件
        SockIOPool pool = SockIOPool.getInstance();

        // 設定伺服器資訊
        pool.setServers(servers);
        pool.setWeights(weights);

        //設定初始連線數、最小和最大連線數以及最大處理時間
        pool.setInitConn(5);
        pool.setMinConn(5);
        pool.setMaxConn(500);
        pool.setMaxIdle(1000*60*60*6);

        // 設定主執行緒的睡眠時間
        pool.setMaintSleep(30);

        // 設定TCP的引數和連線超時
        pool.setNagle(false);
        pool.setSocketTO(3000);
        pool.setSocketConnectTO(0);

        // 初始化連線池
        pool.initialize();
    }

    /**
     * 私有構造方法,不允許外部例項化!
     */
    protected MemCacheDao(){
    }

    /**
     * 獲取唯一例項
     */
    public static MemCacheDao getInstance() {
        return memCachedManager;
    }

    /**
     * 新增一個指定的值到快取中
     */
    public boolean add(String key, Object value){
        return mcc.add(key, value);
    }
    public boolean add(String key, Object value, Date expiry) {
        return mcc.add(key, value, expiry);
    }

    /**
     * 修改快取
     * @param key
     * @param value
     * @return
     */
    public boolean replace(String key, Object value){
        return mcc.replace(key, value);
    }
    public boolean replace(String key, Object value, Date expiry) {
        return mcc.replace(key, value, expiry);
    }

    /**
     * 根據指定的關鍵字獲取物件
     */
    public Object get(String key) {
        return mcc.get(key);
    }


    public static void main(String [] args) {
        MemCacheDao cache = MemCacheDao.getInstance();
        cache.add("hello", 234);
        System.out.println("get value:" + cache.get("hello"));
    }
}

在service層,使用下面語句,對mecached client進行例項化,便可以操作memcache伺服器。

// cache client dao
    MemCacheDao cacheDao = MemCacheDao.getInstance();