1.背景介紹
在大多數Web應用都將數據保存到關系型數據庫中,WWW服務器從中讀取數據并在瀏覽器中顯示。但隨著數據量的增大、訪問的集中,就會出現關系型數據的負擔加重、數據庫響應緩慢、網站打開延遲等問題。
通過在內存中緩存數據庫的查詢結果,減少數據訪問次數,以提高動態Web應用的速度,提高網站架構的并發能力和可擴展性
傳統開發中用的數據庫最多的就是MySQL了,隨著數據量上千萬或上億級后,它的關系型數據庫的讀取速度可能并不能滿足我們對數據的需求,所以內存式的緩存系統就出現了
2.知識剖析
Memcache 是一個高性能的分布式內存對象緩存系統,用于動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度。
Memcache基于一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,并通過memcache協議與守護進程通信。
Redis有著更為復雜的數據結構并且提供對他們的原子性操作,這是一個不同于其他數據庫的進化路徑。Redis的數據類型都是基于基本數據結構的同時對程序員透明,無需進行額外的抽象。
Redis運行在內存中但是可以持久化到磁盤,所以在對不同數據集進行高速讀寫時需要權衡內存,應用數據量不能大于硬件內存。
在內存數據庫方面的另一個優點是, 相比在磁盤上相同的復雜的數據結構,在內存中操作起來非常簡單,這樣Redis可以做很多內部復雜性很強的事情。
同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,因為他們并不需要進行隨機訪問。
3.常見問題
Redis與memcached有什么不同
什么是原子性,什么是原子性操作?
4.解決方案
Memcached
內部的數據存儲,使用基于Slab的內存管理方式,有利于減少內存碎片和頻繁分配銷毀內存所帶來的開銷。各個Slab按需動態分配一個page的內存
(和4Kpage的概念不同,這里默認page為1M),page內部按照不同slab class的尺寸再劃分為內存chunk供服務器存儲KV鍵值對使用
Redis內部的數據結構最終也會落實到key-Value對應的形式,不過從暴露給用戶的數據結構來看,
要比memcached豐富,除了標準的通常意義的鍵值對,Redis還支持List,Set, Hashes,Sorted Set等數據結構
基本命令
Memcached的命令或者說通訊協議非常簡單,Server所支持的命令基本就是對特定key的添加,刪除,替換,原子更新,讀取等,具體包括 Set, Get, Add, Replace, Append, Inc/Dec 等等
Memcached的通訊協議包括文本格式和二進制格式,用于滿足簡單網絡客戶端工具(如telnet)和對性能要求更高的客戶端的不同需求
Redis的命令在KV(String類型)上提供與Memcached類似的基本操作,在其它數據結構上也支持基本類似的操作(當然還有這些數據結構所特有的操作,如Set的union,List的pop等)而支持更多的數據結構,在一定程度上也就意味著更加廣泛的應用場合
除了多種數據結構的支持,
Redis相比Memcached還提供了許多額外的特性,比如Subscribe/publish命令,以支持發布/訂閱模式這樣的通知機制等等,這些額外的特性同樣有助于拓展它的應用場景Redis的客戶端-服務器通訊協議完全采用文本格式(在將來可能的服務器間通訊會采用二進制格式)
分布式實現:
(1)memcached的分布式由客戶端實現,通過一致性哈希算法來保證訪問的緩存命中率;Redis的分布式由服務器端實現,通過服務端配置來實現分布式;
(2)事務性,memcached沒有事務的概念,但是可以通過CAS協議來保證數據的完整性,一致性。Redis引入數據庫中的事務概念來保證數據的完整性和一致性。
(3)簡單性,memcached是純KV緩存,協議簡單,學習和使用成本比redis小很多
Memcached也不做數據的持久化工作,但是有許多基于memcached協議的項目實現了數據的持久化,例如memcacheDB使用BerkeleyDB進行數據存儲,但本質上它已經不是一個Cache Server,而只是一個兼容Memcached的協議key-valueData Store了
Redis可以以master-slave的方式配置服務器,Slave節點對數據進行replica備份,Slave節點也可以充當Read only的節點分擔數據讀取的工作
Redis內建支持兩種持久化方案,snapshot快照和AOF 增量Log方式。快照顧名思義就是隔一段時間將完整的數據Dump下來存儲在文件中。AOF增量Log則是記錄對數據的修改操作(實際上記錄的就是每個對數據產生修改的命令本身).
5.編碼實戰
6.擴展思考
JAVA中緩存的實質是什么?
計算機緩存的定義 :緩存是CPU的一部分,它存在于CPU中就此可以說明 CPU中不可能存放大量的數據所以java 的緩存 不是真正意義上的緩存 JAVA緩存有兩種:一、文件緩存,是指把數據存儲在磁盤上,可以XML格式,也可以序列化文件DAT格式還是其它文件格式。二、內存緩存,也就是實現一個類中靜態Map,對這個Map進行常規的增刪查。
7.參考文獻
http://www.redis.net.cn/tutorial/3512.html
http://blog.csdn.net/colorant/article/details/21089057
http://blog.csdn.net/wzqzhq/article/details/64920996
今天的分享就到這里啦,歡迎大家點贊、轉發、留言、拍磚~
技能樹.IT修真院
“我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,掌控自己學習的節奏,學習的路上不再迷茫”。
這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學習路線,學習透明化,成長可見化,師兄1對1免費指導。快來與我一起學習吧~
www.jnshu.com/login/1/14708688