天天看點

資料緩存--Memcach詳解及如何使用(帶代碼)?

在使用Memcach之前,先搞清楚什麼是Memcach以及Memcached?   

A.什麼是Memcache?

        Memcache是一個高性能的分布式的記憶體對象緩存系統,通過在記憶體裡維護一個統一的巨大的hash表,  它能夠用來存儲各種格式的資料,包括圖像、視訊、檔案以及資料庫檢索的結果等。簡單的   說就是将數   據調用到記憶體中,然後從記憶體中讀取,進而大大提高讀取速度。Memcached是一個高并發的記憶體鍵值對緩存系統,它的主要作用是将資料庫查詢結果,内容,以及其它一些耗時的計算結   果緩存到系統記憶體中,進而加速Web應用程式的響應速度。

B..Memcache和memcached的差別?

   其實Memcache是這個項目的名稱,而memcached是它伺服器端的主程式檔案名,知道我的意思了吧。一個是項目名稱,一個是主程式檔案名,在網上看到了很多人不明白,于是混用了。

1..Memcached的安裝【下邊的檔案裡安裝包,可以直接下載下傳】

   在1.4.5版本之前,memcached可以被安裝成一個服務,但之後的版本中該功能被移除了。是以memcached的安裝可以分為兩類,第一類是1.4.5之前的版本,另一類是1.4.5之後的版本。

  1)安裝memcached < 1.4.5:

       1.将下載下傳的檔案解壓到任意目錄。

       2. 1.4.5之前版本的memcached會被安裝成一個服務,以administrator打開控制台,運作下面的指令:

          c:\memcached\memcached.exe -d install

        * 注意将路徑c:\memcached\memcached.exe替換成你本地的安裝路徑。

       3.然後使用下面的指令啟動或停止memcached服務:

          c:\memcached\memcached.exe -d start

          c:\memcached\memcached.exe -d stop

       4.例如你想增加memcached所使用的最大記憶體限制,可以修改ImagePath的值:

          "c:\memcached\memcached.exe" -d runservice -m 512

         * 除了參數'-m 512'之外,你還可以使用其它的參數。通過“c:\memcached\memcached.exe -h”可以查             看所有能使用的參數。

       5.如果要解除安裝memcached服務,可以使用下面的指令:

          c:\memcached\memcached.exe -d uninstall

    2)安裝memcached >= 1.4.5

        1.将下載下傳的檔案解壓到任意目錄。

        2.    1.4.5之後版本的memcached不能作為Windows服務來運作,可以在指令行中啟動memcache。以             管理者身份打開cmd,然後輸入如下指令:

                                        Memcached-x86 –p 11211 –m 128 –vv

        3. memcached啟動選項如下:

         選項 說明

          -p 使用的TCP端口,預設為11211

         -m 最大記憶體大小預設為64m

         -vv 用very verbose模式啟動,調試資訊和錯誤輸出到控制台

         -d 作為daemon在背景啟動

      4.在java中如何使用Memcache

         1.添加jar包:【下邊的檔案裡有jar包】

             commons-pool-1.5.6.jar、

             java_memcached-release_2.6.6.jar、

             slf4j-api-1.6.1.jar、

2.添加輔助類MemcachedUtil.java【直接複制 粘貼就行到你的包裡(如:com.wf.ssm.util)】

    import java.util.Date;

    import com.danga.MemCached.MemCachedClient;

    import com.danga.MemCached.SockIOPool;

    public class MemcachedUtil {

    private static MemCachedClient cachedClient = new MemCachedClient();

    static {

        //擷取連接配接池的執行個體

        SockIOPool pool = SockIOPool.getInstance();

        //伺服器清單及其權重

        String[] servers = {"127.0.0.1:11211"};

        Integer[] weights = {3};

        //設定伺服器資訊

        pool.setServers(servers);

        pool.setWeights(weights);

        //設定初始連接配接數、最小連接配接數、最大連接配接數、最大處理時間

        pool.setInitConn(10);

        pool.setMinConn(10);

        pool.setMaxConn(1000);

        pool.setMaxIdle(1000*60*60);

        //設定連接配接池守護線程的睡眠時間

        pool.setMaintSleep(60);

        //設定TCP參數,連接配接逾時

        pool.setNagle(false);

        pool.setSocketTO(60);

        pool.setSocketConnectTO(0);

        //初始化并啟動連接配接池

        pool.initialize();

        //壓縮設定,超過指定大小的都壓縮

        //      cachedClient.setCompressEnable(true);

        //      cachedClient.setCompressThreshold(1024*1024);

    }

    private MemcachedUtil(){

    }

    public static boolean add(String key, Object value) {

        return cachedClient.add(key, value);

    }

    public static boolean add(String key, Object value, Date expireDate) {

        return cachedClient.add(key, value, expireDate);

    }

    public static boolean add(String key, Object value, Integer millSeconds){

    return cachedClient.add(key, value, new Date(new Date().getTime()+millSeconds));

    }

    public static boolean put(String key, Object value) {

        return cachedClient.set(key, value);

    }

    public static boolean put(String key, Object value, Date expireDate) {

        return cachedClient.set(key, value, expireDate);

    }

    public static boolean put(String key, Object value, Integer millSeconds){

    return cachedClient.set(key, value, new Date(new Date().getTime()+millSeconds));

    }

    public static boolean replace(String key, Object value) {

        return cachedClient.replace(key, value);

    }

    public static boolean replace(String key, Object value, Date expireDate) {

        return cachedClient.replace(key, value, expireDate);

    }

    public static boolean replace(String key, Object value, Integer millSeconds){

    return cachedClient.replace(key, value, new Date(new Date().getTime()+millSeconds));

    }

    public static Object get(String key) {

        return cachedClient.get(key);

    }

   public static Object delete(String key) {

       return cachedClient.delete(key);

   }

  }

3.注意,被添加到緩存的類必須實作接口Serializable。

繼續閱讀