PHP面試常考內容之Memcache和Redis(1)

你好,是我琉憶。
繼上週(2019.2-11至2-15)發佈的“PHP面試常考內容之面向對象”專題後,發佈的第二個專題,感謝你的閱讀。
本週(2019.2-18至2-22)的文章內容點爲以下幾點,更新時間爲每週一三五,可以關注本欄持續關注,感謝你的支持。

一、什麼是Memcache?
二、Memcache有什麼特徵?
三、Memcache的內存管理機制是什麼樣的?
四、Memcache和Memcached有什麼區別?
五、如何操作Memcache?
六、如何使用Memcache做Session共享?
七、什麼是Redis?
八、如何使用Redis?
九、使用Redis需要注意哪些問題?
十、Memcache和Redis常考的面試題

本章節的內容將會被分爲三篇文章進行講解完整塊內容,第一篇主要講解一到六,第二篇主要講解七到九,第三篇圍繞第十點。


以下正文的部分內容來自《PHP程序員面試筆試寶典》書籍,如果轉載請保留出處:


一、什麼是Memcache?

Memcache是一個開源、免費、高性能的分佈式對象緩存系統,它基於一個存儲鍵/值對的hashmap來存儲數據到內存中。它的作用是減少對數據庫的讀取以提高Web應用的性能。雖然它的守護進程(daemon )是用 C語言實現的,但是客戶端可以用任何語言來編寫,並通過Memcache協議與守護進程通信。需要注意的是,當某個服務器停止運行或崩潰了,所有存放在該服務器上的鍵/值對都將丟失。Memcache的服務器端沒有提供分佈式功能,各個Memcache應用不會互相通信以共享信息。想要實現分佈式通信,可以搭建幾個Memcache應用,通過算法實現此效果。
下面介紹Memcache的兩個重要概念。slab:爲了防止內存碎片化,Memcache服務器端會預先將數據空間劃分爲一系列slab;舉個例子,現在有一個100m3的房間,爲了合理規劃這個房間放置東西,會在這個房間裏放置30個1m3的盒子、20個1.25m3的盒子、15個1.5m3的盒子……這些盒子就是slab。
LRU:最近最少使用算法;當同一個slab的格子滿了,這時需要新加一個值時,不會考慮將這個新數據放到比當前slat更大的空閒slab,而是使用LRU移除舊數據,放入這個新數據。


二、Memcache有什麼特徵?

Memcache的特徵如下:
1)協議簡單。
2)基於libevent的事件處理。
3)內置內存存儲方式。
4)Memcached不互相通信的分佈式。
Memcache的特性如下:
(1)單個item 最大的數據爲1MB。
(2)單進程最大的使用內存爲2GB,需要更多內存時可開多個端口。
(3)Memcached是多線程,非阻塞io複用的網絡模型,Redis是單線程。
(4)鍵長最大爲250字節。


三、Memcache的內存管理機制是什麼樣的?

Memcache將內存分割成各種尺寸的塊(chunk),並把尺寸相同的塊分成組(chunk的集合)。page是分配給slab的內存空間,默認是1MB,根據slab大小切分成chunk,chunk是用戶緩存記錄的內存空間,slab class是特定chunk的組。
在存儲數據時,Memcache會壓縮數據的大小進行存儲,一般壓縮後的數據爲原數據大小的30%左右,從而節省了70%的傳輸性能消耗。如果存儲的數是小於100字節的鍵值對,那麼壓縮後可能帶來膨脹,但Memcache都是按照固定大小分塊存儲的,最小也有88B,所以小數據帶來的壓縮膨脹也並不會有什麼影響。
具體流程如下圖所示。

clipboard.png

自己整理了一篇“如何解決Memcache的緩存雪崩現象?”的文章,關注公衆號:“琉憶編程庫”,回覆:“me”,我發給你。

四、Memcache和Memcached有什麼區別?

其實 memcache 和 memcached 說的是 PHP 的擴展。
Memcache是一個自由和開放源代碼、高性能、分配的內存對象緩存系統。用於加速動態web應用程序,減輕數據庫負載。它可以應對任意多個連接,使用非阻塞的網絡IO。由於它的工作機制是在內存中開闢一塊空間,然後建立一個Hash表,Memcached自管理這些Hash表。
Memcache是該系統的項目名稱,Memcached是該系統的主程序文件(字母d可以理解爲daemon),以守護程序方式運行於一個或多個服務器中,隨時接受客戶端的連接操作,使用共享內存存取數據。
Memcached處理的原子是每一個(key,value)對(以下簡稱kv對),key會通過一個hash算法轉化成hash-key,便於查找、對比以及做到儘可能的散列。同時,memcached用的是一個二級散列,通過一張大hash表來維護。
Memcached有兩個核心組件組成:服務端(Server)和客戶端(Client),在一個memcached的查詢中,Client先通 過計算key的hash值來確定kv對所處在的Server位置。當Server確定後,客戶端就會發送一個查詢請求給對應的Server,讓它來查找確 切的數據。因爲這之間沒有交互以及多播協議,所以 memcached交互帶給網絡的


五、如何操作Memcache?

Memcached的操作命令可以分爲存儲命令、查找命令、統計命令等三大類。
第一類,Memcached的存儲命令:

clipboard.png

第二類,Memcached的查找命令:

clipboard.png

第三類,Memcached的統計命令:

clipboard.png

使用示例代碼參考:

<?php
    $m = new Memcached(); 
    $m->addServer("127.0.0.1",11211); //連接Memcache服務器
    $m->set("mkey","123",600);//設置一個鍵名爲mkey,值爲123,600s過期,0爲永久有效
    echo $m->get("mkey");//輸出123,get可以獲取鍵名爲mkey的值
    $m->delete("mkey");//刪除鍵名爲mkey的值
?>

具體全部的使用方法不在此一一羅列,可根據上面的方法表和參考示例進行模仿使用。


六、如何使用Memcache做Session共享?

默認狀態下,PHP使用文件方式做Session存儲,磁盤的I/O性能肯定沒有內存中存取快,因此改用memcache來存儲Session在讀寫速度上會快很多,而且在多臺服務器集羣時,使用memcahced能夠有效地解決Session共享的問題。
我們配置好memcached服務器後,修改php.ini配置文件的代碼:

session.save_handler = memcache
session.save_path = “tcp://127.0.0.1:11211”

也可以使用在網站目錄下放置Apache的.htaccess文件:

php_value session.save_handler “memcache”
php_value session.save_path “tcp://127.0.0.1:11211”

執行PHP腳本時寫入以下兩行:

ini_set(“session.save_handler”,”memcache”);
ini_set(“session.save_path”,”tcp://127.0.0.1:11211”);

可以在使用多個memcached服務器時用都好隔開,還可以額外帶參數:persistent、weight、timeout、retry_interval等。例如:

$session_save_path = “tcp://<memcache_server1>:11211?persistent=1&weight=1&timeout=1&retry_interval=15,udp://<memcache_server2>:11211”;

如果想使用udp支持,需要確保你的memcached服務器啓用,也確保Web服務器連接到memcache服務器端口正常。重新啓動Apache後,將開始使用的memcache存儲PHP的Session。
測試案例:

<?php
    Session_start();
    $_SESSION[‘test’] = time();
    echo $_SESSION[‘test’].”<br>”;
    echo session_id();
?>

測試memcache是否已存儲成功,通過sessionid去取對應的數據:

$m = memcache_connect(‘localhost’,11211);
echo $m->get(“13765595df9dsa8f9dsa8fa9sf8saf865”);

得到結果:

17559898989

如果使用memcached作爲Session存儲,要確保memcached的服務正常工作,否則Session相關功能將不起作用,這樣PHP的處理就多了一層外面的依賴。因爲memcached是使用內存的,這樣當用戶量比較大時,就可能由於內存方面原因導致Session時長上的問題,Session的實際失效時長達不到設定的失效時長(由memcached在內存不夠時的處理機制決定)。

Memcache可擴展考察的內容有很多,由於整理的篇幅內容很多,在此只是羅列了普遍遇到的Memcache相關的知識考點。額外的考點還有:
(1)Memcache的工作流程是什麼樣的?
(2)Memcache如何實現分佈式?
(3)Memcache的分佈式算法有哪些?
(4)使用Memcache有哪些技術限制?
(5)Memcache和Redis有什麼相同和區別的地方?

更多相關面試知識點可以閱讀《PHP程序員面試筆試寶典》


預告:PHP面試常考內容之Memcache和Redis(2)將於本週三(2019.2-20)更新。
以上內容摘自《PHP程序員面試筆試寶典》書籍,該書已在天貓京東噹噹等電商平臺銷售。

clipboard.png

更多PHP相關的面試知識、考題可以關注公衆號獲取:琉憶編程庫

clipboard.png

對本文有什麼問題或建議都可以進行留言,我將不斷完善追求極致,感謝你們的支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章