面试系列12 redis和memcached有什么区别
(1)redis和memcached有啥區(qū)別
?
這個事兒吧,你可以比較出N多個區(qū)別來,但是我還是采取redis作者給出的幾個比較吧
?
1)Redis支持服務(wù)器端的數(shù)據(jù)操作:Redis相比Memcached來說,擁有更多的數(shù)據(jù)結(jié)構(gòu)和并支持更豐富的數(shù)據(jù)操作,通常在Memcached里,你需要將數(shù)據(jù)拿到客戶端來進(jìn)行類似的修改再set回去。這大大增加了網(wǎng)絡(luò)IO的次數(shù)和數(shù)據(jù)體積。在Redis中,這些復(fù)雜的操作通常和一般的GET/SET一樣高效。所以,如果需要緩存能夠支持更復(fù)雜的結(jié)構(gòu)和操作,那么Redis會是不錯的選擇。
?
2)內(nèi)存使用效率對比:使用簡單的key-value存儲的話,Memcached的內(nèi)存利用率更高,而如果Redis采用hash結(jié)構(gòu)來做key-value存儲,由于其組合式的壓縮,其內(nèi)存利用率會高于Memcached。
?
3)性能對比:由于Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在存儲小數(shù)據(jù)時比Memcached性能更高。而在100k以上的數(shù)據(jù)中,Memcached性能要高于Redis,雖然Redis最近也在存儲大數(shù)據(jù)的性能上進(jìn)行優(yōu)化,但是比起Memcached,還是稍有遜色。
?
4)集群模式:memcached沒有原生的集群模式,需要依靠客戶端來實(shí)現(xiàn)往集群中分片寫入數(shù)據(jù);但是redis目前是原生支持cluster模式的,redis官方就是支持redis cluster集群模式的,比memcached來說要更好
?
(2)redis的線程模型
?
1)文件事件處理器
redis基于reactor模式開發(fā)了網(wǎng)絡(luò)事件處理器,這個處理器叫做文件事件處理器,file event handler。這個文件事件處理器,是單線程的,redis才叫做單線程的模型,采用IO多路復(fù)用機(jī)制同時監(jiān)聽多個socket,根據(jù)socket上的事件來選擇對應(yīng)的事件處理器來處理這個事件。
?
如果被監(jiān)聽的socket準(zhǔn)備好執(zhí)行accept、read、write、close等操作的時候,跟操作對應(yīng)的文件事件就會產(chǎn)生,這個時候文件事件處理器就會調(diào)用之前關(guān)聯(lián)好的事件處理器來處理這個事件。
?
文件事件處理器是單線程模式運(yùn)行的,但是通過IO多路復(fù)用機(jī)制監(jiān)聽多個socket,可以實(shí)現(xiàn)高性能的網(wǎng)絡(luò)通信模型,又可以跟內(nèi)部其他單線程的模塊進(jìn)行對接,保證了redis內(nèi)部的線程模型的簡單性。
?
文件事件處理器的結(jié)構(gòu)包含4個部分:多個socket,IO多路復(fù)用程序,文件事件分派器,事件處理器(命令請求處理器、命令回復(fù)處理器、連接應(yīng)答處理器,等等)。
?
多個socket可能并發(fā)的產(chǎn)生不同的操作,每個操作對應(yīng)不同的文件事件,但是IO多路復(fù)用程序會監(jiān)聽多個socket,但是會將socket放入一個隊(duì)列中排隊(duì),每次從隊(duì)列中取出一個socket給事件分派器,事件分派器把socket給對應(yīng)的事件處理器。
?
然后一個socket的事件處理完之后,IO多路復(fù)用程序才會將隊(duì)列中的下一個socket給事件分派器。文件事件分派器會根據(jù)每個socket當(dāng)前產(chǎn)生的事件,來選擇對應(yīng)的事件處理器來處理。
?
2)文件事件
?
當(dāng)socket變得可讀時(比如客戶端對redis執(zhí)行write操作,或者close操作),或者有新的可以應(yīng)答的sccket出現(xiàn)時(客戶端對redis執(zhí)行connect操作),socket就會產(chǎn)生一個AE_READABLE事件。
?
當(dāng)socket變得可寫的時候(客戶端對redis執(zhí)行read操作),socket會產(chǎn)生一個AE_WRITABLE事件。
?
IO多路復(fù)用程序可以同時監(jiān)聽AE_REABLE和AE_WRITABLE兩種事件,要是一個socket同時產(chǎn)生了AE_READABLE和AE_WRITABLE兩種事件,那么文件事件分派器優(yōu)先處理AE_REABLE事件,然后才是AE_WRITABLE事件。
?
3)文件事件處理器
?
如果是客戶端要連接redis,那么會為socket關(guān)聯(lián)連接應(yīng)答處理器
如果是客戶端要寫數(shù)據(jù)到redis,那么會為socket關(guān)聯(lián)命令請求處理器
如果是客戶端要從redis讀數(shù)據(jù),那么會為socket關(guān)聯(lián)命令回復(fù)處理器
?
4)客戶端與redis通信的一次流程
?
在redis啟動初始化的時候,redis會將連接應(yīng)答處理器跟AE_READABLE事件關(guān)聯(lián)起來,接著如果一個客戶端跟redis發(fā)起連接,此時會產(chǎn)生一個AE_READABLE事件,然后由連接應(yīng)答處理器來處理跟客戶端建立連接,創(chuàng)建客戶端對應(yīng)的socket,同時將這個socket的AE_READABLE事件跟命令請求處理器關(guān)聯(lián)起來。
?
當(dāng)客戶端向redis發(fā)起請求的時候(不管是讀請求還是寫請求,都一樣),首先就會在socket產(chǎn)生一個AE_READABLE事件,然后由對應(yīng)的命令請求處理器來處理。這個命令請求處理器就會從socket中讀取請求相關(guān)數(shù)據(jù),然后進(jìn)行執(zhí)行和處理。
接著redis這邊準(zhǔn)備好了給客戶端的響應(yīng)數(shù)據(jù)之后,就會將socket的AE_WRITABLE事件跟命令回復(fù)處理器關(guān)聯(lián)起來,當(dāng)客戶端這邊準(zhǔn)備好讀取響應(yīng)數(shù)據(jù)時,就會在socket上產(chǎn)生一個AE_WRITABLE事件,會由對應(yīng)的命令回復(fù)處理器來處理,就是將準(zhǔn)備好的響應(yīng)數(shù)據(jù)寫入socket,供客戶端來讀取。
?
命令回復(fù)處理器寫完之后,就會刪除這個socket的AE_WRITABLE事件和命令回復(fù)處理器的關(guān)聯(lián)關(guān)系。
?
(3)為啥redis單線程模型也能效率這么高?
?
1)純內(nèi)存操作
2)核心是基于非阻塞的IO多路復(fù)用機(jī)制
3)單線程反而避免了多線程的頻繁上下文切換問題(百度)
轉(zhuǎn)載于:https://www.cnblogs.com/xiufengchen/p/11258930.html
總結(jié)
以上是生活随笔為你收集整理的面试系列12 redis和memcached有什么区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MSCRM2011 Current Us
- 下一篇: kubeadm单集群部署k8s1.15.