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

你好,是我琉憶。
今天是週五了,再上一天班就週末了,提前祝大家週末愉快。嘿嘿。
這篇文章是本週Memcache和Redis內存數據庫常考的專題。
本週一和週三更新的文章路徑:
PHP面試常考內容之Memcache和Redis(1)
PHP面試常考內容之Memcache和Redis(2)
本週(2019.2-18至2-22)的文章內容點爲以下幾點,更新時間爲每週一三五,可以關注本欄持續關注,感謝你的支持。

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

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

自己整理了一篇“PHP不同等級面試都問什麼?”的文章,關注公衆號:“琉憶編程庫”,回覆:“等級”,我發給你。

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


十二、Memcache和Redis常考的面試題

【真題1】Memcache的工作原理是什麼?

答案:Memcache的工作就是在專門的機器內存裏維護一張巨大的hash表,存儲經常被讀寫的一些文件與數據,從而極大地提高網站的運行效率。  
Memcache的程序運行在一個或多個服務器中,Memcache把全部的數據保存在內存中,通過hash表的方式,每條數據由key/value的形式構成,隨時接受客戶端的請求,然後返回結果。

客戶端與Memcache建立連接後,存儲對象主要是通過唯一的key存儲value到內存中,取數據時通過這個key從內存中獲取對應的value。由於Memcache的數據是存儲在內存中而不是保存在cache文件中,所以Memcache訪問比較快,但是由於這些數據不是永久化存儲,所以不建議存儲重要數據在Memcache中,因爲重啓服務器後這些數據就會消失。


【真題2】Memcache的優點有哪些?

答案:Memcache是一個高性能的分佈式內存對象緩存系統,主要通過在內存裏維護一個巨大的hash表進行數據緩存。它主要是將數據存儲到內存中,然後從內存中讀取數據,從而提高讀取速度。它主要通過key-value的形式存儲各種數據,包括圖像、視頻、文件等。
它具有以下幾點優點:

(1)支持多臺服務器使用Memcache,由於Memcache的存儲數據大小必須小於內存的大小,所以可以將Memcache使用在多臺服務器上,增加緩存容量;

(2)支持均衡請求。當使用多臺Memcache服務器時,可以均衡請求,避免所有請求都進入一臺Memcache服務器中,避免服務器掛掉而丟失數據;

(3)支持分佈式,可以解決緩存本身水平線性擴展的問題和緩存大併發下的自身性能問題,避免緩存的單點故障問題;

(4)支持部分容災問題,如果多臺服務器存儲了Memcache數據,其中一臺Memcache服務器掛掉,部分請求還是可以在其它服務器的Memcache中命中,爲修復掛掉的服務器爭取一些時間。


【真題3】如何合理地使用Memcache緩存?如果緩存數據量過大,那麼如何部署?(分佈式,緩存時間,優化緩存數據)

答案:如果要合理地使用Memcache緩存,那麼需要注意以下幾點內容:

(1)因爲Memcache支持最大的存儲對象大小爲1M,所以當合理使用Memcache緩存時,要求不能往Memcache存儲一個大於1MB的數據;

(2)Memcache存儲的所有數據,如果數據大小分佈於各種chunk大小區間,從64B到1MB都有,那麼會造成內存的極大浪費和Memcache的異常。所以需要注意數據大小的分佈區間;

(3)key的長度不能大於250個字符;

(4)虛擬主機不允許運行Memcache服務,所以不能把Memcache部署到虛擬主機中;

(5)因爲Memcache可以輕鬆訪問到,所以可以運行在不安全的環境中,如果對數據安全要求高,那麼需要着重考慮運行環境的安全問題;

(6)因爲Memcache存儲的數據都在內存中,服務器掛掉就會清空內存,所以緩存中的數據儘量是丟失了也不會有太大影響的數據。

如果緩存中的數據量過大,那麼可以採取以下的辦法:
(1)使用Memcache服務器集羣的方法,首先是將數據安排放在不同的Memcache服務器上,可以將不同硬件服務器上的Memcache服務器再做成一個數據互相備份的組,避免數據的單點丟失問題;

(2)緩存數據到數據庫中,在數據庫中先建一張表來說明Memcache服務器集羣中緩存數據的存放邏輯,然後實現把緩存數據存到數據庫中,可以保證數據庫和緩存的數據雙向存取。


【真題4】Redis 與 Memcache有什麼區別?

答案:Redis是一個完全開源免費的高性能key-value數據庫,具有豐富的數據類型,可以支持數據的持久化,將內存中的數據保存在磁盤中,當重啓服務器時可以再次加載使用。

Memcache是一個高性能的分佈式內存對象緩存系統,用於動態的Web應用中幫助數據庫減輕負擔,在內存中緩存數據和對象,減少每次訪問數據時對數據庫的訪問次數,從而提高訪問速度。

它們具有以下幾點區別:
(1)Redis和Memcache的最大區別是,雖然Memcache和Redis都是將數據存在內存中,是內存數據庫,但Redis存儲時,並不是所有的數據都一直存儲在內存中,而Memcache存儲時,數據都存在內存中;

(2)數據安全問題,由於memecache 把數據全部存在內存之中,服務器掛掉後,重啓服務器數據就會丟失,而Redis可以定期保存數據到磁盤中做持久化存儲,當需要時可以再加載使用。對於災難恢復,Memcache掛掉後,數據不可恢復,但Redis數據丟失後可以通過aof恢復;

(3)Redis支持多種數據結構存儲,例如list,set,hash等數據結構的存儲,而Memcache主要是在內存中維護一個統一的巨大的hash表進行存儲數據,只支持簡單的key/value類型的數據存儲,但Memcache可以存儲圖片、視頻、文件及數據庫檢索結果等;

(4)數據備份問題,Redis支持數據的備份,即master-slave模式的數據備份。而Memcache不支持數據持久化,所以無法進行數據備份;

(5)在內存使用率上,使用簡單的key-value存儲的話,Memcached的內存利用率更高,而如果Redis採用hash結構來做key-value存儲,由於其組合式的壓縮,其內存利用率會高於Memcached。具體和應用場景、數據特性有關;

(6)在線程上的比較,Memcache是支持多線程的,而Redis只支持單線程,所以CPU利用方面Memcache優於Redis;

(7)它們的擴展都需要做集羣;實現方式:master-slave、Hash;

(8)數據的讀寫方面,Redis和Memcache在寫入性能上面差別不大,讀取性能上面尤其是批量讀取性能上Memcache更強。


【真題5】Redis集羣方案應該怎麼做?都有哪些方案?

答案:1.twemproxy,大概概念是,它類似於一個代理方式,使用方法和普通redis無任何區別,設置好它下屬的多個redis實例後,使用時在本需要連接redis的地方改爲連接twemproxy,它會以一個代理的身份接收請求並使用一致性hash算法,將請求轉接到具體redis,將結果再返回twemproxy。使用方式簡便(相對redis只需修改連接端口),對舊項目擴展的首選。 問題:twemproxy自身單端口實例的壓力,使用一致性hash後,對redis節點數量改變時候的計算值的改變,數據無法自動移動到新的節點。

2.codis,目前用的最多的集羣方案,基本和twemproxy一致的效果,但它支持在 節點數量改變情況下,舊節點數據可恢復到新hash節點。

3.redis cluster3.0自帶的集羣,特點在於他的分佈式算法不是一致性hash,而是hash槽的概念,以及自身支持節點設置從節點。具體看官方文檔介紹。

4.在業務代碼層實現,起幾個毫無關聯的redis實例,在代碼層,對key 進行hash計算,然後去對應的redis實例操作數據。 這種方式對hash層代碼要求比較高,考慮部分包括,節點失效後的替代算法方案,數據震盪後的自動腳本恢復,實例的監控,等等。


自己整理了一篇“PHP不同等級面試都問什麼?”的文章,關注公衆號:“琉憶編程庫”,回覆:“等級”,我發給你。

【真題6】Redis有哪些適合的場景?

答案:(1)、會話緩存(Session Cache)

最常用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其他存儲(如Memcached)的優勢在於:Redis提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?

幸運的是,隨着 Redis 這些年的改進,很容易找到怎麼恰當的使用Redis來緩存會話的文檔。甚至廣爲人知的商業平臺Magento也提供Redis的插件。

(2)、全頁緩存(FPC)

除基本的會話token之外,Redis還提供很簡便的FPC平臺。回到一致性問題,即使重啓了Redis實例,因爲有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似PHP本地FPC。

再次以Magento爲例,Magento提供一個插件來使用Redis作爲全頁緩存後端。

此外,對WordPress的用戶來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。

(3)、隊列

Reids在內存存儲引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作爲一個很好的消息隊列平臺來使用。Redis作爲隊列使用的操作,就類似於本地程序語言(如Python)對 list 的 push/pop 操作。

如果你快速的在Google中搜索“Redis queues”,你馬上就能找到大量的開源項目,這些項目的目的就是利用Redis創建非常好的後端工具,以滿足各種隊列需求。例如,Celery有一個後臺就是使用Redis作爲broker,你可以從這裏去查看。

(4),排行榜/計數器

Redis在內存中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種數據結構。所以,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之爲“user_scores”,我們只需要像下面一樣執行即可:

當然,這是假定你是根據你用戶的分數做遞增的排序。如果你想返回用戶及用戶的分數,你需要這樣執行:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games就是一個很好的例子,用Ruby實現的,它的排行榜就是使用Redis來存儲數據的,你可以在這裏看到。

(5)、發佈/訂閱

最後(但肯定不是最不重要的)是Redis的發佈/訂閱功能。發佈/訂閱的使用場景確實非常多。我已看見人們在社交網絡連接中使用,還可作爲基於發佈/訂閱的腳本觸發器,甚至用Redis的發佈/訂閱功能來建立聊天系統!(不,這是真的,你可以去核實)。

【真題7】Redis持久化數據和緩存怎麼做擴容?

答案:如果Redis被當做緩存使用,使用一致性哈希實現動態擴容縮容。

如果Redis被當做一個持久化存儲使用,必須使用固定的keys-to-nodes映射關係,節點的數量一旦確定不能變化。否則的話(即Redis節點需要動態變化的情況),必須使用可以在運行時進行數據再平衡的一套系統,而當前只有Redis集羣可以做到這樣。


【真題8】Redis回收進程如何工作的?

答案:一個客戶端運行了新的命令,添加了新的數據。

Redi檢查內存使用情況,如果大於maxmemory的限制, 則根據設定好的策略進行回收。

一個新的命令被執行,等等。

所以我們不斷地穿越內存限制的邊界,通過不斷達到邊界然後不斷地回收回到邊界以下。

如果一個命令的結果導致大量內存被使用(例如很大的集合的交集保存到一個新的鍵),不用多久內存限制就會被這個內存使用量超越。


【真題9】都有哪些辦法可以降低Redis的內存使用情況呢?

答案:如果你使用的是32位的Redis實例,可以好好利用Hash,list,sorted set,set等集合類型數據,因爲通常情況下很多小的Key-Value可以用更緊湊的方式存放到一起。


【真題10】你知道有哪些Redis分區實現方案?

答案:客戶端分區就是在客戶端就已經決定數據會被存儲到哪個redis節點或者從哪個redis節點讀取。大多數客戶端已經實現了客戶端分區。

代理分區 意味着客戶端將請求發送給代理,然後代理決定去哪個節點寫數據或者讀數據。代理根據分區規則決定請求哪些Redis實例,然後根據Redis的響應結果返回給客戶端。redis和memcached的一種代理實現就是Twemproxy

查詢路由(Query routing) 的意思是客戶端隨機地請求任意一個redis實例,然後由Redis將請求轉發給正確的Redis節點。Redis Cluster實現了一種混合形式的查詢路由,但並不是直接將請求從一個redis節點轉發到另一個redis節點,而是在客戶端的幫助下直接redirected到正確的redis節點。


自己根據不同PHP不同等級面試時,會問哪些PHP常考的知識點整理成了一篇文章
自己整理了一篇“PHP不同等級面試都問什麼?”的文章,關注公衆號:“琉憶編程庫”,回覆:“等級”,我發給你。

更多相關面試常考真題可以閱讀《PHP程序員面試筆試真題解析》

預告:下週(2019.2.25至2019.3.1)一三五將更新的主題爲:PHP面試之會話控制、網絡協議、相關的面試題

以上內容摘自《PHP程序員面試筆試真題解析》書籍,該書已在天貓京東噹噹等電商平臺銷售。

圖片描述

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

圖片描述

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

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