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

Code2020發表於2021-01-24

一.核心優化概述

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

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

優化什麼地方?有三方面: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

相關文章