前言
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 成功
後語
- 緩存類一定要加相應的過期時間,否則很容易達到內存上限。