帶你走進memcache,老牌內存緩存技術

一.核心優化概述

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

思路:儘可能減小用戶等待時間,節省系統資源開銷,節省帶寬使用。mysql

優化什麼地方?有三方面:Memcache內存緩存技術、靜態化技術、mysql優化linux

十分鐘學會memcache,比你想象的要簡單

二.Memcache

內存緩存技術:memcache是實現php語言 對內存 進行操做的中間介質。redis

十分鐘學會memcache,比你想象的要簡單

memcache與redis的區別和聯繫

redis:支持比較多的數據類型(String/list/set/sortset/hash),redis支持集合計算的(set類型支持),每一個key最大數據存儲量爲1G,redis是新興的內存緩存技術,對各方面支持不完善,支持持久化操做。算法

memcache:老牌的內存緩存技術,對相關領域支持比較豐富,window和linux均可以使用,各類框架(tp/yii等等)都支持使用,session的信息能夠很是方便的保存到該memcache中,每一個key保存的數據量最大爲1M,支持的數據類型比較單一,就是String類型,不支持持久化。sql

二者的相同之處在於把數據保存在內存中。數據庫

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

安裝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

相關文章
相關標籤/搜索