這篇文章主要講解了“分布式緩存redis與Memcached的區(qū)別”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“分布式緩存Redis與Memcached的區(qū)別”吧!
站在用戶的角度思考問題,與客戶深入溝通,找到橋西網(wǎng)站設(shè)計(jì)與橋西網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋橋西地區(qū)。
Redis作者提供的8各方面:
1.性能;2.內(nèi)存使用效率;3.數(shù)據(jù)類型支持;4.數(shù)據(jù)備份和恢復(fù);5.數(shù)據(jù)存儲(chǔ)方案;6.底層C語言內(nèi)存管理方式;7.集群和分布式;8線程模型
Redis的作者Salvatore Sanfilippo曾經(jīng)對(duì)這兩種基于內(nèi)存的數(shù)據(jù)存儲(chǔ)系統(tǒng)進(jìn)行過比較,總體來看還是比較客觀的。
一、性能
由于Redis只使用單核,而Memcached可以使用多核,所以平均每一個(gè)核上Redis在存儲(chǔ)小數(shù)據(jù)時(shí)比Memcached性能更高。而在100k以上的數(shù)據(jù)時(shí),Memcached性能要高于Redis,雖然Redis最近也在存儲(chǔ)大數(shù)據(jù)的性能上進(jìn)行優(yōu)化,但是比起Memcached,還是稍有遜色。
二、內(nèi)存使用效率
使用簡(jiǎn)單的key-value存儲(chǔ)的話,Memcached的內(nèi)存利用率更高,而如果Redis采用hash結(jié)構(gòu)來做key-value存儲(chǔ),由于其組合式的壓縮,其內(nèi)存利用率會(huì)高于Memcached。
三、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會(huì)是不錯(cuò)的選擇。
與Memcached僅支持簡(jiǎn)單的key-value結(jié)構(gòu)的數(shù)據(jù)記錄不同,Redis支持的數(shù)據(jù)類型要豐富得多。最為常用的數(shù)據(jù)類型主要由五種:String、Hash、List、Set和Sorted Set。Redis內(nèi)部使用一個(gè)redisObject對(duì)象來表示所有的key和value。
四、數(shù)據(jù)備份恢復(fù)
memcached掛掉后,數(shù)據(jù)不可恢復(fù);redis數(shù)據(jù)丟失后可以通過aof恢復(fù),Redis支持?jǐn)?shù)據(jù)的備份,即master-slave主從模式的數(shù)據(jù)備份。
五、數(shù)據(jù)存儲(chǔ)
Redis和Memcached都是將數(shù)據(jù)存放在內(nèi)存中,都是內(nèi)存數(shù)據(jù)庫。不過memcached還可用于緩存其他東西,例如圖片、視頻等等。memcached把數(shù)據(jù)全部存在內(nèi)存之中,斷電后會(huì)掛掉,數(shù)據(jù)不能超過內(nèi)存大?。籸edis有部份存在硬盤上,這樣能保證數(shù)據(jù)的持久性,支持?jǐn)?shù)據(jù)的持久化(RDB、AOF),而Memcached不支持持久化。同時(shí)Redis并不是所有的數(shù)據(jù)都一直存儲(chǔ)在內(nèi)存中的,當(dāng)物理內(nèi)存用完時(shí),Redis可以將一些很久沒用到的value交換到磁盤,但memcached超過內(nèi)存比例會(huì)抹掉前面的數(shù)據(jù)。
六、內(nèi)存管理機(jī)制
對(duì)于像Redis和Memcached這種基于內(nèi)存的數(shù)據(jù)庫系統(tǒng)來說,內(nèi)存管理的效率高低是影響系統(tǒng)性能的關(guān)鍵因素。傳統(tǒng)C語言中的malloc/free函數(shù)是最常用的分配和釋放內(nèi)存的方法,但是這種方法存在著很大的缺陷:首先,對(duì)于開發(fā)人員來說不匹配的malloc和free容易造成內(nèi)存泄露;其次頻繁調(diào)用會(huì)造成大量?jī)?nèi)存碎片無法回收重新利用,降低內(nèi)存利用率;最后作為系統(tǒng)調(diào)用,其系統(tǒng)開銷遠(yuǎn)遠(yuǎn)大于一般函數(shù)調(diào)用。所以,為了提高內(nèi)存的管理效率,高效的內(nèi)存管理方案都不會(huì)直接使用malloc/free調(diào)用。
Memcached默認(rèn)使用Slab Allocation機(jī)制管理內(nèi)存,其主要思想是按照預(yù)先規(guī)定的大小,將分配的內(nèi)存分割成特定長(zhǎng)度的塊以存儲(chǔ)相應(yīng)長(zhǎng)度的key-value數(shù)據(jù)記錄,以完全解決內(nèi)存碎片問題。Slab Allocation機(jī)制只為存儲(chǔ)外部數(shù)據(jù)而設(shè)計(jì),也就是說所有的key-value數(shù)據(jù)都存儲(chǔ)在Slab Allocation系統(tǒng)里,而Memcached的其它內(nèi)存請(qǐng)求則通過普通的malloc/free來申請(qǐng),因?yàn)檫@些請(qǐng)求的數(shù)量和頻率決定了它們不會(huì)對(duì)整個(gè)系統(tǒng)的性能造成影響。
如圖所示,它首先從操作系統(tǒng)申請(qǐng)一大塊內(nèi)存,并將其分割成各種尺寸的塊Chunk,并把尺寸相同的塊分成組Slab Class。其中,Chunk就是用來存儲(chǔ)key-value數(shù)據(jù)的最小單位。每個(gè)Slab Class的大小,可以在Memcached啟動(dòng)的時(shí)候通過制定Growth Factor來控制。假定圖中Growth Factor的取值為1.25,如果第一組Chunk的大小為88個(gè)字節(jié),第二組Chunk的大小就為112個(gè)字節(jié),依此類推。
當(dāng)Memcached接收到客戶端發(fā)送過來的數(shù)據(jù)時(shí)首先會(huì)根據(jù)收到數(shù)據(jù)的大小選擇一個(gè)最合適的Slab Class,然后通過查詢Memcached保存著的該Slab Class內(nèi)空閑Chunk的列表就可以找到一個(gè)可用于存儲(chǔ)數(shù)據(jù)的Chunk。當(dāng)一條數(shù)據(jù)庫過期或者丟棄時(shí),該記錄所占用的Chunk就可以回收,重新添加到空閑列表中。
從以上過程我們可以看出Memcached的內(nèi)存管理制效率高,而且不會(huì)造成內(nèi)存碎片,但是它最大的缺點(diǎn)就是會(huì)導(dǎo)致空間浪費(fèi)。因?yàn)槊總€(gè)Chunk都分配了特定長(zhǎng)度的內(nèi)存空間,所以變長(zhǎng)數(shù)據(jù)無法充分利用這些空間。比如將100個(gè)字節(jié)的數(shù)據(jù)緩存到128個(gè)字節(jié)的Chunk中,剩余的28個(gè)字節(jié)就浪費(fèi)掉了。Memcached主要的cache機(jī)制是LRU(最近最少使用Least Recently Used)算法+超時(shí)失效。
Redis的內(nèi)存管理主要通過源碼中zmalloc.h和zmalloc.c兩個(gè)文件來實(shí)現(xiàn)的。Redis為了方便內(nèi)存的管理,在分配一塊內(nèi)存之后,會(huì)將這塊內(nèi)存的大小存入內(nèi)存塊的頭部。
如圖所示,real_ptr是redis調(diào)用malloc后返回的指針。redis將內(nèi)存塊的大小size存入頭部,size所占據(jù)的內(nèi)存大小是已知的,為size_t類型的長(zhǎng)度,然后返回ret_ptr。當(dāng)需要釋放內(nèi)存的時(shí)候,ret_ptr被傳給內(nèi)存管理程序。通過ret_ptr,程序可以很容易的算出real_ptr的值,然后將real_ptr傳給free釋放內(nèi)存。
Redis通過定義一個(gè)數(shù)組來記錄所有的內(nèi)存分配情況,這個(gè)數(shù)組的長(zhǎng)度為ZMALLOC_MAX_ALLOC_STAT。數(shù)組的每一個(gè)元素代表當(dāng)前程序所分配的內(nèi)存塊的個(gè)數(shù),且內(nèi)存塊的大小為該元素的下標(biāo)。在源碼中,這個(gè)數(shù)組為zmalloc_allocations。zmalloc_allocations[16]代表已經(jīng)分配的長(zhǎng)度為16bytes的內(nèi)存塊的個(gè)數(shù)。zmalloc.c中有一個(gè)靜態(tài)變量used_memory用來記錄當(dāng)前分配的內(nèi)存總大小。所以,總的來看,Redis采用的是包裝的mallc/free,相較于Memcached的內(nèi)存管理方法來說,要簡(jiǎn)單很多。
七、集群、分布式存儲(chǔ)
Memcached是全內(nèi)存的數(shù)據(jù)緩沖系統(tǒng),Redis雖然支持?jǐn)?shù)據(jù)的持久化,但是全內(nèi)存畢竟才是其高性能的本質(zhì)。作為基于內(nèi)存的存儲(chǔ)系統(tǒng)來說,機(jī)器物理內(nèi)存的大小就是系統(tǒng)能夠容納的最大數(shù)據(jù)量。如果需要處理的數(shù)據(jù)量超過了單臺(tái)機(jī)器的物理內(nèi)存大小,就需要構(gòu)建分布式集群來擴(kuò)展存儲(chǔ)能力。
Memcached本身并不支持分布式,因此只能在客戶端通過像一致性哈希這樣的分布式算法來實(shí)現(xiàn)Memcached的分布式存儲(chǔ),關(guān)于分布式一致性哈希算法見總結(jié):分布式一致性hash算法。當(dāng)客戶端向Memcached集群發(fā)送數(shù)據(jù)之前,首先會(huì)通過內(nèi)置的分布式算法計(jì)算出該條數(shù)據(jù)的目標(biāo)節(jié)點(diǎn),然后數(shù)據(jù)會(huì)直接發(fā)送到該節(jié)點(diǎn)上存儲(chǔ)。但客戶端查詢數(shù)據(jù)時(shí),同樣要計(jì)算出查詢數(shù)據(jù)所在的節(jié)點(diǎn),然后直接向該節(jié)點(diǎn)發(fā)送查詢請(qǐng)求以獲取數(shù)據(jù)。
相較于Memcached只能采用客戶端實(shí)現(xiàn)分布式存儲(chǔ),Redis更偏向于在服務(wù)器端構(gòu)建分布式存儲(chǔ),但沒有采用一致性哈希,關(guān)于Redis集群分析見總結(jié):分布式緩存Redis之cluster集群。最新版本的Redis已經(jīng)支持了分布式存儲(chǔ)功能。Redis Cluster是一個(gè)實(shí)現(xiàn)了分布式且允許單點(diǎn)故障的Redis高級(jí)版本,它沒有中心節(jié)點(diǎn),具有線性可伸縮的功能。為了保證單點(diǎn)故障下的數(shù)據(jù)可用性,Redis Cluster引入了Master節(jié)點(diǎn)和Slave節(jié)點(diǎn)。在Redis Cluster中,每個(gè)Master節(jié)點(diǎn)都會(huì)有對(duì)應(yīng)的兩個(gè)用于冗余的Slave節(jié)點(diǎn)。這樣在整個(gè)集群中,任意兩個(gè)節(jié)點(diǎn)的宕機(jī)都不會(huì)導(dǎo)致數(shù)據(jù)的不可用。當(dāng)Master節(jié)點(diǎn)退出后,集群會(huì)自動(dòng)選擇一個(gè)Slave節(jié)點(diǎn)成為新的Master節(jié)點(diǎn)。
八、Memcache支持多核多線程,Redis單線程操作
感謝各位的閱讀,以上就是“分布式緩存Redis與Memcached的區(qū)別”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)分布式緩存Redis與Memcached的區(qū)別這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
文章標(biāo)題:分布式緩存Redis與Memcached的區(qū)別
分享鏈接:http://jinyejixie.com/article20/iepejo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)站收錄、軟件開發(fā)、標(biāo)簽優(yōu)化、ChatGPT、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)