緩存Memcached 與 Redis 相同點差異點分析

redis和memcached的區(qū)別

1、Redis和Memcache都是將數(shù)據(jù)存放在內(nèi)存中例证,都是內(nèi)存數(shù)據(jù)庫劈彪。不過memcache還可用于緩存其他東西绪杏,例如圖片间唉、視頻等等挟炬;

2月弛、Redis不僅僅支持簡單的k/v類型的數(shù)據(jù)弦叶,同時還提供list尊沸,set威沫,hash等數(shù)據(jù)結(jié)構(gòu)的存儲;

3洼专、虛擬內(nèi)存--Redis當物理內(nèi)存用完時棒掠,可以將一些很久沒用到的value 交換到磁盤;

4屁商、過期策略--memcache在set時就指定烟很,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire 設(shè)定蜡镶,例如expire name 10雾袱;

5、分布式--設(shè)定memcache集群官还,利用magent做一主多從;redis可以做一主多從芹橡。都可以一主一從;

6望伦、存儲數(shù)據(jù)安全--memcache掛掉后林说,數(shù)據(jù)沒了煎殷;redis可以定期保存到磁盤(持久化);

7腿箩、災(zāi)難恢復(fù)--memcache掛掉后豪直,數(shù)據(jù)不可恢復(fù); redis數(shù)據(jù)丟失后可以通過aof恢復(fù);

8度秘、Redis支持數(shù)據(jù)的備份顶伞,即master-slave模式的數(shù)據(jù)備份;

9剑梳、應(yīng)用場景不一樣:Redis出來作為NoSQL數(shù)據(jù)庫使用外唆貌,還能用做消息隊列、數(shù)據(jù)堆棧和數(shù)據(jù)緩存等垢乙;Memcached適合于緩存SQL語句锨咙、數(shù)據(jù)集、用戶臨時性數(shù)據(jù)追逮、延遲查詢數(shù)據(jù)和session等酪刀。
Memcached和Redis作為兩種Inmemory的key-value數(shù)據(jù)庫,在設(shè)計和思想方面有著很多共通的地方钮孵,功能和應(yīng)用方面在很多場合下(作為分布式緩存服務(wù)器使用等) 也很相似骂倘,在這里把兩者放在一起做一下對比的介紹

基本架構(gòu)和思想

首先簡單介紹一下兩者的架構(gòu)和設(shè)計思路

Memcached

Memcached采用客戶端-服務(wù)器的架構(gòu),客戶端和服務(wù)器端的通訊使用自定義的協(xié)議標準巴席,只要滿足協(xié)議格式要求历涝,客戶端Library可以用任何語言實現(xiàn)。

從用戶的角度來說漾唉,服務(wù)器維護了一個鍵-值關(guān)系的數(shù)據(jù)表荧库,服務(wù)器之間相互獨立,互相之間不共享數(shù)據(jù)也不做任何通訊操作赵刑》稚溃客戶端需要知道所有的服務(wù)器,并自行負責(zé)管理數(shù)據(jù)在各個服務(wù)器間的分配般此。

在服務(wù)器端蚪战,內(nèi)部的數(shù)據(jù)存儲,使用基于Slab的內(nèi)存管理方式铐懊,有利于減少內(nèi)存碎片和頻繁分配銷毀內(nèi)存所帶來的開銷屎勘。各個Slab按需動態(tài)分配一個page的內(nèi)存(和4Kpage的概念不同,這里默認page為1M)居扒,page內(nèi)部按照不同slab class的尺寸再劃分為內(nèi)存chunk供服務(wù)器存儲KV鍵值對使用

image.png

Memcached的基本應(yīng)用模型如下圖所示

image.png

redis

Redis的基本應(yīng)用模式和上圖memcached的基本相似概漱,不難發(fā)現(xiàn)網(wǎng)上到處都是關(guān)于redis是否可以完全替代memcached使用的問題

Redis內(nèi)部的數(shù)據(jù)結(jié)構(gòu)最終也會落實到key-Value對應(yīng)的形式,不過從暴露給用戶的數(shù)據(jù)結(jié)構(gòu)來看喜喂,要比memcached豐富瓤摧,除了標準的通常意義的鍵值對竿裂,Redis還支持List,Set照弥, Hashes腻异,Sorted Set等數(shù)據(jù)結(jié)構(gòu)

基本命令

Memcached的命令或者說通訊協(xié)議非常簡單,Server所支持的命令基本就是對特定key的添加这揣,刪除悔常,替換,原子更新给赞,讀取等机打,具體包括 Set, Get, Add, Replace, Append, Inc/Dec 等等

Memcached的通訊協(xié)議包括文本格式和二進制格式,用于滿足簡單網(wǎng)絡(luò)客戶端工具(如telnet)和對性能要求更高的客戶端的不同需求

Redis的命令在KV(String類型)上提供與Memcached類似的基本操作片迅,在其它數(shù)據(jù)結(jié)構(gòu)上也支持基本類似的操作(當然還有這些數(shù)據(jù)結(jié)構(gòu)所特有的操作残邀,如Set的union,List的pop等)而支持更多的數(shù)據(jù)結(jié)構(gòu)柑蛇,在一定程度上也就意味著更加廣泛的應(yīng)用場合

除了多種數(shù)據(jù)結(jié)構(gòu)的支持芥挣,Redis相比Memcached還提供了許多額外的特性,比如Subscribe/publish命令耻台,以支持發(fā)布/訂閱模式這樣的通知機制等等空免,這些額外的特性同樣有助于拓展它的應(yīng)用場景

Redis的客戶端-服務(wù)器通訊協(xié)議完全采用文本格式(在將來可能的服務(wù)器間通訊會采用二進制格式)

事務(wù)

redis通過Multi / Watch /Exec等命令可以支持事務(wù)的概念,原子性的執(zhí)行一批命令盆耽。在2.6以后的版本中由于添加了對Script腳本的支持鼓蜒,而腳本固有的是以transaction事務(wù)的方式執(zhí)行的,并且更加易于使用征字,所以不排除將來取消Multi等命令接口的可能性

Memcached的應(yīng)用模式中,除了increment/decrement這樣的原子操作命令娇豫,不存在對事務(wù)的支持

數(shù)據(jù)備份匙姜,有效性,持久化等

memcached不保證存儲的數(shù)據(jù)的有效性冯痢,Slab內(nèi)部基于LRU也會自動淘汰舊數(shù)據(jù)氮昧,客戶端不能假設(shè)數(shù)據(jù)在服務(wù)器端的當前狀態(tài),這應(yīng)該說是Memcached的Feature設(shè)定浦楣,用戶不必太多關(guān)心或者自己管理數(shù)據(jù)的淘汰更新工作袖肥,當然是否適合你的應(yīng)用,取決于具體的需求振劳,它也可能成為你需要精確自行控制Cache生命周期的一個障礙

Memcached也不做數(shù)據(jù)的持久化工作椎组,但是有許多基于memcached協(xié)議的項目實現(xiàn)了數(shù)據(jù)的持久化,例如memcacheDB使用BerkeleyDB進行數(shù)據(jù)存儲历恐,但本質(zhì)上它已經(jīng)不是一個Cache Server寸癌,而只是一個兼容Memcached的協(xié)議key-valueData Store了

Redis可以以master-slave的方式配置服務(wù)器专筷,Slave節(jié)點對數(shù)據(jù)進行replica備份,Slave節(jié)點也可以充當Read only的節(jié)點分擔(dān)數(shù)據(jù)讀取的工作

Redis內(nèi)建支持兩種持久化方案蒸苇,snapshot快照和AOF 增量Log方式磷蛹。快照顧名思義就是隔一段時間將完整的數(shù)據(jù)Dump下來存儲在文件中溪烤。AOF增量Log則是記錄對數(shù)據(jù)的修改操作(實際上記錄的就是每個對數(shù)據(jù)產(chǎn)生修改的命令本身)味咳,兩種方案可以并存,也各有優(yōu)缺點檬嘀,具體參見http://redis.io/topics/persistence

以上Redis的數(shù)據(jù)備份持久化方案等槽驶,如果不需要,為了提高性能枪眉,也完全可以Disable

性能

性能方面捺檬,兩者都有一些自己考慮和實現(xiàn)

Memcached

memcached自身并不主動定期檢查和標記哪些數(shù)據(jù)需要被淘汰,只有當再次讀取相關(guān)數(shù)據(jù)時才檢查時間戳贸铜,或者當內(nèi)存不夠使用需要主動淘汰數(shù)據(jù)時進一步檢查LRU數(shù)據(jù)

Redis

Redis為了減少大量小數(shù)據(jù)CMD操作的網(wǎng)絡(luò)通訊時間開銷 RTT (Round Trip Time)堡纬,支持pipeline和script技術(shù)

所謂的pipeline就是支持在一次通訊中,發(fā)送多個命令給服務(wù)器批量執(zhí)行蒿秦,帶來的代價是服務(wù)器端需要更多的內(nèi)存來緩存查詢結(jié)果烤镐。

Redis內(nèi)嵌了LUA解析器,可以執(zhí)行l(wèi)ua 腳本棍鳖,腳本可以通過eval等命令直接執(zhí)行炮叶,也可以使用script load等方式上傳到服務(wù)器端的script cache中重復(fù)使用

這兩種方式都可以有效地減少網(wǎng)絡(luò)通訊開銷,增加數(shù)據(jù)吞吐率

對于KV的操作渡处,Memcached和Redis都支持Multiple的Get和Set命令(Memcached的Multiple Set命令貌似只在二進制的協(xié)議中支持)镜悉,這同樣有利于性能的提升

實際性能方面,網(wǎng)上有很多測試比較医瘫,給出的結(jié)果各不相同侣肄,這無疑和各種測試的測試用例,測試環(huán)境醇份,和測試時具體使用的客戶端Library實現(xiàn)有關(guān)稼锅。但是總體看下來,比較靠譜的結(jié)論是在kv類操作上僚纷,兩者的性能接近矩距,Memcached的結(jié)構(gòu)更加簡單,理論上應(yīng)該會略微快一些怖竭。

集群

memcached的服務(wù)器端互相完全獨立锥债,客戶端通常通過對鍵值應(yīng)用Hash算法決定數(shù)據(jù)的分區(qū),為了減少服務(wù)器的增減對Hash結(jié)果的影響,導(dǎo)致大面積的緩存失效赞弥,多數(shù)客戶端實現(xiàn)了一致性hash算法

Redis計劃在服務(wù)器端內(nèi)建對集群的支持毅整,但是目前代碼還處于alpha階段(貌似已經(jīng)Design了兩三年了?)在此之前绽左,同樣可以認為每個Redis服務(wù)器實例相互之間是完全獨立的悼嫉,需要依靠客戶端處理分區(qū)算法和可用服務(wù)器列表管理的工作。

image.png

Redis官方推薦的用于Sharding的客戶端程序庫是Twitter的開源項目 Twemproxy拼窥, Twemproxy同時支持Memcached和Redis的文本通訊協(xié)議戏蔑。

需要注意的是,Redis的許多命令在集群環(huán)境下是不能正確運行的鲁纠,例如set的交集总棵,以及跨節(jié)點的事務(wù)操作等等,因為目前的Redis集群設(shè)計改含,根本目標也就是服務(wù)器之間互相匯報一下存活狀態(tài)情龄,以及對數(shù)據(jù)做榮譽備份平衡負載等而已,本質(zhì)上對數(shù)據(jù)的跨節(jié)點操作并不提供任何額外支持捍壤,所以在數(shù)據(jù)服務(wù)的層面上來說骤视,各個服務(wù)器依舊是完全獨立的。

這些操作如果一定要實現(xiàn)鹃觉,當然可以通過客戶端代碼來實現(xiàn)(效率有多高且不說)专酗,類似的問題memcached集群當然也會遇上,但是原本memcached就不支持復(fù)雜的操作和數(shù)據(jù)類型盗扇,許多運算邏輯原本就是由客戶端代碼或應(yīng)用程序自己處理的祷肯。

MR****類批處理應(yīng)用

提供指定范圍的遍歷操作,是支持類似MapReduce這樣的批處理應(yīng)用邏輯的關(guān)鍵之一疗隶,但是要在基于hash方式存儲的數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上提供這樣的支持并不容易(或者說要實現(xiàn)高效的范圍或遍歷操作并不容易)

Redis支持Scan操作用于遍歷數(shù)據(jù)集佑笋,這一操作基于其內(nèi)部數(shù)據(jù)結(jié)構(gòu)及實現(xiàn)的限制,可以保證在Scan開始時的所有數(shù)據(jù)都能被獲取到斑鼻,但是不能保證不返回重復(fù)的數(shù)據(jù)蒋纬,這需要由客戶端來檢查,或者客戶端對此無所謂卵沉。Scan操作還支持Match條件用來過濾鍵值,雖然存在一定的局限性法牲,例如match條件的比較是在獲取數(shù)據(jù)之后再執(zhí)行的史汗,效率是一個問題,更明顯的問題是不能保證每次scan的iterate過程都能返回同樣數(shù)量的有效數(shù)據(jù)拒垃。

對于范圍操作停撞,Redis的Ordered Set支持在插入時指定數(shù)據(jù)的分數(shù)(Score)用于排序,而后支持在指定Score范圍內(nèi)的各種操作,雖然由于不支持基于字符串的或自定義的基準的Range操作戈毒,這樣的范圍操作應(yīng)用起來有很大的局限性(或者說需要滿足特定的應(yīng)用模式)艰猬,但是還是比沒有好了

Memcached核心協(xié)議本身不支持任何范圍類的操作,也沒有對遍歷操作的支持埋市,甚至不存在官方合法的列舉所有Key的操作冠桃,這當然很大程度上源于其設(shè)計思想和精簡的架構(gòu)

不過還是有一些兼容memcached協(xié)議的服務(wù)器實現(xiàn)了范圍類操作,具體格式可以參考 https://code.google.com/p/memcached/wiki/RangeOps 所建議的標準

此外Redis的Hashes數(shù)據(jù)結(jié)構(gòu)道宅,在一定程度上可以滿足獲取特定子集數(shù)據(jù)的應(yīng)用邏輯需求食听。

綜上來說,如果要實現(xiàn)類似Hbase支持的scan操作污茵,不論是Redis還是memcached都無法做到樱报,但是對于Redis來說,能否用于批處理類應(yīng)用泞当,不能一概而論迹蛤,取決于具體的數(shù)據(jù)的格式邏輯和使用方式。通過適當?shù)恼{(diào)整應(yīng)用程序使用數(shù)據(jù)的方式襟士,還是有可能在一定程度上實現(xiàn)對MR類批處理盗飒,或范圍查詢類應(yīng)用邏輯的支持的。而對于鍵值分布在一個較大的連續(xù)空間敌蜂,數(shù)量不確定箩兽,同時又無法很好的映射為數(shù)值進而使用ordered set來處理的這樣一些數(shù)據(jù)結(jié)構(gòu),應(yīng)該還是很難高效的分區(qū)遍歷的

Memcached詳細講解視頻下載地址:

Memcached緩存技術(shù)視頻教程大全
鏈接:http://pan.baidu.com/s/1eS4DeQA
大型門戶網(wǎng)站核心技術(shù)-memcached
鏈接:http://pan.baidu.com/s/1eRA27lS
關(guān)注公眾號(ID:daimajiqiao)回復(fù)(10)即可獲取提取密碼當然我也會把所有相關(guān)視頻教程統(tǒng)一返回給你章喉。付出總會有收獲

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汗贫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子秸脱,更是在濱河造成了極大的恐慌落包,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摊唇,死亡現(xiàn)場離奇詭異咐蝇,居然都是意外死亡,警方通過查閱死者的電腦和手機巷查,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門有序,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岛请,你說我怎么就攤上這事旭寿。” “怎么了崇败?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵盅称,是天一觀的道長肩祥。 經(jīng)常有香客問我,道長缩膝,這世上最難降的妖魔是什么混狠? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮疾层,結(jié)果婚禮上将饺,老公的妹妹穿的比我還像新娘。我一直安慰自己云芦,他們只是感情好俯逾,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舅逸,像睡著了一般桌肴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上琉历,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天坠七,我揣著相機與錄音,去河邊找鬼旗笔。 笑死彪置,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蝇恶。 我是一名探鬼主播拳魁,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撮弧!你這毒婦竟也來了潘懊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤贿衍,失蹤者是張志新(化名)和其女友劉穎授舟,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贸辈,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡释树,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了擎淤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奢啥。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嘴拢,靈堂內(nèi)的尸體忽然破棺而出桩盲,到底是詐尸還是另有隱情,我是刑警寧澤炊汤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布正驻,位于F島的核電站,受9級特大地震影響抢腐,放射性物質(zhì)發(fā)生泄漏姑曙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一迈倍、第九天 我趴在偏房一處隱蔽的房頂上張望伤靠。 院中可真熱鬧,春花似錦啼染、人聲如沸宴合。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卦洽。三九已至,卻和暖如春斜棚,著一層夾襖步出監(jiān)牢的瞬間阀蒂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工弟蚀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚤霞,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓义钉,卻偏偏與公主長得像昧绣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捶闸,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容