memcached

Memcache php

 

1、什麼是memcached

1、基本概念:

1memcached是一個高性能的分佈式的內存對象緩存系統,是爲了解決大型網站的提速而設計的一個軟件,主要緩存中間結果的數據。mysql

2Memcacheddanga的一個項目,最先是LiveJournal 服務的,最初爲了加速 LiveJournal 訪問速度而開發的,後來被不少大型的網站採用。 官方網站: www.danga.com   memcached.orglinux

2、緩存原理

減小數據庫訪問,提升Web速度算法

 

 

實質:不用去請求讀取mysql,減小mysql的併發量和讀寫量。sql

3、與mysql 進行比較

1)與mysql同樣,是一個c/s架構的軟件。數據庫

2mysql裏面的數據,是存儲到磁盤裏面的,memcache裏面的數據是存儲到內存裏面的,一旦斷電,服務器重啓,則會丟失數據。apache

3)要使用mysql則先要建立數據庫,再建立表,以及表結構。在memcache裏面數據的存儲是鍵值對。能夠理解成兩列的表, keyvalue緩存

name   小剛安全

age     12服務器

email    xiaogagn@sohu.com

 

2、安裝使用

方式一:直接使用,無需安裝,(在開發時推薦使用)

 

1)下載軟件,把軟件拷貝到指定位置,通常和其餘的安裝軟件(好比apache等)在同級目錄下面,主要是便於管理。

 

 

 

2)以cmd的方式,運行memcache

進入到memcached.exe文件所在的目錄,

幫助命令:Memcached   –h

 

開始cmd方式,運行memcache軟件。、

 

啓動後,該窗口不要關閉,一旦關閉,則服務就中止了。

 

方式二:把 memcahce安裝成window的一個服務,(在生產環境中推薦使用)

經過查看memcached 的幫助。

 

注意:在把 memcache安裝成window的一個服務時,要以管理員的方式啓動cmd.

 

查看服務是否安裝成功:

 

 

 

 

安裝可能失敗的緣由: 

(1) 若是你是用win7,win8系統,他對安全性要求高,所以,須要你們使用管理員的身份來安裝和啓動. 具體是 程序開始===>全部程序==附件==cmd(單擊右鍵,選擇以管理員的身份來執行)

(2)存放memcached.exe 目錄不要有中文或者特殊字符

(3)安裝成功,可是啓動會報告一個錯誤信息,提示缺乏xx.dll ,你能夠從別的機器拷貝該dll文件,而後放入到system32下便可.

 

3、操做memcached服務器

1memcachedclient-server (客戶端-服務器)

此時須要一個能夠與memcached服務器通訊的客戶端程序。該客戶端程序只要可鏈接上服務器,並向其發送簡單的文本指令便可。

典型的,telnet遠程登陸協議,

cmd中   telnet   IP地址  端口號

 

 

無需用戶名和密碼,沒有認證機制。

注意:telnet客戶端沒法使用的解決方案:

 

解決方案以下

(1) 打開控制面板,選擇卸載程序

 

2)選擇‘啓用或關閉window功能’

 

3)在彈出的窗口中,選擇telnet客戶端,前面勾上對勾便可。

 

修改完畢後,再次使用telnet localhost 8888 鏈接,會彈出以下指令,則表示鏈接成功。

 

2、設置數據

1)添加數據,

語法:add  key  是否壓縮(0|1)  緩存時間  數據的長度

key :鍵的名稱

是否壓縮0表示不壓縮,1表示要壓縮,壓縮的目的讓數據變小,存儲更多的數據。

緩存時間:失效時間,表示過了該時間數據就失效。

數據的長度:單位是字節,

 

注意:在使用add添加數據時,若是該鍵已經存在,則添加失敗,不會覆蓋。

 

 

z

2)修改數據

replace key  0|1  緩存時間  數據的長度

注意:若是鍵不存在,則修改失敗。

 

 

3)設置數據

set  key  0|1  緩存時間  數據長度

注意:若是鍵已經存在,則是修改,若是鍵不存在,則是添加。

 

 

3、刪除數據

語法:delete  key

 

 

 

flush_all 是刪除全部的緩存項

 

 

4、其餘命令 

incr  增長指定的值

語法:incr key number

 

 

decr  減小指定的值

 

 

 

好比有1000件商品,須要在60秒內搶購。

一開始就設置number的值爲1000   ,當用戶搶購時執行decr number ,若是執行後返回的值大於0則說明搶購成功,

5、狀態命令:

stats

 

 

經過查看狀態的參數,主要是計算命中率,

get_hits/cmd_get  ====得出一個命中率,命中率越高越好,若是命中率比較低,則須要調整緩存項。

 

6、緩存週期的問題

緩存週期有兩種設置方式:

1)時間間隔(秒數)

2)到期的時間戳,必須大於當前的時間戳纔有效。

思考:時間間隔和到期的時間戳都是整數,如何區分是時間戳仍是時間間隔。

若是使用時間間隔,則不能超過 2592000秒(30天)。

若是緩存時間小於2592000則是時間間隔,若是大於此值,小於當前的時間戳,則設置無效。

 

案例1:好比咱們想要設置緩存時間爲10天,如何設置

設置方式有兩種:

1)時間間隔10*24*3600

2)到期的時間戳:time()+10*24*3600

案例2:好比咱們想要設置緩存時間爲40天,如何設置,

只能使用到期的時間戳

time()+40*24*3600

 

注意:若是此值設置爲0代表此數據永不過時

 

好比以下測試,設置一個時間間隔大於2592000

 

 

 

4、php操做memcached

php做爲客戶端操做memcached

1、安裝擴展

注意:

PHP鏈接memcached服務器,須要引入相應的擴展才行.windowphp-memcache.dll

注意:window下找相應的dll時要很是當心.

須要考慮:

l php版本

l ts or nts

l vc6 or vc9

 

能夠經過phpinfo函數來查看PHP的環境,是ts的仍是nts,vc幾編譯的。

 

1)把memcached的擴展拷貝到的ext目錄下。

要注意:php的版本不一樣,則使用的擴展不一樣。

 

 

 

2)打開php.ini文件引入擴展

 

3)測試查看,使用phpinfo函數

 

 

 

該擴展提供的一套oop的程序,參考php手冊

 

2、入門應用,實例化和鏈接服務器

 

提供了OOP語法,管理memcached服務器:

鏈接memcache

$mem = new Memcache();

$mem->connect(‘ip地址’,’端口’);

設置:

$memcache->add(, 值, 是否壓縮, 有效期);//若是鍵已經存在,則添加失敗,不會覆蓋掉。

$memcache->replace(鍵, 值, 是否壓縮, 有效期);

$memcache->set(鍵, 值, 是否壓縮, 有效期);

$memcache->increment(鍵,步長);

$memcache->decrement(鍵,步長);

獲取:

$memcache->get(key);

刪除:

$memcache->delete(key);刪除某個鍵

$memcache->flush(void);刪除所有鍵

關閉鏈接:

$memcache->close();

 

 

 

 

效果以下;

 

3memcachedphp數據類型的支持

探討php中有哪些數據類型能夠添加到memcache中。

兩大類:

標量和非標量

 

標量數據存儲案例

 

 

效果以下;

 

 

黑窗口裏面獲取數據,

 

總結:標量則將其內容轉換成字符串進行存儲。

非標量數據存儲;

 

 

獲取數據

 

效果以下;

-

非標量:序列化後再存儲到memcached服務器中,保存數據原有類型,獲取數據時,再反序列化。

注意:資源類型不能被合理的序列化。

 

 

注意:序列化與反序列化的工做在,memcached客戶端,setget方法中完成的,咱們無需手動序列化。

is_scalar()能夠判斷是不是標量類型。

什麼是序列化?

就是在保存數據時,不但保存數據自己,還保存數據類型。

1)利於在網絡間進行數據傳輸。

2)便於從新讀取並恢復數據。

 

4、入門案例

想把一個sql語句的執行結果,給緩存到memcache裏面。

 

要注意說明的,sql語句執行的結果數據要小於1MB

mecache 裏面,鍵與值是有要求的,

鍵的長度要小於250字節。

數據值的大小要小於1MB

 

 

 

 

 

思路:

第一次訪問時經過sql取出一些數據,把sql語句取出的數據添加到memcache緩存中。

第二次訪問,先判斷memcache裏面有沒有數據,有直接返回,若沒有則從數據庫裏面取出。

5memcachetp框架裏面使用

分兩步:

1)初始化memcache

S(array(

‘type’=>’memcache’,

‘host’=>’ip地址’,

‘port’=>端口號

));

2)具體的操做

獲取數據;

$data = S(key);

設置數據:

S(key,value,失效時間);

清空數據:

S(key,null)

添加數據操做

 

獲取數據操做

 

刪除數據操做

 

5、分佈式緩存服務器的搭建

1、介紹

分佈式部署:要架設多臺memcache服務器支撐業務的發展,這樣每臺服務器承擔的工做就會少一些,總體上memcache服務器性能就有所提升

如今以下有問題,

php須要思考哪一個key存儲到哪一個服務器裏邊,php還須要思慮從哪一個服務器讀取一個指定的key出來----算法。

一個分佈式的memcached服務器集羣,由兩部分組成,

第一:多臺memcached服務器 第二:分佈式算法(內置的,咱們無需干預)

 

原理圖:

 

 

實現原理

 

分佈式算法由memcache客戶端來實現,由php提供的memcached擴展來實現。算法都是內置的,無需咱們參與。

利用key,來肯定當前數據在哪臺memcache服務器中進行存儲。

2、搭建的步驟:

開啓不一樣的端口,來模擬兩臺memcache服務器。

開啓第一臺:

 

開啓第二臺

 

注意:使用$memcache->addServer()方法,能夠添加多臺memcached服務器的目的

 

具體的代碼

 

 

取出數據的代碼

 

 

6、session數據入memcache裏面

1、原理圖:

 

2、具體的操做

1)打開php.ini文件,配置session文件的存儲方式

session.save_handler = files [user|memcache],

 

2session文件的存儲路徑,多個用逗號隔開。

session.save_path,tcp://127.0.0.1:11211

 

配置完要重啓apache

3)具體的代碼完成,常規使用session便可。

注意:可使用ini_set()函數完成,在當前頁面有效:

ini_set(‘session.save_handler’,’memcache’)

ini_set(‘session.save_path’,’tcp://127.0.0.1:11211’)

設置數據

注意:使用session的方式和之前是同樣的。

 

取出的數據

 

session信息存儲到memcache裏面是以sessionid爲鍵的,失效時間與session相同的。

 

7、memcache其餘問題

1memcache適合於存儲哪些數據

1)安全性不是很高的數據,丟失無所謂的數據,由於memcache服務器,一旦重啓或關機,則會丟失全部的數據。

2)查詢比較頻繁,改動週期比較長的數據,好比熱點新聞,等等。

3)一個鍵值,數據量不要很大,要小於1MB的數據。

 

2、安全性完整性問題

memcache自己沒有提供任何的認證機制。

若是須要請求鏈接限制,須要使用操做系統上的限制。

經過防火牆,iptables,selinux

常規的memcached服務器,是運行在內網中的,不是公網。

除此以外:

-l 表示當前memcache服務器,監聽的哪一個ip地址的請求。在有多個有效ip的狀況下,僅僅監聽哪一個ip進來的請求。

-l後的參數僅僅能夠設置爲本身服務器存在的真實ip

 

3、緩存失效問題

memcache裏面數據過時後,不會自動刪除,當get時,發現過時後,才刪除該數據。

Lazy Expiration

memcached內部不會監視記錄是否過時,而是在get時查看記錄的時間戳,檢查記錄是否過

期。這種技術被稱爲lazy(惰性)expiration。

所以,memcached不會在過時監視上耗費CPU時間。

4、緩存已滿,刪除舊數據

LRU,least Recently Used,最近最少使用原則。

memcache在插入新數據時,若是空間不足時,採用刪除舊緩存項策略,刪除最不活躍的緩存項。

相關文章
相關標籤/搜索