目錄索引:1.概念
? ? ? ? ? ? ? 2.安裝并使用memcached
? ? ? ? ? ? ? 3.對memcached進行curd操作
????????????? 4.用memcache擴展操作Memcached
????????????? 5.memcached機制深入理解
????????????? 6.memcache的細節
1.概念
Memcached是一個高性能的分布式的內存對象緩存系統,目前全世界不少人使用這個緩存項目來構建自己大負載的網站,來分擔數據庫的壓力,通過在內存里維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,然后從內存中讀取,從而大大提高讀取速度。相關網站: http://danga.com/ ? http://memcached.org
2.安裝并使用memcached
(1).下載memcached軟件
(2).運行cmd命令,切換到memcached.exe目錄,運行memecache.exe -d install
(3).啟動memcached
第一種方法:到【控制面板/服務】里啟動
第二種方法:cmd到memcached目錄,運行memcached.exe -d start
(4)用netstat -an查看11211端口是否在監聽,如果在監聽,說明啟動成功。
(補充:1.用netstat -anb可以看11211端口是哪個程序在監聽,同時可以看到那些用戶連接到我們的服務器 2.有名的端口1-1024 apache:80 mysql:3306 ftp:21 ssh:22 oracle:1521 stmp:25)
3.使用telnet連接到memcached服務
telnet 127.0.0.1 11211
如果不能使用telnet命令,拷貝一個telnet.exe放到c:/windows/system32就OK。
(1) 增加
基本語法:add key名 0 (存放時間)數據大小
例:add key1 0 30 5
hello
(2)獲取
基本語法:get key名
例:get key1
(3)修改
方式1:set key名 0 存放時間 數據大小
方式2:replace key名 0 存放時間 數據大小
例:set key100 0 70 6
ssssss
(4)刪除
基本語法:delete key名
例:delete key300
(補充:1.查看狀態stats 命中率cmd_set/cmd_get 2.清空內存數據flush_all 3.操作Memcached命令: http://wenku.baidu.com/link?url=2roCXD80HRkrRZ9prNXvTOeI15Tl4-w8l-JoJUmzti0S_Mp0EQJwaouiYOoIK0-1zT2CZHN54XehrUFo6r9W8Aqka4NQ4LmcuWeLoqZ17sa )
4.用memcache擴展操作Memcached
(1)安裝配置
①拷貝一個php_memcache.dll至php的ext目錄
②在php.ini開啟php_memcache.dll擴展
③重啟apache
(2)操作
代碼:
1
//
連接memcache服務器
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
}
//
存儲30天
37
if
(
$mem
->set('name2','moushu',MEMCACHE_COMPRESSED,
time
()+31*3600*24
)) {
38
echo
'add name2 ok!'
;
39
}
//
存儲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');
//
取對象時要先聲明類定義
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機制深入理解
(1)基于c/s架構 ,協議簡單
?● c/s架構,此時memcached為服務器端,我們可以使用如PHP,c/c++等程序連接memcached服務器。
?● memcached的服務器客戶端通信并不使用XML等格式,而使用簡單的基于文本行的協議。因此,通過telnet也能在memcached上保存數據、取得數據
?(2)基于libevent的事件處理
?● libevent是一套跨平臺的事件處理接口的封裝,能夠兼容包括這些操作系統: Windows/Linux/BSD/Solaris 等操作系統的的事件處理。
?● Memcached 使用libevent來進行網絡并發連接的處理,能夠保持在很大并發情況下,仍舊能夠保持快速的響應能力。
?(3)內置內存存儲方式
?● 為了提高性能,memcached中保存的數據都存儲在memcached內置的內存存儲空間中。由于數據僅存在于內存中,因此重啟memcached、重啟操作系統會導致全部數據消失。另外,內容容量達到指定值之后,就基于LRU(Least Recently Used)算法自動刪除不使用的緩存。memcached本身是為緩存而設計的服務器,因此并沒有過多考慮數據的永久性問題。
?(4)基于客戶端的分布式
?● memcached盡管是“分布式”緩存服務器,但服務器端并沒有分布式功能。各個memcached不會互相通信以共享信息。
代碼:
1
//
連接memcache服務器,啟動兩個服務器 (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
//將數據放入哪個memcache服務器,由客戶端的mem對象決定
11
//當執行addServer的時候,并不是立即去連接mem服務,而是通過計算,hash后采取決定連接哪個mem服務,因此當你大量加入服務器到連接池時并沒有多余的開銷。
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的細節
(1)生命周期
?從數據放入memcache開始計時,直到時間到了,就銷毀,如果時間為0,則表示不過期。memcache的數據被銷毀情況有:1.時間到了 ②重啟memcached服務 ③delete掉了
?(2)將 session數據 放入 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');
??? 一些說明: memcached 主要的目的是提速,數據不和用戶綁定(session數據存入memcache中以session id作為鍵值,任何可訪問memcache的人都可以取到值)。 session 數據和用戶綁定,更安全。
?(3) memcached 安全性
?? 通過啟用防火墻來防止外網訪問 memcached 服務,保證 memcached 的安全。 linux系統設置防火墻的命令:iptables?-a?input?-p?tcp?-s?127.0.0.1?-dport?11211?-j?ACCEPT
?(4)樣的數據適合放入 memcache 中?
?? 變化頻繁,具有不穩定的數據,不需要實時入庫(比如用戶在線狀態、在線人數 .... ),想加快用戶訪問應用的速度。大數據,如圖片、視頻不適合放入memcache中。
? 到這,時間再完善.....
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

