NoSQL,泛指非關系型的資料庫,隨著互聯網不斷的發展,傳統的關系資料庫在應付新互聯網模式的網站,特別是超大規模和高并發的SNS型別的純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關系型的資料庫則由于其本身的特點得到了非常迅速的發展,NoSQL資料庫的產生就是為了解決大規模資料集合多重資料種類帶來的挑戰,尤其是大資料應用難題,而今天主要講用得比較多的三個NoSQL:Memcached、Redis、MongoDB,
Memcached
優點
1.Memcached可以利用多核優勢,單實體吞吐量極高,可以達到幾十萬QPS(取決于key、value的位元組大小以及服務器硬體性能,日常環境中QPS高峰大約在4-6w左右),適用于最大程度扛量,
2.支持直接配置為session handle,
缺點
1.只支持簡單的key/value資料結構,不像Redis可以支持豐富的資料型別,
2.無法進行持久化,資料不能備份,只能用于快取使用,且重啟后資料全部丟失,
3.無法進行資料同步,不能將MC中的資料遷移到其他MC實體中,
4.Memcached記憶體分配采用Slab Allocation機制管理記憶體,value大小分布差異較大時會造成記憶體利用率降低,并引發低利用率時依然出現踢出等問題,需要用戶注重value設計,
Redis
優點
1.支持多種資料結構,如 string(字串)、 list(雙向鏈表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基數估算),
2.支持持久化操作,可以進行aof及rdb資料持久化到磁盤,從而進行資料備份或資料恢復等操作,較好的防止資料丟失的手段,
3.支持通過Replication進行資料復制,通過master-slave機制,可以實時進行資料的同步復制,支持多級復制和增量復制,master-slave機制是Redis進行HA的重要手段,
4.單執行緒請求,所有命令串行執行,并發情況下不需要考慮資料一致性問題,
5.支持pub/sub訊息訂閱機制,可以用來進行訊息訂閱與通知,
6.支持簡單的事務需求,但業界使用場景很少,并不成熟,
缺點
1.Redis只能使用單執行緒,性能受限于CPU性能,故單實體CPU最高才可能達到5-6wQPS每秒(取決于資料結構,資料大小以及服務器硬體性能,日常環境中QPS高峰大約在1-2w左右),
2.支持簡單的事務需求,但業界使用場景很少,并不成熟,既是優點也是缺點,
3.Redis在string型別上會消耗較多記憶體,可以使用dict(hash表)壓縮存盤以降低記憶體耗用,
MongoDB
優點
1.更高的寫負載,MongoDB擁有更高的插入速度,
2.處理很大的規模的單表,當資料表太大的時候可以很容易的分割表,
3.高可用性,設定M-S不僅方便而且很快,MongoDB還可以快速、安全及自動化的實作節點(資料中心)故障轉移,
4.快速的查詢,MongoDB支持二維空間索引,比如管道,因此可以快速及精確的從指定位置獲取資料,MongoDB在啟動后會將資料庫中的資料以檔案映射的方式加載到記憶體中,如果記憶體資源相當豐富的話,這將極大地提高資料庫的查詢速度,
5.非結構化資料的爆發增長,增加列在有些情況下可能鎖定整個資料庫,或者增加負載從而導致性能下降,由于MongoDB的弱資料結構模式,添加1個新欄位不會對舊表格有任何影響,整個程序會非常快速,
缺點
1.不支持事務,
2.MongoDB占用空間過大 ,
3.MongoDB沒有成熟的維護工具,
Memcached、Redis、MongoDB的區別
1.性能
三者的性能都比較高,總的來講:Memcached和Redis差不多,要高于MongoDB,
2.便利性
Memcached資料結構單一,
Redis豐富一些,資料操作方面,Redis更好一些,較少的網路IO次數,
MongoDB支持豐富的資料表達,索引,最類似關系型資料庫,支持的查詢語言非常豐富,
3.存盤空間
Memcached可以修改最大可用記憶體,采用LRU演算法,
Redis在2.0版本后增加了自己的VM特性,突破物理記憶體的限制;可以對key value設定過期時間(類似memcached),
MongoDB適合大資料量的存盤,依賴作業系統VM做記憶體管理,吃記憶體也比較厲害,服務不要和別的服務在一起,
4.可用性
Memcached本身沒有資料冗余機制,也沒必要;對于故障預防,采用依賴成熟的hash或者環狀的演算法,解決單點故障引起的抖動問題,
Redis,依賴客戶端來實作分布式讀寫;主從復制時,每次從節點重新連接主節點都要依賴整個快照,無增量復制,因性能和效率問題,所以單點問題比較復雜;不支持自動sharding,需要依賴程式設定一致hash 機制,一種替代方案是,不用redis本身的復制機制,采用自己做主動復制(多份存盤),或者改成增量復制的方式(需要自己實作),一致性問題和性能的權衡,
MongoDB支持master-slave,replicaset(內部采用paxos選舉演算法,自動故障恢復),auto sharding機制,對客戶端屏蔽了故障轉移和切分機制,
5.可靠性
Memcached不支持,通常用在做快取,提升性能,
Redis支持(快照、AOF):依賴快照進行持久化,aof增強了可靠性的同時,對性能有所影響,
MongoDB從1.8版本開始采用binlog方式支持持久化的可靠性,
6.一致性
Memcached在并發場景下,用cas保證一致性,
Redis事務支持比較弱,只能保證事務中的每個操作連續執行,
MongoDB不支持事務,
7.資料分析
MongoDB內置了資料分析的功能(mapreduce),其他兩者不支持,
8.應用場景
Memcached:用于在動態系統中減少資料庫負載,提升性能;做快取,提高性能(適合讀多寫少,對于資料量比較大,可以采用sharding),
Redis:資料量較小的高性能操作和運算上,
MongoDB:主要解決海量資料的訪問效率問題,
總結分析
1.若是簡單的存取key-value(主要是讀)這樣的資料用Memcached好一些,若是要支持資料持久化,量也不大,操作很頻繁,多資料型別(如集合、散列之類的),用串列型別做佇列之類的高級應用,就用Redis,但如果是資料量比較大時就采用MongoDB,
2.Memcached的很多客戶端更加成熟穩定,Redis協議比Memcached復雜,Redis不可能比Memcached快?但是測驗結果基本是Redis占絕對優勢,
3.云資料庫Memcached版實體中的資料是存盤在記憶體中的,當出現宕機、機房斷電等意外,或是云資料庫Memcached版實體在正常升級維護時,記憶體中的資料均會丟失,因此,云資料庫Memcached版不能作為持久化的資料存盤服務使用,Redis的資料都存放在記憶體中,如果沒有配置持久化,Redis重啟后資料就全丟失了,于是需要開啟Redis的持久化功能,將資料保存到磁盤上,當Redis重啟后,可以從磁盤中恢復資料,實作持久化,
4.對于Redis和MongoDB來說,大家一般稱之為Redis快取、MongoDB資料庫,Redis主要把資料存盤在記憶體中,其“快取”的性質遠大于其“資料存盤“的性質,其中資料的增刪改查也只是像變數操作一樣簡單;MongoDB卻是一個“存盤資料”的系統,增刪改查可以添加很多條件,就像SQL資料庫一樣靈活,
5.MongoDB和Redis都是NoSQL,采用結構型資料存盤,二者在使用場景中,存在一定的區別,這也主要由于二者在記憶體映射的處理程序,持久化的處理方法不同,MongoDB建議集群部署,更多的考慮到集群方案,Redis更偏重于行程順序寫入,雖然支持集群,也僅限于主-從模式
推薦:妝組詞
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/6059.html
標籤:NoSQL
