1.背景介紹
在大多數(shù)Web應(yīng)用都將數(shù)據(jù)保存到關(guān)系型數(shù)據(jù)庫(kù)中视搏,WWW服務(wù)器從中讀取數(shù)據(jù)并在瀏覽器中顯示审孽。但隨著數(shù)據(jù)量的增大、訪問(wèn)的集中凶朗,就會(huì)出現(xiàn)關(guān)系型數(shù)據(jù)的負(fù)擔(dān)加重瓷胧、數(shù)據(jù)庫(kù)響應(yīng)緩慢显拳、網(wǎng)站打開(kāi)延遲等問(wèn)題棚愤。
通過(guò)在內(nèi)存中緩存數(shù)據(jù)庫(kù)的查詢結(jié)果,減少數(shù)據(jù)訪問(wèn)次數(shù),以提高動(dòng)態(tài)Web應(yīng)用的速度宛畦,提高網(wǎng)站架構(gòu)的并發(fā)能力和可擴(kuò)展性
傳統(tǒng)開(kāi)發(fā)中用的數(shù)據(jù)庫(kù)最多的就是MySQL了瘸洛,隨著數(shù)據(jù)量上千萬(wàn)或上億級(jí)后,它的關(guān)系型數(shù)據(jù)庫(kù)的讀取速度可能并不能滿足我們對(duì)數(shù)據(jù)的需求次和,所以內(nèi)存式的緩存系統(tǒng)就出現(xiàn)了
2.知識(shí)剖析
Memcache 是一個(gè)高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng)反肋,用于動(dòng)態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫(kù)負(fù)載。它通過(guò)在內(nèi)存中緩存數(shù)據(jù)和對(duì)象來(lái)減少讀取數(shù)據(jù)庫(kù)的次數(shù)踏施,從而提高動(dòng)態(tài)石蔗、數(shù)據(jù)庫(kù)驅(qū)動(dòng)網(wǎng)站的速度。
Memcache基于一個(gè)存儲(chǔ)鍵/值對(duì)的hashmap畅形。其守護(hù)進(jìn)程(daemon )是用C寫的养距,但是客戶端可以用任何語(yǔ)言來(lái)編寫,并通過(guò)memcache協(xié)議與守護(hù)進(jìn)程通信日熬。
Redis有著更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)并且提供對(duì)他們的原子性操作棍厌,這是一個(gè)不同于其他數(shù)據(jù)庫(kù)的進(jìn)化路徑。Redis的數(shù)據(jù)類型都是基于基本數(shù)據(jù)結(jié)構(gòu)的同時(shí)對(duì)程序員透明竖席,無(wú)需進(jìn)行額外的抽象耘纱。
Redis運(yùn)行在內(nèi)存中但是可以持久化到磁盤,所以在對(duì)不同數(shù)據(jù)集進(jìn)行高速讀寫時(shí)需要權(quán)衡內(nèi)存毕荐,應(yīng)用數(shù)據(jù)量不能大于硬件內(nèi)存束析。
在內(nèi)存數(shù)據(jù)庫(kù)方面的另一個(gè)優(yōu)點(diǎn)是, 相比在磁盤上相同的復(fù)雜的數(shù)據(jù)結(jié)構(gòu)憎亚,在內(nèi)存中操作起來(lái)非常簡(jiǎn)單畸陡,這樣Redis可以做很多內(nèi)部復(fù)雜性很強(qiáng)的事情。
同時(shí)虽填,在磁盤格式方面他們是緊湊的以追加的方式產(chǎn)生的丁恭,因?yàn)樗麄儾⒉恍枰M(jìn)行隨機(jī)訪問(wèn)。
3.常見(jiàn)問(wèn)題
Redis與memcached有什么不同
什么是原子性,什么是原子性操作斋日?
4.解決方案
Memcached
內(nèi)部的數(shù)據(jù)存儲(chǔ)牲览,使用基于Slab的內(nèi)存管理方式,有利于減少內(nèi)存碎片和頻繁分配銷毀內(nèi)存所帶來(lái)的開(kāi)銷恶守。各個(gè)Slab按需動(dòng)態(tài)分配一個(gè)page的內(nèi)存
(和4Kpage的概念不同第献,這里默認(rèn)page為1M),page內(nèi)部按照不同slab class的尺寸再劃分為內(nèi)存chunk供服務(wù)器存儲(chǔ)KV鍵值對(duì)使用
Redis內(nèi)部的數(shù)據(jù)結(jié)構(gòu)最終也會(huì)落實(shí)到key-Value對(duì)應(yīng)的形式兔港,不過(guò)從暴露給用戶的數(shù)據(jù)結(jié)構(gòu)來(lái)看庸毫,
要比memcached豐富,除了標(biāo)準(zhǔn)的通常意義的鍵值對(duì)衫樊,Redis還支持List飒赃,Set利花, Hashes,Sorted Set等數(shù)據(jù)結(jié)構(gòu)
基本命令
Memcached的命令或者說(shuō)通訊協(xié)議非常簡(jiǎn)單载佳,Server所支持的命令基本就是對(duì)特定key的添加炒事,刪除,替換蔫慧,原子更新挠乳,讀取等,具體包括 Set, Get, Add, Replace, Append, Inc/Dec 等等
Memcached的通訊協(xié)議包括文本格式和二進(jìn)制格式姑躲,用于滿足簡(jiǎn)單網(wǎng)絡(luò)客戶端工具(如telnet)和對(duì)性能要求更高的客戶端的不同需求
Redis的命令在KV(String類型)上提供與Memcached類似的基本操作睡扬,在其它數(shù)據(jù)結(jié)構(gòu)上也支持基本類似的操作(當(dāng)然還有這些數(shù)據(jù)結(jié)構(gòu)所特有的操作,如Set的union黍析,List的pop等)而支持更多的數(shù)據(jù)結(jié)構(gòu)威蕉,在一定程度上也就意味著更加廣泛的應(yīng)用場(chǎng)合
除了多種數(shù)據(jù)結(jié)構(gòu)的支持,
Redis相比Memcached還提供了許多額外的特性橄仍,比如Subscribe/publish命令韧涨,以支持發(fā)布/訂閱模式這樣的通知機(jī)制等等,這些額外的特性同樣有助于拓展它的應(yīng)用場(chǎng)景Redis的客戶端-服務(wù)器通訊協(xié)議完全采用文本格式(在將來(lái)可能的服務(wù)器間通訊會(huì)采用二進(jìn)制格式)
分布式實(shí)現(xiàn):
(1)memcached的分布式由客戶端實(shí)現(xiàn)侮繁,通過(guò)一致性哈希算法來(lái)保證訪問(wèn)的緩存命中率虑粥;Redis的分布式由服務(wù)器端實(shí)現(xiàn),通過(guò)服務(wù)端配置來(lái)實(shí)現(xiàn)分布式宪哩;
(2)事務(wù)性娩贷,memcached沒(méi)有事務(wù)的概念,但是可以通過(guò)CAS協(xié)議來(lái)保證數(shù)據(jù)的完整性锁孟,一致性彬祖。Redis引入數(shù)據(jù)庫(kù)中的事務(wù)概念來(lái)保證數(shù)據(jù)的完整性和一致性。
(3)簡(jiǎn)單性品抽,memcached是純KV緩存储笑,協(xié)議簡(jiǎn)單,學(xué)習(xí)和使用成本比redis小很多
Memcached也不做數(shù)據(jù)的持久化工作圆恤,但是有許多基于memcached協(xié)議的項(xiàng)目實(shí)現(xiàn)了數(shù)據(jù)的持久化突倍,例如memcacheDB使用BerkeleyDB進(jìn)行數(shù)據(jù)存儲(chǔ),但本質(zhì)上它已經(jīng)不是一個(gè)Cache Server盆昙,而只是一個(gè)兼容Memcached的協(xié)議key-valueData Store了
Redis可以以master-slave的方式配置服務(wù)器羽历,Slave節(jié)點(diǎn)對(duì)數(shù)據(jù)進(jìn)行replica備份,Slave節(jié)點(diǎn)也可以充當(dāng)Read only的節(jié)點(diǎn)分擔(dān)數(shù)據(jù)讀取的工作
Redis內(nèi)建支持兩種持久化方案淡喜,snapshot快照和AOF 增量Log方式秕磷。快照顧名思義就是隔一段時(shí)間將完整的數(shù)據(jù)Dump下來(lái)存儲(chǔ)在文件中炼团。AOF增量Log則是記錄對(duì)數(shù)據(jù)的修改操作(實(shí)際上記錄的就是每個(gè)對(duì)數(shù)據(jù)產(chǎn)生修改的命令本身).
5.編碼實(shí)戰(zhàn)
6.擴(kuò)展思考
JAVA中緩存的實(shí)質(zhì)是什么澎嚣?
計(jì)算機(jī)緩存的定義 :緩存是CPU的一部分疏尿,它存在于CPU中就此可以說(shuō)明 CPU中不可能存放大量的數(shù)據(jù)所以java 的緩存 不是真正意義上的緩存 JAVA緩存有兩種:一、文件緩存,是指把數(shù)據(jù)存儲(chǔ)在磁盤上币叹,可以XML格式润歉,也可以序列化文件DAT格式還是其它文件格式模狭。二颈抚、內(nèi)存緩存,也就是實(shí)現(xiàn)一個(gè)類中靜態(tài)Map,對(duì)這個(gè)Map進(jìn)行常規(guī)的增刪查嚼鹉。
7.參考文獻(xiàn)
http://www.redis.net.cn/tutorial/3512.html
http://blog.csdn.net/colorant/article/details/21089057
http://blog.csdn.net/wzqzhq/article/details/64920996
今天的分享就到這里啦贩汉,歡迎大家點(diǎn)贊、轉(zhuǎn)發(fā)锚赤、留言匹舞、拍磚~
技能樹(shù).IT修真院
“我們相信人人都可以成為一個(gè)工程師,現(xiàn)在開(kāi)始线脚,找個(gè)師兄赐稽,帶你入門,掌控自己學(xué)習(xí)的節(jié)奏浑侥,學(xué)習(xí)的路上不再迷面⒍妫”。
這里是技能樹(shù).IT修真院寓落,成千上萬(wàn)的師兄在這里找到了自己的學(xué)習(xí)路線括丁,學(xué)習(xí)透明化,成長(zhǎng)可見(jiàn)化伶选,師兄1對(duì)1免費(fèi)指導(dǎo)史飞。快來(lái)與我一起學(xué)習(xí)吧~
www.jnshu.com/login/1/14708688