溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

redis 和 memcached的區(qū)別是什么

發(fā)布時(shí)間:2021-08-13 17:28:53 來(lái)源:億速云 閱讀:166 作者:Leah 欄目:大數(shù)據(jù)

redis 和 memcached的區(qū)別是什么,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

redis 和 memcached 有啥區(qū)別?

redis 支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu)

redis 相比 memcached 來(lái)說(shuō),擁有更多的數(shù)據(jù)結(jié)構(gòu),能支持更豐富的數(shù)據(jù)操作。如果需要緩存能夠支持更復(fù)雜的結(jié)構(gòu)和操作, redis 會(huì)是不錯(cuò)的選擇。

redis 原生支持集群模式

在 redis3.x 版本中,便能支持 cluster 模式,而 memcached 沒(méi)有原生的集群模式,需要依靠客戶(hù)端來(lái)實(shí)現(xiàn)往集群中分片寫(xiě)入數(shù)據(jù)。

性能對(duì)比

由于 redis 只使用單核,而 memcached 可以使用多核,所以平均每一個(gè)核上 redis 在存儲(chǔ)小數(shù)據(jù)時(shí)比 memcached 性能更高。而在 100k 以上的數(shù)據(jù)中,memcached 性能要高于 redis,雖然 redis 最近也在存儲(chǔ)大數(shù)據(jù)的性能上進(jìn)行優(yōu)化,但是比起 memcached,還是稍有遜色。

redis 的線程模型

redis 內(nèi)部使用文件事件處理器 file event handler,這個(gè)文件事件處理器是單線程的,所以 redis 才叫做單線程的模型。它采用 IO 多路復(fù)用機(jī)制同時(shí)監(jiān)聽(tīng)多個(gè) socket,根據(jù) socket 上的事件來(lái)選擇對(duì)應(yīng)的事件處理器進(jìn)行處理。

文件事件處理器的結(jié)構(gòu)包含 4 個(gè)部分:

  • 多個(gè) socket

  • IO 多路復(fù)用程序

  • 文件事件分派器

  • 事件處理器(連接應(yīng)答處理器、命令請(qǐng)求處理器、命令回復(fù)處理器)

多個(gè) socket 可能會(huì)并發(fā)產(chǎn)生不同的操作,每個(gè)操作對(duì)應(yīng)不同的文件事件,但是 IO 多路復(fù)用程序會(huì)監(jiān)聽(tīng)多個(gè) socket,會(huì)將 socket 產(chǎn)生的事件放入隊(duì)列中排隊(duì),事件分派器每次從隊(duì)列中取出一個(gè)事件,把該事件交給對(duì)應(yīng)的事件處理器進(jìn)行處理。

來(lái)看客戶(hù)端與 redis 的一次通信過(guò)程:

redis 和 memcached的區(qū)別是什么

客戶(hù)端 socket01 向 redis 的 server socket 請(qǐng)求建立連接,此時(shí) server socket 會(huì)產(chǎn)生一個(gè) AE_READABLE 事件,IO 多路復(fù)用程序監(jiān)聽(tīng)到 server socket 產(chǎn)生的事件后,將該事件壓入隊(duì)列中。文件事件分派器從隊(duì)列中獲取該事件,交給連接應(yīng)答處理器。連接應(yīng)答處理器會(huì)創(chuàng)建一個(gè)能與客戶(hù)端通信的 socket01,并將該 socket01 的 AE_READABLE 事件與命令請(qǐng)求處理器關(guān)聯(lián)。

假設(shè)此時(shí)客戶(hù)端發(fā)送了一個(gè) set key value 請(qǐng)求,此時(shí) redis 中的 socket01 會(huì)產(chǎn)生 AE_READABLE 事件,IO 多路復(fù)用程序?qū)⑹录喝腙?duì)列,此時(shí)事件分派器從隊(duì)列中獲取到該事件,由于前面 socket01 的 AE_READABLE 事件已經(jīng)與命令請(qǐng)求處理器關(guān)聯(lián),因此事件分派器將事件交給命令請(qǐng)求處理器來(lái)處理。命令請(qǐng)求處理器讀取 socket01 的 key value 并在自己內(nèi)存中完成 key value 的設(shè)置。操作完成后,它會(huì)將 socket01 的 AE_WRITABLE 事件與命令回復(fù)處理器關(guān)聯(lián)。

如果此時(shí)客戶(hù)端準(zhǔn)備好接收返回結(jié)果了,那么 redis 中的 socket01 會(huì)產(chǎn)生一個(gè) AE_WRITABLE 事件,同樣壓入隊(duì)列中,事件分派器找到相關(guān)聯(lián)的命令回復(fù)處理器,由命令回復(fù)處理器對(duì) socket01 輸入本次操作的一個(gè)結(jié)果,比如 ok,之后解除 socket01 的 AE_WRITABLE 事件與命令回復(fù)處理器的關(guān)聯(lián)。

這樣便完成了一次通信。

為啥 redis 單線程模型也能效率這么高?

  • 純內(nèi)存操作

  • 核心是基于非阻塞的 IO 多路復(fù)用機(jī)制

  • 單線程反而避免了多線程的頻繁上下文切換問(wèn)題

看完上述內(nèi)容,你們掌握redis 和 memcached的區(qū)別是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI