日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
架構(gòu)選型,究竟啥時(shí)候選Redis?

redis是互聯(lián)網(wǎng)分層架構(gòu)中,最常用的KV緩存,但不少同學(xué)仍然不知道,為啥要選擇redis。

畫(huà)外音:與之對(duì)比最多的,是memcache。

一、復(fù)雜數(shù)據(jù)結(jié)構(gòu),選擇redis更合適

value是哈希,列表,集合,有序集合這類(lèi)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)時(shí),會(huì)選擇redis,因?yàn)閙c無(wú)法滿(mǎn)足這些需求。

最典型的場(chǎng)景,用戶(hù)訂單列表,用戶(hù)消息,帖子評(píng)論列表等。

二、持久化,選擇redis更合適

mc無(wú)法滿(mǎn)足持久化的需求,只得選擇redis。但是,這里要提醒的是,真的使用對(duì)了redis的持久化功能么?

千萬(wàn)不要把redis當(dāng)作數(shù)據(jù)庫(kù)用:

  • redis的定期快照不能保證數(shù)據(jù)不丟失;
  • redis的AOF會(huì)降低效率,并且不能支持太大的數(shù)據(jù)量;

不要期望redis做固化存儲(chǔ)會(huì)比mysql做得好,不同的工具做各自擅長(zhǎng)的事情,把redis當(dāng)作數(shù)據(jù)庫(kù)用,這樣的設(shè)計(jì)八成是錯(cuò)誤的。

緩存場(chǎng)景,開(kāi)啟固化功能,有什么利弊?

如果只是緩存場(chǎng)景,數(shù)據(jù)存放在數(shù)據(jù)庫(kù),緩存在redis,此時(shí)如果開(kāi)啟固化功能:

優(yōu)點(diǎn)是,redis掛了再重啟,內(nèi)存里能夠快速恢復(fù)熱數(shù)據(jù),不會(huì)瞬時(shí)將壓力壓到數(shù)據(jù)庫(kù)上,沒(méi)有一個(gè)cache預(yù)熱的過(guò)程。

缺點(diǎn)是,在redis掛了的過(guò)程中,如果數(shù)據(jù)庫(kù)中有數(shù)據(jù)的修改,可能導(dǎo)致redis重啟后,數(shù)據(jù)庫(kù)與redis的數(shù)據(jù)不一致。

因此,只讀場(chǎng)景,或者允許一些不一致的業(yè)務(wù)場(chǎng)景,可以嘗試開(kāi)啟redis的固化功能。

三、高可用,選擇redis更合適

redis天然支持集群功能,可以實(shí)現(xiàn)主動(dòng)復(fù)制,讀寫(xiě)分離。

redis官方也提供了sentinel集群管理工具,能夠?qū)崿F(xiàn)主從服務(wù)監(jiān)控,故障自動(dòng)轉(zhuǎn)移,這一切,對(duì)于客戶(hù)端都是透明的,無(wú)需程序改動(dòng),也無(wú)需人工介入。

畫(huà)外音:memcache,要想要實(shí)現(xiàn)高可用,需要進(jìn)行二次開(kāi)發(fā),例如客戶(hù)端的雙讀雙寫(xiě),或者服務(wù)端的集群同步。

但是,這里要提醒的是,大部分業(yè)務(wù)場(chǎng)景,緩存真的需要高可用么?

  • 緩存場(chǎng)景,很多時(shí)候,是允許cache miss;
  • 緩存掛了,很多時(shí)候可以通過(guò)DB讀取數(shù)據(jù);

所以,需要認(rèn)真剖析業(yè)務(wù)場(chǎng)景,高可用,是否真的是對(duì)緩存的主要需求?

畫(huà)外音:即時(shí)通訊業(yè)務(wù)中,用戶(hù)的在線狀態(tài),就有高可用需求。

四、存儲(chǔ)的內(nèi)容比較大,選擇redis更合適

memcache的value存儲(chǔ),最大為1M,如果存儲(chǔ)的value很大,只能使用redis。

當(dāng)然,redis與memcache相比,由于底層實(shí)現(xiàn)機(jī)制的差異,也有一些“劣勢(shì)”的情況。

情況一:由于內(nèi)存分配機(jī)制的差異,redis可能導(dǎo)致內(nèi)存碎片

memcache使用預(yù)分配內(nèi)存池的方式管理內(nèi)存,能夠省去內(nèi)存分配時(shí)間。

redis則是臨時(shí)申請(qǐng)空間,可能導(dǎo)致碎片。

從這一點(diǎn)上,mc會(huì)更快一些。

情況二:由于虛擬內(nèi)存使用的差異,redis可能會(huì)刷盤(pán)影響性能

memcache把所有的數(shù)據(jù)存儲(chǔ)在物理內(nèi)存里。

redis有自己的VM機(jī)制,理論上能夠存儲(chǔ)比物理內(nèi)存更多的數(shù)據(jù),當(dāng)數(shù)據(jù)超量時(shí),會(huì)引發(fā)swap,把冷數(shù)據(jù)刷到磁盤(pán)上。從這一點(diǎn)上,數(shù)據(jù)量大時(shí),mc會(huì)更快一些。

畫(huà)外音:新版本redis已經(jīng)優(yōu)化。

情況三:由于網(wǎng)絡(luò)模型的差異,redis可能會(huì)因?yàn)镃PU計(jì)算影響IO調(diào)度

memcache使用非阻塞IO復(fù)用模型,redis也是使用非阻塞IO復(fù)用模型。

但由于redis還提供一些非KV存儲(chǔ)之外的排序,聚合功能,在執(zhí)行這些功能時(shí),復(fù)雜的CPU計(jì)算,會(huì)阻塞整個(gè)IO調(diào)度。

從這一點(diǎn)上,由于redis提供的功能較多,mc會(huì)更快一些。

情況四:由于線程模型的差異,redis難以利用多核特效提升性能

memcache使用多線程,主線程監(jiān)聽(tīng),worker子線程接受請(qǐng)求,執(zhí)行讀寫(xiě),這個(gè)過(guò)程中,可能存在鎖沖突。

redis使用單線程,雖無(wú)鎖沖突,但難以利用多核的特性提升整體吞吐量。

從這一點(diǎn)上,mc會(huì)快一些。

情況五:由于缺乏auto-sharding,redis只能手動(dòng)水平擴(kuò)展

不管是redis還是memcache,服務(wù)端集群沒(méi)有天然支持水平擴(kuò)展,需要在客戶(hù)端進(jìn)行分片,這其實(shí)對(duì)調(diào)用方并不友好。如果能服務(wù)端集群能夠支持水平擴(kuò)展,會(huì)更完美一些。

最后說(shuō)一點(diǎn),可能是很多人喜歡redis的原因之一:源碼可讀性高,代碼質(zhì)量很高。

看過(guò)redis和memcache的源碼,從可讀性上說(shuō),redis是我見(jiàn)過(guò)代碼最清爽的軟件,甚至沒(méi)有之一,或許簡(jiǎn)單是redis設(shè)計(jì)的初衷,編譯redis甚至不需要configure,不需要依賴(lài)第三方庫(kù),一個(gè)make就搞定了。

而memcache源碼,可能是考慮了太多的擴(kuò)展性,多系統(tǒng)的兼容性,代碼不清爽,看起來(lái)費(fèi)勁。

例如網(wǎng)絡(luò)IO的部分,redis源碼1-2個(gè)文件就搞定了,mc使用了libevent,一個(gè)fd傳過(guò)來(lái)傳過(guò)去,又pipe又線程傳遞的,特別容易把人繞暈。

【本文為專(zhuān)欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】


分享名稱(chēng):架構(gòu)選型,究竟啥時(shí)候選Redis?
本文URL:http://www.5511xx.com/article/dhpceoc.html