分布式緩存
分布式緩存是為了解決 數據庫服務器 和 Web服務器 之間的瓶頸,如果一個網站流量很大這個瓶頸將會非常明顯,每次數據庫查詢耗費的時間將不容樂觀。對於更新速度不是很快的站點,可以采用靜態化來避免過多的數據查詢,可使用Freemaker或Velocity來實現頁面靜態化。對於更新數據以秒級的站點,靜態化也不會太理想,可通過分布式緩存系統來解決,如Redis、MemCache、SSDB等。
分布式緩存系統出現的原因
- 互聯網或電商應用系統中,業務需求復雜,必須對整個業務系統進行垂直拆分,以保證各個業務模塊清晰並對外提供服務。
- 用戶群體廣泛就必然存在高並發的問題,如果將引用系統部署在單節點服務器上,勢必會對單服務器造成巨大的訪問壓力,因此需要將系統部署到不同的節點上,同時也要將不同的數據分散到不同的節點上。
- 互聯網時代大數據為王,人類正從IT時代走向DT時代,因為數據量大所以要對數據進行分布式處理。
【分布式緩存特性】
高性能:當傳統數據庫面臨大規模數據訪問時,磁盤I/O往往成為性能瓶頸,從而導致過高的響應延遲,能夠將高速內存作為數據對象的存儲介質,數據以key/value形式存儲,理想情況下可以獲得DRAM級的讀寫性能;
動態擴展性:支持彈性擴展,通過動態增加或減少節點應對變化的數據訪問負載,提供可預測的性能與擴展性;同時最大限度地提高資源利用率;
高可用性:可用性包含數據可用性與服務可用性兩方面.基於冗余機制實現高可用性,無單點失效,支持故障的自動發現,透明地實施故障切換,不會因服務器故障而導致緩存服務中斷或數據丟失.動態擴展時自動均衡數據分區,同時保障緩存服務持續可用;
易用性:提供單一的數據與管理視圖,API接口簡單,,且與拓撲結構無關,動態擴展或失效恢復時無需人工配置,自動選取備份節點,多數緩存系統提供了圖形化的管理控制台,便於統一維護。
分布式緩存優點
1,提升數據讀取速度
2,提升系統擴展能力
3,降低存儲成本
分布式緩存應用場景
1,用來緩存Web頁面的內容片段,包括HTML、CSS和圖片等,多應用於社交網站等;
2,緩存系統作為ORM框架的二級緩存對外提供服務,減輕數據庫的負載壓力,加速應用訪問;
3,緩存包括Session會話狀態及應用橫向擴展時的狀態數據等;,
4,並行處理,涉及大量中間計算結果需要共享;
5,分布式緩存提供了針對事件流的連續查詢(continuousquery)處理技術,滿足實時性需
6,分布式緩存為事務型應用提供高吞吐率、低延時的解決方案,支持高並發事務請求處理,多應用於鐵路、金融服務和電信等領域。
數據存儲方案
提到數據就不得不說數據庫,目前主流的數據存儲方案分為兩個方向:

- 關系型數據庫
如Oracle、MySQL、DB2、MSSQL... - 非關系型數據庫
如MongoDB、HBase、Redis、LevelDB、CouchDB...

在Web開發中,經常要重復從數據庫中獲取相同的數據,這種重復的操作極大地增加了數據庫的負載。緩存是解決這種問題最好的辦法。
Redis就是一個高性能的、分布式的內存對象緩存系統,用於在動態應用中減少數據庫負載,提升訪問速度。
在用戶第一次發送請求時,從關系型數據庫RDBMS中獲取數據並返回,同時將該數據保存到分布式緩存系統中。當用戶再次發送請求時,直接從分布式緩存系統中獲取,以提高性能。這里使用Redis做集群的主從策略來實現高可用架構。
分布式緩存產品
實際開發中經常使用的分布式緩存系統主要有Redis、MemCache、SSDB,這三者都是KV存儲方案,各有優缺,但Redis相比較而言實用性更加廣泛。由於Redis特點突出,支持多種數據類型,如String、Hash、Set、List、StoredSet,並且有高可用的解決方案和集群方案,支持水平擴容。也就解決了大部分企業的需求,而MemCache、SSDB相對來說,解決方案並不算那么完善。
Redis與MemCache的區別
- 線程操作
Redis使用單核而Memcache使用多核,也就是說,Redis屬於單線程操作,MemCache屬於多線程操作。在多個用戶同時請求時,Redis是處理完一個請求以后再去處理下一個請求。而MemCache可以同時處理多個請求。
- 數據結構
Redis不僅支持簡單的KV類型的數據,同時提供List、Set、Hash等數據結構的存儲。
- 數據安全性
Redis和MemCache都是將數據存儲在內存中,都屬於內存數據庫。但是MemCache服務宕機或重啟后數據是不可恢復的,而Redis服務宕機或重啟后可以恢復。因此Redis可以做持久化,它會將內存數據定期同步到磁盤中。
Redis提供兩種持久化策略,默認支持的是RDB持久化以及需要手工開啟的AOF持久化。而MemCache僅僅是將數據存儲在內存中。
- 數據備份
Redis支持數據備份,需開啟master-slave
主從策略。
- 過期策略
MemCache在set
時就指定了過期時間,而Redis可以通過expire
設置Key
的過期時間。
- 內存回收
MemCache有內存回收機制,當程序中為它設置的內存大小,一旦存儲的數據超過時,它會去自動回收,也就是釋放,不然會出現內存溢出的情況。這是因為MemCache的數據都是存儲在內存中的。而Redis不會出現這種情況,因為Redis可以將數據持久化到磁盤上。
Redis和SSDB的區別
SSDB是基於Google性能極高的LevelDB作為存儲引擎去架構的,特性與Redis基本一致,而且可以和Redis完美整合。SSDB完全可以替換Redis,它與Redis的API兼容並支持Redis的客戶端,也就是說,在redis-cli
上的所有操作在SSDB中同樣適用。由於SSDB該性能的寫特性,所以很多時候可以通過Redis+SSDB實現分布式緩存的策略,即"用SSDB寫用Redis讀"。
Redis
Redis是一個開源的面向鍵值對Key-Value
類型數據的分布式NoSQL數據庫系統,它的特點是高性能,適用於高並發的應用場景。可以說Redis純粹是為應用而產生的。
Redis是一個高性能的KV數據庫,並提供多種語言的API。Redis的缺點也很明顯,對事務的處理很弱,也無法做太復雜的關系型數據庫中的模型。
Redis支持存儲的Value類型相對更多,典型的如字符串String、鏈表List、集合Set、有序集合Zset(sorted set)、哈希類型Hash,這些數據類型都支持push和pop、add和remove,以及取交集、並集、差集等更為復雜的操作。由於這些操作都是原子性的,在此基礎上,Redis支持各種不同方式的排序。
與MemCache一樣為了保證效率,數據都被緩存在內存中,區別在於Redis會周期性的把更新的數據寫入磁盤,或把修改操作寫入追加的記錄文件中,並且在此基礎上實現master-slave
主從同步策略,也就是數據可以從主服務器向任意數量的從服務器上同步,從服務器可以關聯其他類型的主服務器。因此,Redis的出現很大程度上彌補了MemCahe此類KV存儲的不足,在部分場合可以對關系型數據庫起到很好的補充作用。