摘要:自己整理了一篇不同等級面試都問什么的文章,關(guān)注公眾號琉憶編程庫,回復(fù)等級,我發(fā)給你。
你好,是我琉憶。
今天是周五了,再上一天班就周末了,提前祝大家周末愉快。嘿嘿。
這篇文章是本周Memcache和Redis內(nèi)存數(shù)據(jù)庫??嫉膶n}。
本周一和周三更新的文章路徑:
PHP面試??純?nèi)容之Memcache和Redis(1)
PHP面試??純?nèi)容之Memcache和Redis(2)
本周(2019.2-18至2-22)的文章內(nèi)容點為以下幾點,更新時間為每周一三五,可以關(guān)注本欄持續(xù)關(guān)注,感謝你的支持。
一、什么是Memcache?
二、Memcache有什么特征?
三、Memcache的內(nèi)存管理機制是什么樣的?
四、Memcache和Memcached有什么區(qū)別?
五、如何操作Memcache?
六、如何使用Memcache做Session共享?
七、什么是Redis?
八、如何使用Redis?
九、使用Redis需要注意哪些問題?
十、新增:Redis和Memcache有什么不同?
十一、新增:Redis如何實現(xiàn)持久化?
十二、Memcache和Redis??嫉拿嬖囶}
本章節(jié)的內(nèi)容將會被分為三篇文章進行講解完整塊內(nèi)容,第一篇主要講解一到六,第二篇主要講解七到十一(新增了十和十一),第三篇圍繞第十二點。
自己整理了一篇“PHP不同等級面試都問什么?”的文章,關(guān)注公眾號:“琉憶編程庫”,回復(fù):“等級”,我發(fā)給你。
以下正文的部分內(nèi)容來自《PHP程序員面試筆試真題解析》書籍,如果轉(zhuǎn)載請保留出處:
答案:Memcache的工作就是在專門的機器內(nèi)存里維護一張巨大的hash表,存儲經(jīng)常被讀寫的一些文件與數(shù)據(jù),從而極大地提高網(wǎng)站的運行效率。 ?
Memcache的程序運行在一個或多個服務(wù)器中,Memcache把全部的數(shù)據(jù)保存在內(nèi)存中,通過hash表的方式,每條數(shù)據(jù)由key/value的形式構(gòu)成,隨時接受客戶端的請求,然后返回結(jié)果。
客戶端與Memcache建立連接后,存儲對象主要是通過唯一的key存儲value到內(nèi)存中,取數(shù)據(jù)時通過這個key從內(nèi)存中獲取對應(yīng)的value。由于Memcache的數(shù)據(jù)是存儲在內(nèi)存中而不是保存在cache文件中,所以Memcache訪問比較快,但是由于這些數(shù)據(jù)不是永久化存儲,所以不建議存儲重要數(shù)據(jù)在Memcache中,因為重啟服務(wù)器后這些數(shù)據(jù)就會消失。
答案:Memcache是一個高性能的分布式內(nèi)存對象緩存系統(tǒng),主要通過在內(nèi)存里維護一個巨大的hash表進行數(shù)據(jù)緩存。它主要是將數(shù)據(jù)存儲到內(nèi)存中,然后從內(nèi)存中讀取數(shù)據(jù),從而提高讀取速度。它主要通過key-value的形式存儲各種數(shù)據(jù),包括圖像、視頻、文件等。
它具有以下幾點優(yōu)點:
(1)支持多臺服務(wù)器使用Memcache,由于Memcache的存儲數(shù)據(jù)大小必須小于內(nèi)存的大小,所以可以將Memcache使用在多臺服務(wù)器上,增加緩存容量;
(2)支持均衡請求。當(dāng)使用多臺Memcache服務(wù)器時,可以均衡請求,避免所有請求都進入一臺Memcache服務(wù)器中,避免服務(wù)器掛掉而丟失數(shù)據(jù);
(3)支持分布式,可以解決緩存本身水平線性擴展的問題和緩存大并發(fā)下的自身性能問題,避免緩存的單點故障問題;
(4)支持部分容災(zāi)問題,如果多臺服務(wù)器存儲了Memcache數(shù)據(jù),其中一臺Memcache服務(wù)器掛掉,部分請求還是可以在其它服務(wù)器的Memcache中命中,為修復(fù)掛掉的服務(wù)器爭取一些時間。
答案:如果要合理地使用Memcache緩存,那么需要注意以下幾點內(nèi)容:
(1)因為Memcache支持最大的存儲對象大小為1M,所以當(dāng)合理使用Memcache緩存時,要求不能往Memcache存儲一個大于1MB的數(shù)據(jù);
(2)Memcache存儲的所有數(shù)據(jù),如果數(shù)據(jù)大小分布于各種chunk大小區(qū)間,從64B到1MB都有,那么會造成內(nèi)存的極大浪費和Memcache的異常。所以需要注意數(shù)據(jù)大小的分布區(qū)間;
(3)key的長度不能大于250個字符;
(4)虛擬主機不允許運行Memcache服務(wù),所以不能把Memcache部署到虛擬主機中;
(5)因為Memcache可以輕松訪問到,所以可以運行在不安全的環(huán)境中,如果對數(shù)據(jù)安全要求高,那么需要著重考慮運行環(huán)境的安全問題;
(6)因為Memcache存儲的數(shù)據(jù)都在內(nèi)存中,服務(wù)器掛掉就會清空內(nèi)存,所以緩存中的數(shù)據(jù)盡量是丟失了也不會有太大影響的數(shù)據(jù)。
如果緩存中的數(shù)據(jù)量過大,那么可以采取以下的辦法:
(1)使用Memcache服務(wù)器集群的方法,首先是將數(shù)據(jù)安排放在不同的Memcache服務(wù)器上,可以將不同硬件服務(wù)器上的Memcache服務(wù)器再做成一個數(shù)據(jù)互相備份的組,避免數(shù)據(jù)的單點丟失問題;
(2)緩存數(shù)據(jù)到數(shù)據(jù)庫中,在數(shù)據(jù)庫中先建一張表來說明Memcache服務(wù)器集群中緩存數(shù)據(jù)的存放邏輯,然后實現(xiàn)把緩存數(shù)據(jù)存到數(shù)據(jù)庫中,可以保證數(shù)據(jù)庫和緩存的數(shù)據(jù)雙向存取。
答案:Redis是一個完全開源免費的高性能key-value數(shù)據(jù)庫,具有豐富的數(shù)據(jù)類型,可以支持?jǐn)?shù)據(jù)的持久化,將內(nèi)存中的數(shù)據(jù)保存在磁盤中,當(dāng)重啟服務(wù)器時可以再次加載使用。
Memcache是一個高性能的分布式內(nèi)存對象緩存系統(tǒng),用于動態(tài)的Web應(yīng)用中幫助數(shù)據(jù)庫減輕負擔(dān),在內(nèi)存中緩存數(shù)據(jù)和對象,減少每次訪問數(shù)據(jù)時對數(shù)據(jù)庫的訪問次數(shù),從而提高訪問速度。
它們具有以下幾點區(qū)別:
(1)Redis和Memcache的最大區(qū)別是,雖然Memcache和Redis都是將數(shù)據(jù)存在內(nèi)存中,是內(nèi)存數(shù)據(jù)庫,但Redis存儲時,并不是所有的數(shù)據(jù)都一直存儲在內(nèi)存中,而Memcache存儲時,數(shù)據(jù)都存在內(nèi)存中;
(2)數(shù)據(jù)安全問題,由于memecache 把數(shù)據(jù)全部存在內(nèi)存之中,服務(wù)器掛掉后,重啟服務(wù)器數(shù)據(jù)就會丟失,而Redis可以定期保存數(shù)據(jù)到磁盤中做持久化存儲,當(dāng)需要時可以再加載使用。對于災(zāi)難恢復(fù),Memcache掛掉后,數(shù)據(jù)不可恢復(fù),但Redis數(shù)據(jù)丟失后可以通過aof恢復(fù);
(3)Redis支持多種數(shù)據(jù)結(jié)構(gòu)存儲,例如list,set,hash等數(shù)據(jù)結(jié)構(gòu)的存儲,而Memcache主要是在內(nèi)存中維護一個統(tǒng)一的巨大的hash表進行存儲數(shù)據(jù),只支持簡單的key/value類型的數(shù)據(jù)存儲,但Memcache可以存儲圖片、視頻、文件及數(shù)據(jù)庫檢索結(jié)果等;
(4)數(shù)據(jù)備份問題,Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。而Memcache不支持?jǐn)?shù)據(jù)持久化,所以無法進行數(shù)據(jù)備份;
(5)在內(nèi)存使用率上,使用簡單的key-value存儲的話,Memcached的內(nèi)存利用率更高,而如果Redis采用hash結(jié)構(gòu)來做key-value存儲,由于其組合式的壓縮,其內(nèi)存利用率會高于Memcached。具體和應(yīng)用場景、數(shù)據(jù)特性有關(guān);
(6)在線程上的比較,Memcache是支持多線程的,而Redis只支持單線程,所以CPU利用方面Memcache優(yōu)于Redis;
(7)它們的擴展都需要做集群;實現(xiàn)方式:master-slave、Hash;
(8)數(shù)據(jù)的讀寫方面,Redis和Memcache在寫入性能上面差別不大,讀取性能上面尤其是批量讀取性能上Memcache更強。
答案:1.twemproxy,大概概念是,它類似于一個代理方式,使用方法和普通redis無任何區(qū)別,設(shè)置好它下屬的多個redis實例后,使用時在本需要連接redis的地方改為連接twemproxy,它會以一個代理的身份接收請求并使用一致性hash算法,將請求轉(zhuǎn)接到具體redis,將結(jié)果再返回twemproxy。使用方式簡便(相對redis只需修改連接端口),對舊項目擴展的首選。 問題:twemproxy自身單端口實例的壓力,使用一致性hash后,對redis節(jié)點數(shù)量改變時候的計算值的改變,數(shù)據(jù)無法自動移動到新的節(jié)點。
2.codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 節(jié)點數(shù)量改變情況下,舊節(jié)點數(shù)據(jù)可恢復(fù)到新hash節(jié)點。
3.redis cluster3.0自帶的集群,特點在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持節(jié)點設(shè)置從節(jié)點。具體看官方文檔介紹。
4.在業(yè)務(wù)代碼層實現(xiàn),起幾個毫無關(guān)聯(lián)的redis實例,在代碼層,對key 進行hash計算,然后去對應(yīng)的redis實例操作數(shù)據(jù)。 這種方式對hash層代碼要求比較高,考慮部分包括,節(jié)點失效后的替代算法方案,數(shù)據(jù)震蕩后的自動腳本恢復(fù),實例的監(jiān)控,等等。
自己整理了一篇“PHP不同等級面試都問什么?”的文章,關(guān)注公眾號:“琉憶編程庫”,回復(fù):“等級”,我發(fā)給你。
答案:(1)、會話緩存(Session Cache)
最常用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其他存儲(如Memcached)的優(yōu)勢在于:Redis提供持久化。當(dāng)維護一個不是嚴(yán)格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現(xiàn)在,他們還會這樣嗎?
幸運的是,隨著 Redis 這些年的改進,很容易找到怎么恰當(dāng)?shù)氖褂肦edis來緩存會話的文檔。甚至廣為人知的商業(yè)平臺Magento也提供Redis的插件。
(2)、全頁緩存(FPC)
除基本的會話token之外,Redis還提供很簡便的FPC平臺。回到一致性問題,即使重啟了Redis實例,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似PHP本地FPC。
再次以Magento為例,Magento提供一個插件來使用Redis作為全頁緩存后端。
此外,對WordPress的用戶來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。
(3)、隊列
Reids在內(nèi)存存儲引擎領(lǐng)域的一大優(yōu)點是提供 list 和 set 操作,這使得Redis能作為一個很好的消息隊列平臺來使用。Redis作為隊列使用的操作,就類似于本地程序語言(如Python)對 list 的 push/pop 操作。
如果你快速的在Google中搜索“Redis queues”,你馬上就能找到大量的開源項目,這些項目的目的就是利用Redis創(chuàng)建非常好的后端工具,以滿足各種隊列需求。例如,Celery有一個后臺就是使用Redis作為broker,你可以從這里去查看。
(4),排行榜/計數(shù)器
Redis在內(nèi)存中對數(shù)字進行遞增或遞減的操作實現(xiàn)的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執(zhí)行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種數(shù)據(jù)結(jié)構(gòu)。所以,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之為“user_scores”,我們只需要像下面一樣執(zhí)行即可:
當(dāng)然,這是假定你是根據(jù)你用戶的分?jǐn)?shù)做遞增的排序。如果你想返回用戶及用戶的分?jǐn)?shù),你需要這樣執(zhí)行:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games就是一個很好的例子,用Ruby實現(xiàn)的,它的排行榜就是使用Redis來存儲數(shù)據(jù)的,你可以在這里看到。
(5)、發(fā)布/訂閱
最后(但肯定不是最不重要的)是Redis的發(fā)布/訂閱功能。發(fā)布/訂閱的使用場景確實非常多。我已看見人們在社交網(wǎng)絡(luò)連接中使用,還可作為基于發(fā)布/訂閱的腳本觸發(fā)器,甚至用Redis的發(fā)布/訂閱功能來建立聊天系統(tǒng)?。ú?,這是真的,你可以去核實)。
【真題7】Redis持久化數(shù)據(jù)和緩存怎么做擴容?答案:如果Redis被當(dāng)做緩存使用,使用一致性哈希實現(xiàn)動態(tài)擴容縮容。
如果Redis被當(dāng)做一個持久化存儲使用,必須使用固定的keys-to-nodes映射關(guān)系,節(jié)點的數(shù)量一旦確定不能變化。否則的話(即Redis節(jié)點需要動態(tài)變化的情況),必須使用可以在運行時進行數(shù)據(jù)再平衡的一套系統(tǒng),而當(dāng)前只有Redis集群可以做到這樣。
答案:一個客戶端運行了新的命令,添加了新的數(shù)據(jù)。
Redi檢查內(nèi)存使用情況,如果大于maxmemory的限制, 則根據(jù)設(shè)定好的策略進行回收。
一個新的命令被執(zhí)行,等等。
所以我們不斷地穿越內(nèi)存限制的邊界,通過不斷達到邊界然后不斷地回收回到邊界以下。
如果一個命令的結(jié)果導(dǎo)致大量內(nèi)存被使用(例如很大的集合的交集保存到一個新的鍵),不用多久內(nèi)存限制就會被這個內(nèi)存使用量超越。
答案:如果你使用的是32位的Redis實例,可以好好利用Hash,list,sorted set,set等集合類型數(shù)據(jù),因為通常情況下很多小的Key-Value可以用更緊湊的方式存放到一起。
答案:客戶端分區(qū)就是在客戶端就已經(jīng)決定數(shù)據(jù)會被存儲到哪個redis節(jié)點或者從哪個redis節(jié)點讀取。大多數(shù)客戶端已經(jīng)實現(xiàn)了客戶端分區(qū)。
代理分區(qū) 意味著客戶端將請求發(fā)送給代理,然后代理決定去哪個節(jié)點寫數(shù)據(jù)或者讀數(shù)據(jù)。代理根據(jù)分區(qū)規(guī)則決定請求哪些Redis實例,然后根據(jù)Redis的響應(yīng)結(jié)果返回給客戶端。redis和memcached的一種代理實現(xiàn)就是Twemproxy
查詢路由(Query routing) 的意思是客戶端隨機地請求任意一個redis實例,然后由Redis將請求轉(zhuǎn)發(fā)給正確的Redis節(jié)點。Redis Cluster實現(xiàn)了一種混合形式的查詢路由,但并不是直接將請求從一個redis節(jié)點轉(zhuǎn)發(fā)到另一個redis節(jié)點,而是在客戶端的幫助下直接redirected到正確的redis節(jié)點。
自己根據(jù)不同PHP不同等級面試時,會問哪些PHP??嫉闹R點整理成了一篇文章
自己整理了一篇“PHP不同等級面試都問什么?”的文章,關(guān)注公眾號:“琉憶編程庫”,回復(fù):“等級”,我發(fā)給你。
更多相關(guān)面試??颊骖}可以閱讀《PHP程序員面試筆試真題解析》。
預(yù)告:下周(2019.2.25至2019.3.1)一三五將更新的主題為:PHP面試之會話控制、網(wǎng)絡(luò)協(xié)議、相關(guān)的面試題。
以上內(nèi)容摘自《PHP程序員面試筆試真題解析》書籍,該書已在天貓、京東、當(dāng)當(dāng)?shù)入娚唐脚_銷售。
更多PHP相關(guān)的面試知識、考題可以關(guān)注公眾號獲?。?strong>琉憶編程庫
對本文有什么問題或建議都可以進行留言,我將不斷完善追求極致,感謝你們的支持。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30145.html
摘要:自己整理了一篇不同等級面試都問什么的文章,關(guān)注公眾號琉憶編程庫,回復(fù)等級,我發(fā)給你。 你好,是我琉憶。今天是周五了,再上一天班就周末了,提前祝大家周末愉快。嘿嘿。這篇文章是本周Memcache和Redis內(nèi)存數(shù)據(jù)庫??嫉膶n}。本周一和周三更新的文章路徑:PHP面試常考內(nèi)容之Memcache和Redis(1)PHP面試??純?nèi)容之Memcache和Redis(2)本周(2019.2-18至...
摘要:繼周一發(fā)布的面試??純?nèi)容之和后,這是第二篇,感謝你的支持和閱讀。預(yù)告面試??純?nèi)容之和將于本周五更新。以上內(nèi)容摘自程序員面試筆試寶典書籍,該書已在天貓京東當(dāng)當(dāng)?shù)入娚唐脚_銷售。 你好,是我琉憶。繼周一(2019.2-18)發(fā)布的PHP面試??純?nèi)容之Memcache和Redis(1)后,這是第二篇,感謝你的支持和閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點為以下幾點,更新時間為每周...
摘要:繼周一發(fā)布的面試??純?nèi)容之和后,這是第二篇,感謝你的支持和閱讀。預(yù)告面試常考內(nèi)容之和將于本周五更新。以上內(nèi)容摘自程序員面試筆試寶典書籍,該書已在天貓京東當(dāng)當(dāng)?shù)入娚唐脚_銷售。 你好,是我琉憶。繼周一(2019.2-18)發(fā)布的PHP面試??純?nèi)容之Memcache和Redis(1)后,這是第二篇,感謝你的支持和閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點為以下幾點,更新時間為每周...
摘要:以下正文的部分內(nèi)容來自程序員面試筆試寶典書籍,如果轉(zhuǎn)載請保留出處一什么是是一個開源免費高性能的分布式對象緩存系統(tǒng),它基于一個存儲鍵值對的來存儲數(shù)據(jù)到內(nèi)存中。預(yù)告面試??純?nèi)容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發(fā)布的PHP面試??純?nèi)容之面向?qū)ο髮n}后,發(fā)布的第二個專題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點為以下幾點,更新時...
摘要:以下正文的部分內(nèi)容來自程序員面試筆試寶典書籍,如果轉(zhuǎn)載請保留出處一什么是是一個開源免費高性能的分布式對象緩存系統(tǒng),它基于一個存儲鍵值對的來存儲數(shù)據(jù)到內(nèi)存中。預(yù)告面試常考內(nèi)容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發(fā)布的PHP面試??純?nèi)容之面向?qū)ο髮n}后,發(fā)布的第二個專題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點為以下幾點,更新時...
閱讀 1295·2021-11-25 09:43
閱讀 2022·2021-11-11 10:58
閱讀 1265·2021-11-08 13:18
閱讀 2809·2019-08-29 16:25
閱讀 3577·2019-08-29 12:51
閱讀 3381·2019-08-29 12:30
閱讀 806·2019-08-26 13:24
閱讀 3747·2019-08-26 10:38