摘要:以下正文的部分內容來自程序員面試筆試寶典書籍,如果轉載請保留出處一什么是是一個開源免費高性能的分布式對象緩存系統,它基于一個存儲鍵值對的來存儲數據到內存中。預告面試常考內容之和將于本周三更新。
你好,是我琉憶。
繼上周(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是一個開源、免費、高性能的分布式對象緩存系統,它基于一個存儲鍵/值對的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的特征如下:
1)協議簡單。
2)基于libevent的事件處理。
3)內置內存存儲方式。
4)Memcached不互相通信的分布式。
Memcache的特性如下:
(1)單個item 最大的數據為1MB。
(2)單進程最大的使用內存為2GB,需要更多內存時可開多個端口。
(3)Memcached是多線程,非阻塞io復用的網絡模型,Redis是單線程。
(4)鍵長最大為250字節。
Memcache將內存分割成各種尺寸的塊(chunk),并把尺寸相同的塊分成組(chunk的集合)。page是分配給slab的內存空間,默認是1MB,根據slab大小切分成chunk,chunk是用戶緩存記錄的內存空間,slab class是特定chunk的組。
在存儲數據時,Memcache會壓縮數據的大小進行存儲,一般壓縮后的數據為原數據大小的30%左右,從而節省了70%的傳輸性能消耗。如果存儲的數是小于100字節的鍵值對,那么壓縮后可能帶來膨脹,但Memcache都是按照固定大小分塊存儲的,最小也有88B,所以小數據帶來的壓縮膨脹也并不會有什么影響。
具體流程如下圖所示。
自己整理了一篇“如何解決Memcache的緩存雪崩現象?”的文章,關注公眾號:“琉憶編程庫”,回復:“me”,我發給你。
其實 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交互帶給網絡的
Memcached的操作命令可以分為存儲命令、查找命令、統計命令等三大類。
第一類,Memcached的存儲命令:
第二類,Memcached的查找命令:
第三類,Memcached的統計命令:
使用示例代碼參考:
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的值 ?>
具體全部的使用方法不在此一一羅列,可根據上面的方法表和參考示例進行模仿使用。
默認狀態下,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://:11211?persistent=1&weight=1&timeout=1&retry_interval=15,udp:// :11211”;
如果想使用udp支持,需要確保你的memcached服務器啟用,也確保Web服務器連接到memcache服務器端口正常。重新啟動Apache后,將開始使用的memcache存儲PHP的Session。
測試案例:
”; 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程序員面試筆試寶典》書籍,該書已在天貓、京東、當當等電商平臺銷售。
更多PHP相關的面試知識、考題可以關注公眾號獲取:琉憶編程庫
對本文有什么問題或建議都可以進行留言,我將不斷完善追求極致,感謝你們的支持。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/61749.html
摘要:自己整理了一篇不同等級面試都問什么的文章,關注公眾號琉憶編程庫,回復等級,我發給你。 你好,是我琉憶。今天是周五了,再上一天班就周末了,提前祝大家周末愉快。嘿嘿。這篇文章是本周Memcache和Redis內存數據庫常考的專題。本周一和周三更新的文章路徑:PHP面試常考內容之Memcache和Redis(1)PHP面試常考內容之Memcache和Redis(2)本周(2019.2-18至...
摘要:自己整理了一篇不同等級面試都問什么的文章,關注公眾號琉憶編程庫,回復等級,我發給你。 你好,是我琉憶。今天是周五了,再上一天班就周末了,提前祝大家周末愉快。嘿嘿。這篇文章是本周Memcache和Redis內存數據庫常考的專題。本周一和周三更新的文章路徑:PHP面試常考內容之Memcache和Redis(1)PHP面試常考內容之Memcache和Redis(2)本周(2019.2-18至...
摘要:以下正文的部分內容來自程序員面試筆試寶典書籍,如果轉載請保留出處一什么是是一個開源免費高性能的分布式對象緩存系統,它基于一個存儲鍵值對的來存儲數據到內存中。預告面試常考內容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發布的PHP面試常考內容之面向對象專題后,發布的第二個專題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內容點為以下幾點,更新時...
摘要:繼周一發布的面試常考內容之和后,這是第二篇,感謝你的支持和閱讀。預告面試常考內容之和將于本周五更新。以上內容摘自程序員面試筆試寶典書籍,該書已在天貓京東當當等電商平臺銷售。 你好,是我琉憶。繼周一(2019.2-18)發布的PHP面試常考內容之Memcache和Redis(1)后,這是第二篇,感謝你的支持和閱讀。本周(2019.2-18至2-22)的文章內容點為以下幾點,更新時間為每周...
摘要:繼周一發布的面試常考內容之和后,這是第二篇,感謝你的支持和閱讀。預告面試常考內容之和將于本周五更新。以上內容摘自程序員面試筆試寶典書籍,該書已在天貓京東當當等電商平臺銷售。 你好,是我琉憶。繼周一(2019.2-18)發布的PHP面試常考內容之Memcache和Redis(1)后,這是第二篇,感謝你的支持和閱讀。本周(2019.2-18至2-22)的文章內容點為以下幾點,更新時間為每周...
閱讀 1480·2021-11-17 09:33
閱讀 1260·2021-10-11 10:59
閱讀 2892·2021-09-30 09:48
閱讀 1904·2021-09-30 09:47
閱讀 3023·2019-08-30 15:55
閱讀 2336·2019-08-30 15:54
閱讀 1492·2019-08-29 15:25
閱讀 1645·2019-08-29 10:57