帶你走進memcache,老牌記憶體快取技術

一.核心優化概述

什麼是優化:以更小的資源支援更大負載網站的運行,以小博大。

思路:盡量減少用戶等待時間,節省系統資源開銷,節省頻寬使用。

優化什麼地方?有三方面:Memcache記憶體快取技術、靜態化技術、mysql優化

十分钟学会memcache,比你想象的要简单

二.Memcache

記憶體快取技術:memcache是實現php語言 對記憶體 進行操作的中間介質。

十分钟学会memcache,比你想象的要简单

memcache與redis的區別和聯繫

redis:支援比較多的數據類型(String/list/set/sortset/hash),redis支援集合計算的(set類型支援),每個key最大數據存儲量為1G,redis是新興的記憶體快取技術,對各方面支援不完善,支援持久化操作。

memcache:老牌的記憶體快取技術,對相關領域支援比較豐富,window和linux都可以使用,各種框架(tp/yii等等)都支援使用,session的資訊可以非常方便的保存到該memcache中,每個key保存的數據量最大為1M,支援的數據類型比較單一,就是String類型,不支援持久化。

兩者的相同之處在於把數據保存在記憶體中。

注意:以上的區別必須要知道哦,在進行選擇第三方優化的時候,就可以根據實際情況來定了!

安裝memcache

1, 複製伺服器端文件到運行目錄

複製memcached.exe文件到運行目錄(如:H:/memcached.exe):

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

啟動memcache服務

前台方式memcache啟動服務

十分钟学会memcache,比你想象的要简单

默認是前台啟動,Ctrl+C可以結束該前台進程。

此時,進程裡邊已經有memcache服務:

十分钟学会memcache,比你想象的要简单

memcache相關參數設置:

十分钟学会memcache,比你想象的要简单

通過具體參數設置啟動memcache的格式:

十分钟学会memcache,比你想象的要简单

給memcache設置開機啟動項服務

十分钟学会memcache,比你想象的要简单

設置開機啟動項服務:

十分钟学会memcache,比你想象的要简单

生成開機啟動項服務:

十分钟学会memcache,比你想象的要简单

通過命名方式啟動服務:

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

php中安裝memcache擴展

複製如圖文件到php擴展目錄:

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

修改php.ini,使其開啟memcache擴展:

十分钟学会memcache,比你想象的要简单

之後重啟apache即可。php開啟memcache擴展成功

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

php對memcache的使用

十分钟学会memcache,比你想象的要简单

memcache在php中就是一個操作類,具體使用:實例化對象、對象調用成員的過程。

php中連接memcache伺服器:

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

php中memcache的使用,其數據模型與redis一致,為 key - value。

在php中給memcache設置一個key,名稱為「weather」

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

對weather 的key再進行查詢操作:

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

key的名字:該key的名字的組成部分與redis比較相似,基本鍵盤可以輸入的資訊都可以作為key的名字部分,key的長度最大是250位元組。

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

有效期事宜:$me -> set(key, value, 是否壓縮, 有效期 秒);

有效期設置有兩種方式:

A. 時間差設置:從當前的時間點項後順延指定秒的時間就到期(過期)

$me -> set(key, value, 是否壓縮, 120); //向後120秒到期,該方式有限制:最多的時間差就是30天(2592000秒)

B. 時間戳設置:從1970-1-1 0:0:0 到現在經過的秒數,$me -> set(key, value, 是否壓縮, time()+120); //向後120秒到期

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

時間差方式的有效期最大為30天:

(如果需要設置key的有效期時間大於30天的,就必須使用「時間戳」方式設置)

十分钟学会memcache,比你想象的要简单

各種數據類型的存儲:php的數據類型:標量類型:int string boolean float 複合類型:array object resource null

memcache存儲標量類型數據,把他們都轉化為」String字元串」類型存儲。

存儲複合類型數據,直接「原型」存儲。

標量類型的存儲:

十分钟学会memcache,比你想象的要简单

標量類型資訊在memcache中都變為「String字元串」類型資訊

十分钟学会memcache,比你想象的要简单

複合類型資訊存儲:在memcache中直接是「原型」存儲。

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

原型存儲對資源的消耗比較大,為了節省資源,可以把複合類型資訊都變為字元串形式進行存儲,這樣就需要對複合資訊進行 序列化 操作: serialize() unserialize()

壓縮選項

$me -> set(key, value, 是否壓縮0/1, 有效期 秒);

是否壓縮的特點:壓縮:記憶體空間節省、運行速度稍慢。未壓縮:記憶體空間佔據少多、運行速度快。

壓縮原理是zlib技術:

十分钟学会memcache,比你想象的要简单

zlib---->php----->memcache

其他相關操作方法可以參考對應的文檔,這裡就不加以贅述了!直接進入重點

總結:

1. memcache安裝和開啟服務使用:開啟服務:① 前台開啟 ② 設置開機啟動項服務

2. 給php開放memcache擴展:① 複製擴展文件php_memcache.dll、② php.ini 打開擴展參數

3. php裡邊操作memcache:① 實例化對象、② 對象連接伺服器、③ 對象調用相關方法實現具體操作

set(key,value,壓縮,有效期) ,get() delete() connect()

終端操作memcache

連接memcache:利用協議 telnet(遠程連接協議),實現對memcache的操作。

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

利用終端操作memcache

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

查看memcache的狀態:

十分钟学会memcache,比你想象的要简单

分散式部署memcache

分散式:把原先有一台memcache伺服器做的工作,現在分攤到多台memcache執行。這樣會降低memcache的工作負載。

例如:一台memcache需要存儲100w的key,如果有5個伺服器,則每個伺服器存儲20w的可以。

該分散式與redis的主從模式比較相似,但是他們不一樣

redis:其為主從模式,一個redis負責數據寫入,其他多個redis負責數據讀取

memcache:其不是主從模式,該分散式是平均分攤工作,每個子伺服器之間都是平級的,每個伺服器都要執行數據的寫入、讀取操作。

下圖為memcache中分散式的示意圖:

從圖中可以看到,memcache本身有演算法,可以保證數據「平均」地存儲在不同的伺服器裡邊,php語言和各個伺服器之間也通過該演算法銜接,進一步講,php內部的實現與之前的程式碼風格保持一致即可。

十分钟学会memcache,比你想象的要简单

memcache分散式具體實現類型:

① 在一個伺服器裡邊,開啟多個memcache服務

② 買多個伺服器,每個伺服器裡邊安裝一個memcache服務

使用分散式:開啟多個memcache服務:

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

注意:memcache集群使用的時候,key的設置和獲取,他們的伺服器順序必須嚴格一致,否則數據的使用有錯誤。

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

數據讀取失敗:

十分钟学会memcache,比你想象的要简单

快取失效

超過有效期:具體是通過「懶惰」機制刪除該過期數據,與過期session的刪除類似。

過期session刪除機制:session是以文件形式保存的硬碟中,如果有的session文件已經過期了,則該session文件不會立即被刪除,而是後期其他用戶訪問網站使用session的同時會有一定的幾率觸發刪除過期的session文件。

memcache的過期數據刪除也是懶惰機制實現,如果有一個key過期了,其本身不會馬上被刪除,而是我們調用get方法獲取數據的同時會刪除該過期的數據。

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

快取空間耗盡

如果存儲的數據超過memcache最大的存儲限制(默認是64M),此時還繼續存入數據,則會把最近不常使用的key就刪除了。該機制名稱為LRU(least recently use)優先刪除最近很好使用的key。

十分钟学会memcache,比你想象的要简单

該LRU機制可以根據實際情況禁用,如果繼續使用滿載的memcache則系統要報錯。

(開啟服務的同時可以設置-M參數,禁用LRU機制)

十分钟学会memcache,比你想象的要简单

session存入memcache

session可以存入mysql資料庫中。

需求:一個大型的網站開發完畢,內部涉及的伺服器一般是有多個組成的,多台伺服器彼此之間需要共享session資訊,這樣就要求session勢必要存入mysql或memcache中。

session的資訊以文件形式存儲在伺服器內部,不能實現多個伺服器共享,只有存入的mysql或memcache中才可以實現數據共享。

十分钟学会memcache,比你想象的要简单

mysql或memcache可以實現多個伺服器彼此之間共享session資訊。

具體使用:php.ini裡邊有session存儲的方式和保存位置設置參數:

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

session資訊存儲到memcache的key的名稱為session_id():

在終端裡邊把session資訊給獲得出來:

十分钟学会memcache,比你想象的要简单

分散式集群設置:

十分钟学会memcache,比你想象的要简单

memcache案例

網站有一個頁面,內部需要獲得許多數據資訊,該數據資訊在短時間內不發生變化,為了降低mysql的負載,就把這些數據獲得出來存入到memacache中過去,供後續訪問。

十分钟学会memcache,比你想象的要简单

十分钟学会memcache,比你想象的要简单

第一次使用,快取沒有數據,就從mysql資料庫獲得數據,提供給用戶,同時把數據存儲給快取供後續使用

第二次(後續)使用,快取有數據,就直接提供使用即可。

最後再談與redis的區別:

redis分散式:主從模式

memcache分散式:把key平均分配到各個伺服器,addServer(主機名,埠);

注意:key的設置和讀取的多個memcache的載入順序要保持一致

分散式類型:① 一台伺服器多個服務、② 多台伺服器多個服務

redis: 可以存儲稍微複雜的數據(list、set、sortset、hash)用於集合計算

memcache: 支援領域比較多(win系統和linux系統都可以使用、各種框架支援使用、允許把session資訊存入memcache中)一般存儲的資訊比較簡單,例如字元串型資訊,就可以使用memcache