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鍵值對使用
Memcached的基本應(yīng)用模型如下圖所示
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ù)器列表管理的工作。
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)一返回給你章喉。付出總會有收獲