目錄索引:1.概念
? ? ? ? ? ? ? 2.安裝并使用memcached
? ? ? ? ? ? ? 3.對(duì)memcached進(jìn)行curd操作
????????????? 4.用memcache擴(kuò)展操作Memcached
????????????? 5.memcached機(jī)制深入理解
????????????? 6.memcache的細(xì)節(jié)
1.概念
Memcached是一個(gè)高性能的分布式的內(nèi)存對(duì)象緩存系統(tǒng),目前全世界不少人使用這個(gè)緩存項(xiàng)目來(lái)構(gòu)建自己大負(fù)載的網(wǎng)站,來(lái)分擔(dān)數(shù)據(jù)庫(kù)的壓力,通過(guò)在內(nèi)存里維護(hù)一個(gè)統(tǒng)一的巨大的hash表,它能夠用來(lái)存儲(chǔ)各種格式的數(shù)據(jù),包括圖像、視頻、文件以及數(shù)據(jù)庫(kù)檢索的結(jié)果等。簡(jiǎn)單的說(shuō)就是將數(shù)據(jù)調(diào)用到內(nèi)存中,然后從內(nèi)存中讀取,從而大大提高讀取速度。相關(guān)網(wǎng)站: http://danga.com/ ? http://memcached.org
2.安裝并使用memcached
(1).下載memcached軟件
(2).運(yùn)行cmd命令,切換到memcached.exe目錄,運(yùn)行memecache.exe -d install
(3).啟動(dòng)memcached
第一種方法:到【控制面板/服務(wù)】里啟動(dòng)
第二種方法:cmd到memcached目錄,運(yùn)行memcached.exe -d start
(4)用netstat -an查看11211端口是否在監(jiān)聽(tīng),如果在監(jiān)聽(tīng),說(shuō)明啟動(dòng)成功。
(補(bǔ)充:1.用netstat -anb可以看11211端口是哪個(gè)程序在監(jiān)聽(tīng),同時(shí)可以看到那些用戶連接到我們的服務(wù)器 2.有名的端口1-1024 apache:80 mysql:3306 ftp:21 ssh:22 oracle:1521 stmp:25)
3.使用telnet連接到memcached服務(wù)
telnet 127.0.0.1 11211
如果不能使用telnet命令,拷貝一個(gè)telnet.exe放到c:/windows/system32就OK。
(1) 增加
基本語(yǔ)法:add key名 0 (存放時(shí)間)數(shù)據(jù)大小
例:add key1 0 30 5
hello
(2)獲取
基本語(yǔ)法:get key名
例:get key1
(3)修改
方式1:set key名 0 存放時(shí)間 數(shù)據(jù)大小
方式2:replace key名 0 存放時(shí)間 數(shù)據(jù)大小
例:set key100 0 70 6
ssssss
(4)刪除
基本語(yǔ)法:delete key名
例:delete key300
(補(bǔ)充:1.查看狀態(tài)stats 命中率cmd_set/cmd_get 2.清空內(nèi)存數(shù)據(jù)flush_all 3.操作Memcached命令: http://wenku.baidu.com/link?url=2roCXD80HRkrRZ9prNXvTOeI15Tl4-w8l-JoJUmzti0S_Mp0EQJwaouiYOoIK0-1zT2CZHN54XehrUFo6r9W8Aqka4NQ4LmcuWeLoqZ17sa )
4.用memcache擴(kuò)展操作Memcached
(1)安裝配置
①拷貝一個(gè)php_memcache.dll至php的ext目錄
②在php.ini開(kāi)啟php_memcache.dll擴(kuò)展
③重啟apache
(2)操作
代碼:
1
//
連接memcache服務(wù)器
2
$mem
=
new
Memcache();
3
if
(!
$mem
->connect('localhost',11211
)) {
4
die
('connect error!'
);
5
}
6
//
增加
7
if
(
$mem
->set('key1','val1',MEMCACHE_COMPRESSED,60
)) {
8
echo
'add ok!'
;
9
}
10
$arr
=
array
('moushu','yunshu'
);
11
if
(
$mem
->set('arr',
$arr
,MEMCACHE_COMPRESSED,60
)) {
12
echo
'add ok!'
;
13
}
14
class
Dog {
15
public
$name
;
16
public
$age
;
17
}
18
$dog
=
new
Dog();
19
if
(
$mem
->set('dog',
$dog
,MEMCACHE_COMPRESSED,60
)) {
20
echo
'add ok!'
;
21
}
22
$null_val
=
null
;
23
if
(
$mem
->set('null_val',
$null_val
,MEMCACHE_COMPRESSED,60
)) {
24
echo
'add ok!'
;
25
}
26
$bool_val
=
null
;
27
if
(
$mem
->set('bool_val',
false
,MEMCACHE_COMPRESSED,60
)) {
28
echo
'add ok!'
;
29
}
30
$handle
=
fopen
('2.php','a'
);
31
if
(
$mem
->set('res',
$handle
,MEMCACHE_COMPRESSED,60
)) {
32
echo
'add res ok!'
;
33
}
34
if
(
$mem
->set('name','luoyunshu',MEMCACHE_COMPRESSED,30*3600*24
)) {
35
echo
'add name ok!'
;
36
}
//
存儲(chǔ)30天
37
if
(
$mem
->set('name2','moushu',MEMCACHE_COMPRESSED,
time
()+31*3600*24
)) {
38
echo
'add name2 ok!'
;
39
}
//
存儲(chǔ)31天
40
41
//修改
42
if
(
$mem
->replace('key1','hello',MEMCACHE_COMPRESSED,60
)) {
43
echo
'add ok!'
;
44
}
45
46
//
刪除
47
if
(
$mem
->delete('key1'
)) {
48
echo
'del ok!'
;
49
}
50
51
//
查詢
52
$val
=
$mem
->get('key1'
);
53
echo
$val
;
54
$val
=
$mem
->get('arr'
);
55
var_dump
(
$val
);
56
$dog
=
$mem
->get('dog');
//
取對(duì)象時(shí)要先聲明類定義
57
var_dump
(
$dog
);
58
$null_val
=
$mem
->get('null_val'
);
59
var_dump
(
$null_val
);
//
null
60
$bool_val
=
$mem
->get('bool_val'
);
61
var_dump
(
$bool_val
);
//
''
62
$res
=
$mem
->get('res'
);
63
var_dump
(
$res
);
//
0
64
$res
=
$mem
->get('key1'
);
65
var_dump
(
$res
);
66
$name
=
$mem
->get('name'
);
67
var_dump
(
$name
);
68
$name2
=
$mem
->get('name2'
);
69
var_dump
(
$name2
);
//
moushu
?5.memcached機(jī)制深入理解
(1)基于c/s架構(gòu) ,協(xié)議簡(jiǎn)單
?● c/s架構(gòu),此時(shí)memcached為服務(wù)器端,我們可以使用如PHP,c/c++等程序連接memcached服務(wù)器。
?● memcached的服務(wù)器客戶端通信并不使用XML等格式,而使用簡(jiǎn)單的基于文本行的協(xié)議。因此,通過(guò)telnet也能在memcached上保存數(shù)據(jù)、取得數(shù)據(jù)
?(2)基于libevent的事件處理
?● libevent是一套跨平臺(tái)的事件處理接口的封裝,能夠兼容包括這些操作系統(tǒng): Windows/Linux/BSD/Solaris 等操作系統(tǒng)的的事件處理。
?● Memcached 使用libevent來(lái)進(jìn)行網(wǎng)絡(luò)并發(fā)連接的處理,能夠保持在很大并發(fā)情況下,仍舊能夠保持快速的響應(yīng)能力。
?(3)內(nèi)置內(nèi)存存儲(chǔ)方式
?● 為了提高性能,memcached中保存的數(shù)據(jù)都存儲(chǔ)在memcached內(nèi)置的內(nèi)存存儲(chǔ)空間中。由于數(shù)據(jù)僅存在于內(nèi)存中,因此重啟memcached、重啟操作系統(tǒng)會(huì)導(dǎo)致全部數(shù)據(jù)消失。另外,內(nèi)容容量達(dá)到指定值之后,就基于LRU(Least Recently Used)算法自動(dòng)刪除不使用的緩存。memcached本身是為緩存而設(shè)計(jì)的服務(wù)器,因此并沒(méi)有過(guò)多考慮數(shù)據(jù)的永久性問(wèn)題。
?(4)基于客戶端的分布式
?● memcached盡管是“分布式”緩存服務(wù)器,但服務(wù)器端并沒(méi)有分布式功能。各個(gè)memcached不會(huì)互相通信以共享信息。
代碼:
1
//
連接memcache服務(wù)器,啟動(dòng)兩個(gè)服務(wù)器 (memcached.exe -p 9999
2
$mem
=
new
Memcache();
3
if
(!
$mem
->addServer('localhost',11211
)) {
4
die
('connect server1 error!'
);
5
}
//
serv1
6
if
(!
$mem
->addServer('localhost',9999
)) {
7
die
('connect server2 error!'
);
8
}
//
serv2
9
10
//將數(shù)據(jù)放入哪個(gè)memcache服務(wù)器,由客戶端的mem對(duì)象決定
11
//當(dāng)執(zhí)行addServer的時(shí)候,并不是立即去連接mem服務(wù),而是通過(guò)計(jì)算,hash后采取決定連接哪個(gè)mem服務(wù),因此當(dāng)你大量加入服務(wù)器到連接池時(shí)并沒(méi)有多余的開(kāi)銷。
12
if
(
$mem
->set('key1','val1',MEMCACHE_COMPRESSED,120
)) {
13
echo
'add key1 ok!'
;
14
}
//
放在serv1
15
if
(
$mem
->set('key2','val2',MEMCACHE_COMPRESSED,120
)) {
16
echo
'add key2 ok!'
;
17
}
//
放在serv2
18
if
(
$mem
->set('key3','val3',MEMCACHE_COMPRESSED,120
)) {
19
echo
'add key3 ok!'
;
20
}
//
放在serv1
21
22
$res1
=
$mem
->get('key1'
);
23
$res2
=
$mem
->get('key2'
);
24
$res3
=
$mem
->get('key3'
);
25
echo
$res1
;
26
echo
$res2
;
27
echo
$res3
;
?6.memcache的細(xì)節(jié)
(1)生命周期
?從數(shù)據(jù)放入memcache開(kāi)始計(jì)時(shí),直到時(shí)間到了,就銷毀,如果時(shí)間為0,則表示不過(guò)期。memcache的數(shù)據(jù)被銷毀情況有:1.時(shí)間到了 ②重啟memcached服務(wù) ③delete掉了
?(2)將 session數(shù)據(jù) 放入 memcached 中
??? ①.配置:
??? 第一種方法:修改php.ini 文件,修改如下:
????? save-handler=memcache
???? session.save_path?=?"tcp://localhost:11211"
??? 第二種方法,使用ini_set()
??? ini_set('session.save_handler','memcache');
??? ini_set('session.save_path','tcp://localhost:11211');
??? 一些說(shuō)明: memcached 主要的目的是提速,數(shù)據(jù)不和用戶綁定(session數(shù)據(jù)存入memcache中以session id作為鍵值,任何可訪問(wèn)memcache的人都可以取到值)。 session 數(shù)據(jù)和用戶綁定,更安全。
?(3) memcached 安全性
?? 通過(guò)啟用防火墻來(lái)防止外網(wǎng)訪問(wèn) memcached 服務(wù),保證 memcached 的安全。 linux系統(tǒng)設(shè)置防火墻的命令:iptables?-a?input?-p?tcp?-s?127.0.0.1?-dport?11211?-j?ACCEPT
?(4)樣的數(shù)據(jù)適合放入 memcache 中?
?? 變化頻繁,具有不穩(wěn)定的數(shù)據(jù),不需要實(shí)時(shí)入庫(kù)(比如用戶在線狀態(tài)、在線人數(shù) .... ),想加快用戶訪問(wèn)應(yīng)用的速度。大數(shù)據(jù),如圖片、視頻不適合放入memcache中。
? 到這,時(shí)間再完善.....
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

