Memcached 入門介紹(安裝與配置)
Memcached是一個(gè)高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng),用于動(dòng)態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫(kù)負(fù)載。
它通過(guò)在內(nèi)存中緩存數(shù)據(jù)和對(duì)象來(lái)減少讀取數(shù)據(jù)庫(kù)的次數(shù),從而提供動(dòng)態(tài)、數(shù)據(jù)庫(kù)驅(qū)動(dòng)網(wǎng)站的速度。
Memcached基于一個(gè)存儲(chǔ)鍵值對(duì)的hashmap。其守護(hù)進(jìn)程(daemon )是用C寫的,但是客戶端可以用任何語(yǔ)言來(lái)編寫,并通過(guò)memcached協(xié)議與守護(hù)進(jìn)程通信。
下面來(lái)了解下Memcached怎么用~~
一、準(zhǔn)備工作
到http://www.dbjr.com.cn/softs/205838.html
下載memcached的windows版
再下載一個(gè)java_memcached-release.jar
二、安裝
解壓memcached-1.2.5-win32-bin.zip,CMD進(jìn)入其目錄,然后執(zhí)行如下命令:
c:>memcached.exe -d install
c:>memcached.exe -l 127.0.0.1 -m 32 -d start第一行是安裝memcached成為服務(wù),這樣才能正常運(yùn)行,否則運(yùn)行失敗!
第二行是啟動(dòng)memcached的,這里簡(jiǎn)單的只分配32M內(nèi)存了(默認(rèn)64M),然后監(jiān)聽本機(jī)端口和以守護(hù)進(jìn)行運(yùn)行。
執(zhí)行完畢后,我們就可以在任務(wù)管理器中看到memcached.exe這個(gè)進(jìn)程了。
如果想要在同一臺(tái)Windows機(jī)器中安裝2個(gè)Memcached,請(qǐng)看這里
三、使用
現(xiàn)在服務(wù)器已經(jīng)正常運(yùn)行了,下面我們就來(lái)寫java的客戶端連接程序。
將java_memcached-release.zip解壓,把java_memcached-release.jar文件復(fù)制到j(luò)ava項(xiàng)目的lib目錄下,
然后我們來(lái)編寫代碼,比如我提供的一個(gè)應(yīng)用類如下:
package memcached.test;
import java.util.Date;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
/**
* 使用memcached的緩存實(shí)用類.
*/
public class MemCached {
// 創(chuàng)建全局的唯一實(shí)例
protected static MemCachedClient mcc = new MemCachedClient();
protected static MemCached memCached = new MemCached();
// 設(shè)置與緩存服務(wù)器的連接池
static {
// 服務(wù)器列表和其權(quán)重
String[] servers = { "127.0.0.1:11211" };
Integer[] weights = { 3 };
// 獲取socke連接池的實(shí)例對(duì)象
// 這個(gè)類用來(lái)創(chuàng)建管理客戶端和服務(wù)器通訊連接池,
// 客戶端主要的工作(包括數(shù)據(jù)通訊、服務(wù)器定位、hash碼生成等)都是由這個(gè)類完成的。
SockIOPool pool = SockIOPool.getInstance();
// 設(shè)置服務(wù)器信息
pool.setServers(servers);
// 設(shè)置Server權(quán)重
pool.setWeights(weights);
// 設(shè)置初始連接數(shù)、最小和最大連接數(shù)以及最大處理時(shí)間
pool.setInitConn(5);
pool.setMinConn(5);
pool.setMaxConn(250);
pool.setMaxIdle(1000 * 60 * 60 * 6);
// 設(shè)置主線程的睡眠時(shí)間
pool.setMaintSleep(30);
// 設(shè)置連接心跳監(jiān)測(cè)開關(guān)
// true:每次通信都要進(jìn)行連接是否有效的監(jiān)測(cè),造成通信次數(shù)倍增,加大網(wǎng)絡(luò)負(fù)載,
// 因此在對(duì)HighAvailability要求比較高的場(chǎng)合應(yīng)該設(shè)為true
// 默認(rèn)狀態(tài)是false,建議保持默認(rèn)。
pool.setAliveCheck(false);
// 設(shè)置連接失敗恢復(fù)開關(guān)
// 設(shè)置為true,當(dāng)宕機(jī)的服務(wù)器啟動(dòng)或中斷的網(wǎng)絡(luò)連接后,這個(gè)socket連接還可繼續(xù)使用,否則將不再使用.
// 默認(rèn)狀態(tài)是true,建議保持默認(rèn)。
pool.setFailback(true);
// 設(shè)置容錯(cuò)開關(guān)
// true:當(dāng)當(dāng)前socket不可用時(shí),程序會(huì)自動(dòng)查找可用連接并返回,否則返回NULL
// 默認(rèn)狀態(tài)是true,建議保持默認(rèn)。
pool.setFailover(true);
// 設(shè)置hash算法
// alg=0 使用String.hashCode()獲得hash code,該方法依賴JDK,可能和其他客戶端不兼容,建議不使用
// alg=1 使用original 兼容hash算法,兼容其他客戶端
// alg=2 使用CRC32兼容hash算法,兼容其他客戶端,性能優(yōu)于original算法
// alg=3 使用MD5 hash算法
// 采用前三種hash算法的時(shí)候,查找cache服務(wù)器使用余數(shù)方法。采用最后一種hash算法查找cache服務(wù)時(shí)使用consistent方法。
// 默認(rèn)值為0
pool.setHashingAlg(0);
// 設(shè)置是否使用Nagle算法,因?yàn)槲覀兊耐ㄓ崝?shù)據(jù)量通常都比較大(相對(duì)TCP控制數(shù)據(jù))而且要求響應(yīng)及時(shí),
// 因此該值需要設(shè)置為false(默認(rèn)是true)
pool.setNagle(false);
// 設(shè)置socket的讀取等待超時(shí)值
pool.setSocketTO(3000);
// 設(shè)置socket的連接等待超時(shí)值
pool.setSocketConnectTO(0);
// 初始化連接池
pool.initialize();
// 壓縮設(shè)置,超過(guò)指定大?。▎挝粸镵)的數(shù)據(jù)都會(huì)被壓縮
// mcc.setCompressEnable(true); //UnsupportedOperation
// mcc.setCompressThreshold(64 * 1024);
}
private MemCached() {
}
/**
* 獲取唯一實(shí)例.
* singleton
* @return
*/
public static MemCached getInstance() {
return memCached;
}
/**
* 添加一個(gè)指定的鍵值對(duì)到緩存中.
*
* @param key
* @param value
* @return
*/
public boolean add(String key, Object value) {
return mcc.add(key, value);
}
/**
* 添加一個(gè)指定的鍵值對(duì)到緩存中.
*
* @param key
* @param value
* @param expiry 多久之后過(guò)期
* @return
*/
public boolean add(String key, Object value, Date expiry) {
return mcc.add(key, value, expiry);
}
public boolean set(String key, Object value) {
return mcc.set(key, value);
}
public boolean set(String key, Object value, Date expiry) {
return mcc.set(key, value, expiry);
}
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);
}
/**
* 根據(jù)指定的關(guān)鍵字獲取對(duì)象.
*
* @param key
* @return
*/
public Object get(String key) {
return mcc.get(key);
}
}
MemCached
寫個(gè)Main方法測(cè)試下:
public static void main(String[] args) {
MemCached cache = MemCached.getInstance();
boolean result1 = cache.add("hello", 1234, new Date(1000 * 2));// 設(shè)置2秒后過(guò)期
System.out.println("第一次add : " + result1);
System.out.println("Value : " + cache.get("hello"));
boolean result2 =cache.add("hello", 12345, new Date(1000 * 2));// add fail
System.out.println("第二次add : " + result2);
boolean result3 =cache.set("hello", 12345, new Date(1000 * 2));// set successes
System.out.println("調(diào)用set : " + result3);
System.out.println("Value : " + cache.get("hello"));
try {
Thread.sleep(1000 * 2);
System.out.println("已經(jīng)sleep2秒了....");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Value : " + cache.get("hello"));
}
執(zhí)行結(jié)果如下:
第一次add : true Value : 1234 第二次add : false 調(diào)用set : true Value : 12345 已經(jīng)sleep2秒了.... Value : null
說(shuō)明:
1.第二次add失敗是因?yàn)?hello"這個(gè)key已經(jīng)存在了。
2.調(diào)用set成功,是因?yàn)閟et的時(shí)候覆蓋了已存在的鍵值對(duì),這正是add和set的不同之處
3.設(shè)置過(guò)期之間之后,cache按時(shí)自動(dòng)失效
上面的例子是對(duì)于基本數(shù)據(jù)類型,對(duì)于普通的POJO而言,如果要進(jìn)行存儲(chǔ)的話,那么比如讓其實(shí)現(xiàn)java.io.Serializable接口。
因?yàn)閙emcached是一個(gè)分布式的緩存服務(wù)器,多臺(tái)服務(wù)器間進(jìn)行數(shù)據(jù)共享需要將對(duì)象序列化的,所以必須實(shí)現(xiàn)該接口,否則會(huì)報(bào)錯(cuò)的(java.io.NotSerializableException)。
下面來(lái)試試POJO的存儲(chǔ):
package memcached.test;
public class Person implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
簡(jiǎn)單的POJO對(duì)象
Main方法如下:
public static void main(String[] args) {
MemCached cache = MemCached.getInstance();
Person p1 = new Person();
p1.setName("Jack");
cache.add("bean", p1);
Person p2 = (Person) cache.get("bean");
System.out.println("name=" + p2.getName());//Jack
p2.setName("Rose");
// cache.replace("bean", p2);
Person p3 = (Person) cache.get("bean");
System.out.println("name=" + p3.getName());
}
上面的代碼中,我們通過(guò)p2.setName("Rose")修改了對(duì)象的名字,
最后一行打印的會(huì)是什么呢?
name=Jack
name=JackWhy?
這是因?yàn)槲覀冃薷牡膶?duì)象并不是緩存中的對(duì)象,而是通過(guò)序列化過(guò)來(lái)的一個(gè)實(shí)例對(duì)象
那么要修改怎么辦?使用replace,注釋掉的那一行把注釋去掉就可以了。
四、其他
Memcached的命令參數(shù)說(shuō)明
-p <num> 監(jiān)聽的端口
-l <ip_addr> 連接的IP地址, 默認(rèn)是本機(jī)
-d start 啟動(dòng)memcached服務(wù)
-d restart 重起memcached服務(wù)
-d stop|shutdown 關(guān)閉正在運(yùn)行的memcached服務(wù)
-d install 安裝memcached服務(wù)
-d uninstall 卸載memcached服務(wù)
-u <username> 以<username>的身份運(yùn)行 (僅在以root運(yùn)行的時(shí)候有效)
-m <num> 最大內(nèi)存使用,單位MB。默認(rèn)64MB
-M 內(nèi)存耗盡時(shí)返回錯(cuò)誤,而不是刪除項(xiàng)
-c <num> 最大同時(shí)連接數(shù),默認(rèn)是1024
-f <factor> 塊大小增長(zhǎng)因子,默認(rèn)是1.25
-n <bytes> 最小分配空間,key+value+flags默認(rèn)是48
-h 顯示幫助
Memcached也可以在控制臺(tái)中添加鍵值對(duì),首先使用命令“telnet 127.0.0.1 11211”進(jìn)入到Memcached控制臺(tái),
然后使用set、add、replace、get、delete來(lái)操作。
更詳細(xì)操作可參照這里
五、Memcached的優(yōu)勢(shì)和不足
說(shuō)到Memcached的優(yōu)勢(shì),那當(dāng)然是:速度快,操作簡(jiǎn)便,易擴(kuò)展
不足的話,主要有2點(diǎn):
1.數(shù)據(jù)的臨時(shí)性(數(shù)據(jù)僅保存在內(nèi)存中)
2.只能通過(guò)指定鍵來(lái)讀取數(shù)據(jù),不支持模糊查詢
六、Memcached停止時(shí)的保障措施
如果數(shù)據(jù)庫(kù)的訪問量比較大,就需要提前做好準(zhǔn)備,以便應(yīng)對(duì)在memcached停止時(shí)發(fā)生的負(fù)載問題。
如果能在停止memcached之前,把數(shù)據(jù)復(fù)制到其他的server就好了。恩,這個(gè)可以通過(guò)repcached來(lái)實(shí)現(xiàn)。
repcached是日本人開發(fā)的實(shí)現(xiàn)memcached復(fù)制功能,
它是一個(gè)單master、單slave的方案,但它的master/slave都是可讀寫的,而且可以相互同步
如果master壞掉,slave偵測(cè)到連接斷了,它會(huì)自動(dòng)listen而成為master
- 修改ThinkPHP緩存為Memcache的方法
- php擴(kuò)展memcached和memcache的安裝配置方法
- php中用memcached實(shí)現(xiàn)頁(yè)面防刷新功能
- Memcached常用命令及使用說(shuō)明
- php中操作memcached緩存進(jìn)行增刪改查數(shù)據(jù)的實(shí)現(xiàn)代碼
- PHP+memcache實(shí)現(xiàn)消息隊(duì)列案例分享
- thinkPHP實(shí)現(xiàn)瀑布流的方法
- ThinkPHP自動(dòng)完成中使用函數(shù)與回調(diào)方法實(shí)例
- ThinkPHP中__initialize()和類的構(gòu)造函數(shù)__construct()用法分析
- thinkphp四種url訪問方式詳解
- thinkphp中memcache的用法實(shí)例
相關(guān)文章
本地搭建minio文件服務(wù)器(使用bat腳本啟動(dòng))的方法
這篇文章主要介紹了本地搭建minio文件服務(wù)器(使用bat腳本啟動(dòng))的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
在Windows平臺(tái)下安裝與配置Memcached的方法分享
在Windows平臺(tái)下安裝與配置Memcached的方法,Memcached 是一個(gè)高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng),用于動(dòng)態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫(kù)負(fù)載2012-05-05
用nginx+FastDFS一步步搭建文件管理系統(tǒng)
FastDFS 是一個(gè)開源的高性能分布式文件系統(tǒng)(DFS)。 它的主要功能包括:文件存儲(chǔ),文件同步和文件訪問,以及高容量和負(fù)載平衡。主要解決了海量數(shù)據(jù)存儲(chǔ)問題,特別適合以中小文件(建議范圍:4KB < file_size <500MB)為載體的在線服務(wù)2020-10-10
網(wǎng)站控制臺(tái)directadmin中文手冊(cè) Linux下虛擬主機(jī)管理
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn),本站所提供的攝影照片,插畫,設(shè)計(jì)作品,如需使用,請(qǐng)與原作者聯(lián)系2009-11-11
如何讓PHPnow支持wordpress靜態(tài)化鏈接的方法
這篇文章說(shuō)的是PNPnow 的,不過(guò)看了一下,應(yīng)該是說(shuō)的一回事,就是讓wordpress支持偽靜態(tài)2012-09-09
iis7 iis8反向代理規(guī)則編寫、安裝與配置方法
這篇文章主要介紹了iis7 iis8反向代理規(guī)則編寫、安裝與配置方法,需要的朋友可以參考下2020-04-04
深入解析Apache?Hudi內(nèi)核文件標(biāo)記機(jī)制
這篇文章主要為大家介紹了深入解析Apache?Hudi內(nèi)核文件標(biāo)記機(jī)制,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-03-03

