NoSql淺談

什麼是NoSql

NoSQL(Not Only SQL),泛指非關係型的數據庫,是對不一樣於傳統的關係型數據庫的數據庫管理系統的統稱,強調Key-Value Stores和文檔數據庫的優勢。爲了解決大規模數據集合多重數據種類帶來的挑戰而興起的數據庫。有着模式自由,逆規範化,多分區存儲,彈性可擴展,多副本異步複製,軟事務等特色。NoSQL用於超大規模數據的存儲。NoSQL數據庫的四大分類:鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫 優勢: 高可擴展性,分佈式計算,低成本,架構的靈活性,半結構化數據,沒有複雜的關係css

NoSQL數據庫在如下的這幾種狀況下比較適用: 一、數據模型比較簡單; 二、須要靈活性更強的IT系統; 三、對數據庫性能要求較高; 四、不須要高度的數據一致性; 五、對於給定key,比較容易映射覆雜值的環境。nginx

1.Redis Redis是一個開源的,臨時性鍵值對存儲的內存/硬盤型數據庫,他能夠作數據庫,緩存和消息的中間件,支持多種數據結構,以及DB消息隊列,適用於數據變化快且數據庫大小可碰見(適合內存容量)的應用程序。例如:股票價格、數據分析、實時數據蒐集、實時通信。redis

2.Memcached Memcached是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。 經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提供動態、數據庫驅動網站的速度 Memcached基於一個存儲鍵值對的hashmap。其守護進程(daemon )是用C寫的,可是客戶端能夠用任何語言來編寫,並經過memcached協議與守護進程通訊。算法

3.MongoDB 面向無需定義表結構的文檔數據,具備很是快的處理速度,保留了一些友好的SQL特徵(查詢,索引),支持JavaScript表達式查詢,硬盤型數據庫,在32位的操做系統上,數據庫限制大小約2.5Gb, 適用於須要動態查詢支持;須要使用索引而不是 map/reduce功能;須要對大數據庫有性能要求;須要使用 CouchDB但由於數據改變太頻繁而佔滿內存的應用程序mongodb

使用對比以及優缺點

從如下幾個維度,對 redis、memcache、mongoDB 作了對比。數據庫

一、性能數組

都比較高,性能對咱們來講應該都不是瓶頸。
整體來說,TPS 方面 redis 和 memcache 差很少,要大於 mongodb。

二、操做的便利性緩存

memcache 數據結構單一。(key-value)
redis 豐富一些,數據操做方面,redis 更好一些,較少的網絡 IO 次數,同時還提供 list,set, hash 等數據結構的存儲。 mongodb 支持豐富的數據表達,索引,最相似關係型數據庫,支持的查詢語言很是豐富。 

三、內存空間的大小和數據量的大小安全

redis 在 2.0 版本後增長了本身的 VM 特性,突破物理內存的限制;能夠對 key value 設置過 期時間(相似 memcache) memcache 能夠修改最大可用內存,採用 LRU 算法。Memcached 代理軟件 magent,好比創建 10 臺 4G 的 Memcache 集羣,就至關於有了 40G。 magent -s 10.1.2.1 -s 10.1.2.2:11211 -b 10.1.2.3:14000 mongoDB 適合大數據量的存儲,依賴操做系統 VM 作內存管理,吃內存也比較厲害,服務 不要和別的服務在一塊兒。 

四、可用性(單點問題)bash

對於單點問題,
redis,依賴客戶端來實現分佈式讀寫;主從複製時,每次從節點從新鏈接主節點都要依賴整
個快照,無增量複製,因性能和效率問題,
因此單點問題比較複雜;不支持自動 sharding,須要依賴程序設定一致 hash 機制。 一種替代方案是,不用 redis 自己的複製機制,採用本身作主動複製(多份存儲),或者改爲 增量複製的方式(須要本身實現),一致性問題和性能的權衡 Memcache 自己沒有數據冗餘機制,也不必;對於故障預防,採用依賴成熟的 hash 或者環 狀的算法,解決單點故障引發的抖動問題。 mongoDB 支持 master-slave,replicaset(內部採用 paxos 選舉算法,自動故障恢復),auto sharding 機制,對客戶端屏蔽了故障轉移和切分機制。 

五、可靠性(持久化)

對於數據持久化和數據恢復,
redis 支持(快照、AOF):依賴快照進行持久化,aof 加強了可靠性的同時,對性能有所影 響 memcache 不支持,一般用在作緩存,提高性能; MongoDB 從 1.8 版本開始採用 binlog 方式支持持久化的可靠性 

六、數據一致性(事務支持)

Memcache 在併發場景下,用 cas 保證一致性redis 事務支持比較弱,只能保證事務中的每一個操做連續執行 mongoDB 不支持事務 

七、數據分析

mongoDB 內置了數據分析的功能(mapreduce),其餘不支持 

八、應用場景

redis:數據量較小的更性能操做和運算上
memcache:用於在動態系統中減小數據庫負載,提高性能;作緩存,提升性能(適合讀多寫
少,對於數據量比較大,能夠採用 sharding)
MongoDB:主要解決海量數據的訪問效率問題。 

表格比較:

數據庫             memcache            redis 
類型              內存數據庫           內存數據庫
數據類型    在定義value時就要固定數據類型   不須要
虛擬內存            不支持                 支持
過時策略            支持              支持
存儲數據安全          不支持             使用 save 存儲到 dump.rdb 中
災難恢復            不支持         append only file(aof)用於數據恢復 

性能

一、類型——memcache 和 redis 都是將數據存放在內存,因此是內存數據庫。固然,memcache 也可用於緩存其餘東西,例如圖片等等。

二、 數據類型——Memcache 在添加數據時就要指定數據的字節長度,而 redis 不須要。

三、 虛擬內存——當物理內存用完時,能夠將一些好久沒用到的 value 交換到磁盤。

四、 過時策略——memcache 在 set 時就指定,例如 set key1 0 0 8,即永不過時。Redis 能夠通 過例如 expire 設定,例如 expire name 10。

五、 分佈式——設定 memcache 集羣,利用 magent 作一主多從;redis 能夠作一主多從。均可 以一主一從。

六、 存儲數據安全——memcache 斷電就斷了,數據沒了;redis 能夠按期 save 到磁盤。

七、 災難恢復——memcache 同上,redis 丟了後能夠經過 aof 恢復。

NoSQL數據庫的四大分類表格分析

延伸及擴展問題回答參考

問題:redis的存儲方式(鍵值對的存儲方式)

答:如今比較經常使用的是鍵值對的存儲方式,說到存儲方式,需用從哈希算法提及,hash算法將對象轉換爲一個散列①,咱們在使用的時候會將這個散列轉換爲一個大數,這就是hashcode,而hashmap高度依賴於hash和hashcode hashtable默認會開闢4個存儲空間,將獲取到的hashcode求磨,算出下標誌②。也就是說hashtable是鍵值對的存儲方式, 咱們通常會用Hashmap分表分庫,hashmap的原理和hashtable類似,他們之間的區別在這裏就不細說了,hashmap分表分庫也是對hashcode求魔而後找下標值,可是下標值裏存在數據的話,會自動生成鏈路(在hashmap中的是倒鏈③)

註釋:

①:HashMap 之因此速度快,由於他使用的是散列表,根據 key 的 hashcode 值生成數組下標(經過內存地址直接查找,沒有任何判斷),時間複雜度完美狀況下能夠達到 n1(和數組相同,可是比數組用着爽多了,可是須要多出不少內存,至關於以空間換時間)

②:倘若hashcode爲112,hashtable爲4個空間,那麼這個數據存儲的下標值爲 112%4=0,也就是說存在了下標爲0的空間

③:鏈表存儲是不連續的,查詢慢,插入塊。數組是連續的,查詢快,插入慢

相關文章
相關標籤/搜索