一.核心優化概述
什么是優化:以更小的資源支持更大負載網站的運行,以小博大。
思路:盡量減少用戶等待時間,節省系統資源開銷,節省帶寬使用。
優化什么地方?有三方面:Memcache內存緩存技術、靜態化技術、mysql優化
二.Memcache
內存緩存技術:memcache是實現php語言 對內存 進行操作的中間介質。
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啟動服務
默認是前台啟動,Ctrl+C可以結束該前台進程。
此時,進程里邊已經有memcache服務:
memcache相關參數設置:
通過具體參數設置啟動memcache的格式:
給memcache設置開機啟動項服務
設置開機啟動項服務:
生成開機啟動項服務:
通過命名方式啟動服務:
php中安裝memcache擴展
復制如圖文件到php擴展目錄:
修改php.ini,使其開啟memcache擴展:
之后重啟apache即可。php開啟memcache擴展成功
php對memcache的使用
memcache在php中就是一個操作類,具體使用:實例化對象、對象調用成員的過程。
php中連接memcache服務器:
php中memcache的使用,其數據模型與redis一致,為 key - value。
在php中給memcache設置一個key,名稱為“weather”
對weather 的key再進行查詢操作:
key的名字:該key的名字的組成部分與redis比較相似,基本鍵盤可以輸入的信息都可以作為key的名字部分,key的長度最大是250字節。
有效期事宜:$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秒到期
時間差方式的有效期最大為30天:
(如果需要設置key的有效期時間大於30天的,就必須使用“時間戳”方式設置)
各種數據類型的存儲:php的數據類型:標量類型:int string boolean float 復合類型:array object resource null
memcache存儲標量類型數據,把他們都轉化為”String字符串”類型存儲。
存儲復合類型數據,直接“原型”存儲。
標量類型的存儲:
標量類型信息在memcache中都變為“String字符串”類型信息
復合類型信息存儲:在memcache中直接是“原型”存儲。
原型存儲對資源的消耗比較大,為了節省資源,可以把復合類型信息都變為字符串形式進行存儲,這樣就需要對復合信息進行 序列化 操作: serialize() unserialize()
壓縮選項
$me -> set(key, value, 是否壓縮0/1, 有效期 秒);
是否壓縮的特點:壓縮:內存空間節省、運行速度稍慢。未壓縮:內存空間占據少多、運行速度快。
壓縮原理是zlib技術:
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需要存儲100w的key,如果有5個服務器,則每個服務器存儲20w的可以。
該分布式與redis的主從模式比較相似,但是他們不一樣
redis:其為主從模式,一個redis負責數據寫入,其他多個redis負責數據讀取
memcache:其不是主從模式,該分布式是平均分攤工作,每個子服務器之間都是平級的,每個服務器都要執行數據的寫入、讀取操作。
下圖為memcache中分布式的示意圖:
從圖中可以看到,memcache本身有算法,可以保證數據“平均”地存儲在不同的服務器里邊,php語言和各個服務器之間也通過該算法銜接,進一步講,php內部的實現與之前的代碼風格保持一致即可。
memcache分布式具體實現類型:
① 在一個服務器里邊,開啟多個memcache服務
② 買多個服務器,每個服務器里邊安裝一個memcache服務
使用分布式:開啟多個memcache服務:
注意:memcache集群使用的時候,key的設置和獲取,他們的服務器順序必須嚴格一致,否則數據的使用有錯誤。
數據讀取失敗:
緩存失效
超過有效期:具體是通過“懶惰”機制刪除該過期數據,與過期session的刪除類似。
過期session刪除機制:session是以文件形式保存的硬盤中,如果有的session文件已經過期了,則該session文件不會立即被刪除,而是后期其他用戶訪問網站使用session的同時會有一定的幾率觸發刪除過期的session文件。
memcache的過期數據刪除也是懶惰機制實現,如果有一個key過期了,其本身不會馬上被刪除,而是我們調用get方法獲取數據的同時會刪除該過期的數據。
緩存空間耗盡
如果存儲的數據超過memcache最大的存儲限制(默認是64M),此時還繼續存入數據,則會把最近不常使用的key就刪除了。該機制名稱為LRU(least recently use)優先刪除最近很好使用的key。
該LRU機制可以根據實際情況禁用,如果繼續使用滿載的memcache則系統要報錯。
(開啟服務的同時可以設置-M參數,禁用LRU機制)
session存入memcache
session可以存入mysql數據庫中。
需求:一個大型的網站開發完畢,內部涉及的服務器一般是有多個組成的,多台服務器彼此之間需要共享session信息,這樣就要求session勢必要存入mysql或memcache中。
session的信息以文件形式存儲在服務器內部,不能實現多個服務器共享,只有存入的mysql或memcache中才可以實現數據共享。
mysql或memcache可以實現多個服務器彼此之間共享session信息。
具體使用:php.ini里邊有session存儲的方式和保存位置設置參數:
session信息存儲到memcache的key的名稱為session_id():
在終端里邊把session信息給獲得出來:
分布式集群設置:
memcache案例
網站有一個頁面,內部需要獲得許多數據信息,該數據信息在短時間內不發生變化,為了降低mysql的負載,就把這些數據獲得出來存入到memacache中過去,供后續訪問。
第一次使用,緩存沒有數據,就從mysql數據庫獲得數據,提供給用戶,同時把數據存儲給緩存供后續使用
第二次(后續)使用,緩存有數據,就直接提供使用即可。
最后再談與redis的區別:
redis分布式:主從模式
memcache分布式:把key平均分配到各個服務器,addServer(主機名,端口);
注意:key的設置和讀取的多個memcache的加載順序要保持一致
分布式類型:① 一台服務器多個服務、② 多台服務器多個服務
redis: 可以存儲稍微復雜的數據(list、set、sortset、hash)用於集合計算
memcache: 支持領域比較多(win系統和linux系統都可以使用、各種框架支持使用、允許把session信息存入memcache中)一般存儲的信息比較簡單,例如字符串型信息,就可以使用memcache