Maven項目集合Memcached框架

前言

Memcached說明

  • Memcached是一個基於鍵值對的HashMap的分佈式內存對象緩存系統,其協議簡單,存取方便。不過只要重啓mencached或者達到指定值,memcached會刪除不使用的緩存。
  • 客戶端管理工具

安裝過程

基於Windows的安裝過程

  • 1.下載安裝程序
  • 2.通過【cmd】進入memcached安裝程序目錄
  • 3.輸入memcached -d install
  • 4.測試,Telnet 127.0.0.1 11211 這裏爲本地IP,默認端口號爲11211

memcached調整內存大小

  • 1.點擊【運行】輸入【regedit】
  • 2.註冊表中找到【HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server】
  • 3.將ImagePath鍵的值【:”c:${安裝目錄}\memcached.exe” -d runservice】,改爲:【”c:\memcached\memcached.exe” -d runservice -m 512 -p 11211】這邊的512就是memcached緩存的大小。
  • 4.重啓memcached服務即可,可以通過Telnet 127.0.0.1 11211 輸入stats查看更改後的內存大小參數

基於Linux的安裝過程

  • 1、由於memcached是基於libevent的,所以先檢查是否安裝了libevent,沒有則安裝
rpm -qa|grep libevent
yum install libevent libevent-devel-y
  • 2、執行以下命令安裝memcached,並啓動
yum -y install –enablerepo=rpmforge memcached
/usr/bin/memcached -d -m 1024m -c 1024 -u root
  • 3、檢查運行狀態printf “stats\r\n” | nc 127.0.0.1 11211

memcached調整內存大小

  • 通過啓動設置參數
/usr/local/memcached/bin/memcached -d -m 10m -p 11211 -u root 

memcached部分參數說明

-d選項是啓動一個守護進程,

-m是分配給Memcache使用的內存數量,單位是MB,這裏是10MB,

-u是運行Memcache的用戶,這裏是root,

-l是監聽的服務器IP地址,如果有多個地址的話,這裏指定了服務器的IP地址192.168.0.200
-p是設置Memcache監聽的端口,這裏設置了12000,最好是1024以上的端口,

-c選項是最大運行的併發連接數,默認是1024,這裏設置了256,按照服務器的負載量來設定,

-P是設置保存Memcache的pid文件,我這裏是保存在 /tmp/memcached.pid,也可以啓動多個守護進程,不過端口不能重複

項目集合過程

  • 1.添加maven Jar包
 <!-- 緩存 -->
        <dependency>
            <groupId>com.whalin</groupId>
            <artifactId>Memcached-Java-Client</artifactId>
            <version>3.0.1</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
  • 2.添加memcached工具類
public class MemCached {

    // 創建全局的唯一實例
    public static MemCachedClient mcc = new MemCachedClient();

    public volatile static MemCached memCached = null;

    // 設置與緩存服務器的連接池
    static {
        // 服務器列表和其權重
        String[] servers = {"119.23.245.84:11211"};
        //String[] servers = {"120.77.44.111:10201"};
        Integer[] weights = {3};

        // 獲取socke連接池的實例對象
        // 這個類用來創建管理客戶端和服務器通訊連接池,
        // 客戶端主要的工作(包括數據通訊、服務器定位、hash碼生成等)都是由這個類完成的。
        SockIOPool pool = SockIOPool.getInstance();

        // 設置服務器信息
        pool.setServers(servers);

        // 設置Server權重
        pool.setWeights(weights);

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

        // 設置主線程的睡眠時間
        pool.setMaintSleep(30);

        // 設置連接心跳監測開關
        // true:每次通信都要進行連接是否有效的監測,造成通信次數倍增,加大網絡負載,
        // 因此在對HighAvailability要求比較高的場合應該設爲true
        // 默認狀態是false,建議保持默認。
        pool.setAliveCheck(false);

        // 設置連接失敗恢復開關
        // 設置爲true,當宕機的服務器啓動或中斷的網絡連接後,這個socket連接還可繼續使用,否則將不再使用.
        // 默認狀態是true,建議保持默認。
        pool.setFailback(true);

        // 設置容錯開關
        // true:噹噹前socket不可用時,程序會自動查找可用連接並返回,否則返回NULL
        // 默認狀態是true,建議保持默認。
        pool.setFailover(true);

        // 設置hash算法
        // alg=0 使用String.hashCode()獲得hash code,該方法依賴JDK,可能和其他客戶端不兼容,建議不使用
        // alg=1 使用original 兼容hash算法,兼容其他客戶端
        // alg=2 使用CRC32兼容hash算法,兼容其他客戶端,性能優於original算法
        // alg=3 使用MD5 hash算法
        // 採用前三種hash算法的時候,查找cache服務器使用餘數方法。採用最後一種hash算法查找cache服務時使用consistent方法。
        // 默認值爲0
        pool.setHashingAlg(0);

        // 設置是否使用Nagle算法,因爲我們的通訊數據量通常都比較大(相對TCP控制數據)而且要求響應及時,
        // 因此該值需要設置爲false(默認是true)
        pool.setNagle(false);

        // 設置socket的讀取等待超時值
        pool.setSocketTO(3000);

        // 設置socket的連接等待超時值
        pool.setSocketConnectTO(0);

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

        // 壓縮設置,超過指定大小(單位爲K)的數據都會被壓縮
        // mcc.setCompressEnable(true);    //UnsupportedOperation
        // mcc.setCompressThreshold(64 * 1024);
    }

    private MemCached() {

    }

    /**
     *<p>Description:單例模式-二次校驗</p>
     *<p>Author:Boomer</p>
     *<p>Date:2017/8/24 13:32</p>
     **/
    public static MemCached getInstance() {
        if (null == memCached) {
            synchronized (MemCached.class) {// 二次校驗
                if (null == memCached) {
                    memCached = new MemCached();
                }
            }
        }
        return memCached;
    }

    /**
     * 添加一個指定的鍵值對到緩存中.
     *
     * @param key
     * @param value
     * @return
     */
    public boolean add(String key, Object value) {
        return mcc.add(key, value);
    }

    /**
     * 添加一個指定的鍵值對到緩存中.
     *
     * @param key
     * @param value
     * @param minute 多少分鐘之後過期
     * @return
     */
    public boolean add(String key, Object value, int minute) {
        return mcc.add(key, value, new Date(60000 * minute));
    }


    public boolean set(String key, Object value) {
        return mcc.set(key, value);
    }

    public boolean set(String key, Object value, int minute) {
        return mcc.set(key, value, new Date(60000 * minute));
    }

    public boolean replace(String key, Object value) {
        return mcc.replace(key, value);
    }

    public boolean replace(String key, Object value, int minute) {
        return mcc.replace(key, value, new Date(60000 * minute));
    }


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

    /**
     * 刪除指定緩存
     *
     * @param key
     * @return
     */
    public boolean del(String key) {
        return mcc.delete(key);
    }
}
  • 3.使用方式
        MemCached memCached = MemCached.getInstance();
        memCached.add("test","hello World");
        System.out.println(memCached.get("test"));

輸出 hello World 成功

後語

  • 緩存類一定要加相應的過期時間,否則很容易達到內存上限。
發佈了42 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章