package cn.com.atobo.adm.utils;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
/**
* memcached 緩存服務器
* @author guowb
* @date 2015-8-25 下午6:30:00
*/
public class MemUtils {
private static Logger logger = Logger.getLogger(MemUtils.class);
private static MemCachedClient mcc = new MemCachedClient();
/** 3600 秒 */
private static final Integer EXPIRE = 3600;
static {
SockIOPool pool = SockIOPool.getInstance();// 獲取鏈接池的實例
String memCached = ResourceUtil.getConfigValueByKey("memchchedIP");// memcached服務器
pool.setServers(new String[] { memCached + ":11211" });
pool.setWeights(new Integer[] { 1 });// 權重
pool.setInitConn(10);// 初始鏈接
pool.setMinConn(10); // 最小鏈接
pool.setMaxConn(1000);// 最大鏈接
pool.setMaxIdle(1000 * 60 * 60);// 最大等待
pool.setMaintSleep(60);// 睡眠時間
pool.setNagle(false);
pool.setSocketTO(3000);// 鏈接超時 3秒
pool.setSocketConnectTO(0);
pool.initialize(); // 初始化並啓動鏈接池
}
/**
* 添加值 ,存在則添加失敗
*
* @author langwenjie
* @date 2015-8-25 下午4:18:06
*/
public static boolean add(String key, Object value) {
if(StringUtils.isNotBlank(key)){
logger.info("new add :key=" + key);
return mcc.add(key, value, EXPIRE);
}
return false;
}
/**
* 添加值,存在則替換
* 若是爲用戶登錄時產生的數據,則"user"+用戶ID
* 若是爲用戶沒有登錄時產品的數據,則key 由MemcachedBean控制
*
* @author langwenjie
* @date 2015-8-25 下午4:28:49
*/
public static boolean set(String key, Object value) {
logger.info("set value :key=" + key);
return mcc.set(key, value, EXPIRE);
}
/**
* 替換值,不存在則替換失敗
*
* @author langwenjie
* @date 2015-8-25 下午4:29:08
*/
public static boolean replace(String key, Object value) {
logger.info("replace :key=" + key);
return mcc.replace(key, value, EXPIRE);
}
/**
* 取出值
*
* @author langwenjie
* @date 2015-8-25 下午4:30:33
*/
public static Object get(String key) {
Object object = mcc.get(key);
logger.info("key :" + key + " value :" + (object!=null));
return object;
}
/**
* 刪除值
*
* @author langwenjie
* @date 2015-8-25 下午5:51:32
*/
public static boolean delete(String key) {
logger.info("delete :" + key);
return mcc.delete(key);
}
}
3.項目中直接調用
1. 準備安裝文件node
下載memcached與libevent的安裝文件linux
http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz(memcached下載地址)git
https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz(libevent下載地址)github
2. 具體安裝步驟apache
1.因爲memcached依賴於libevent,所以須要安裝libevent。因爲linux系統可能默認已經安裝libevent,執行命令:緩存
rpm -qa|grep libevent服務器
查看系統是否帶有該安裝軟件,若是有執行命令:網絡
rpm -e libevent-1.4.13-4.el6.x86_64 --nodeps(因爲系統自帶的版本舊,忽略依賴刪除)併發
3. 安裝libevent命令:memcached
tar zxvf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure --prefix=/usr/local/libevent
make
make install
至此libevent安裝完畢;
安裝過程當中出現:configure: error : no acceptable C compiler found in $PATH錯誤時是沒有安裝gcc,運行以下命令:
yum install gcc* make*
4. 安裝memcached命令:
tar zxvf memcached-1.4.2.tar.gz
cd memcached-memcached-1.4.2
./configure --prefix=/usr/local/memcached --with-libevent=
/usr/local/libevent/
make
make install
至此memcached安裝完畢;
5.當啓動memcached時常常不能發現libevent.so;能夠經過如下命令檢查:
進入/usr/local/memcached/bin目錄
LD_DEBUG=help ./memcached -v
LD_DEBUG=libs
./
memcached -v
解決方法:
ln -s /usr/local/libevent/lib/libevent-2.0.so.5 /lib64/libevent-2.0.so.5
6. 啓動memcached
1.打開一個終端,輸入如下命令:
./usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211 -c 1024 –P /tmp/memcached.pid
啓動參數說明:
-d 選項是啓動一個守護進程。
-u root 表示啓動memcached的用戶爲root。
-m 是分配給Memcache使用的內存數量,單位是MB,默認64MB。
-M return error on memory exhausted (rather than removing items)。
-u 是運行Memcache的用戶,若是當前爲root 的話,須要使用此參數指定用戶。
-p 是設置Memcache的TCP監聽的端口,最好是1024以上的端口。
-c 選項是最大運行的併發鏈接數,默認是1024。
-P 是設置保存Memcache的pid文件。
另外還有個更詳細的參數說明:
Param代碼
- memcached 1.4.2
- -p 監聽的TCP端口(默認: 11211)
- -U 監聽的UDP端口(默認: 11211, 0表示不監聽)
- -s 用於監聽的UNIX套接字路徑(禁用網絡支持)
- -a UNIX套接字訪問掩碼,八進制數字(默認:0700)
- -l 監聽的IP地址。(默認:INADDR_ANY,全部地址)
- -d 做爲守護進程來運行。
- -r 最大核心文件限制。
- -u 設定進程所屬用戶。(只有root用戶可使用這個參數)
- -m 單個數據項的最大可用內存,以MB爲單位。(默認:64MB)
- -M 內存用光時報錯。(不會刪除數據)
- -c 最大併發鏈接數。(默認:1024)
- -k 鎖定全部內存頁。注意你能夠鎖定的內存上限。
- 試圖分配更多內存會失敗的,因此留意啓動守護進程時所用的用戶可分配的內存上限。
- (不是前面的 -u 參數;在sh下,使用命令"ulimit -S -l NUM_KB"來設置。)
- -v 提示信息(在事件循環中打印錯誤/警告信息。)
- -vv 詳細信息(還打印客戶端命令/響應)
- -vvv 超詳細信息(還打印內部狀態的變化)
- -h 打印這個幫助信息並退出。
- -i 打印memcached和libevent的許可。
- -P 保存進程ID到指定文件,只有在使用 -d 選項的時候纔有意義。
- -f 塊大小增加因子。(默認:1.25)
- -n 分配給key+value+flags的最小空間(默認:48)
- -L 嘗試使用大內存頁(若是可用的話)。提升內存頁尺寸能夠減小"頁表緩衝(TLB)"丟失次數,提升運行效率。
- 爲了從操做系統得到大內存頁,memcached會把所有數據項分配到一個大區塊。
- -D 使用 做爲前綴和ID的分隔符。
- 這個用於按前綴得到狀態報告。默認是":"(冒號)。
- 若是指定了這個參數,則狀態收集會自動開啓;若是沒指定,則須要用命令"stats detail on"來開啓。
- -t 使用的線程數(默認:4)
- -R 每一個鏈接可處理的最大請求數。
- -C 禁用CAS。
- -b 設置後臺日誌隊列的長度(默認:1024)
- -B 綁定協議 - 可能值:ascii,binary,auto(默認)
- -I 重寫每一個數據頁尺寸。調整數據項最大尺寸。
也能夠啓動多個守護進程,可是端口不能重複
查看memcached啓動命令
ps aux|grep memcached
7.中止Memcache進程: kill `cat /tmp/memcached.pid`