什麼是NoSql NoSQL(Not Only SQL),泛指非關係型的資料庫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱,強調Key-Value Stores和文檔資料庫的優點。為瞭解決大規模數據集合多重數據種類帶來的挑戰而興起的資料庫。有著模式自由,逆規範化,多分區存儲,彈性可擴展,多副 ...
什麼是NoSql
NoSQL(Not Only SQL),泛指非關係型的資料庫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱,強調Key-Value Stores和文檔資料庫的優點。為瞭解決大規模數據集合多重數據種類帶來的挑戰而興起的資料庫。有著模式自由,逆規範化,多分區存儲,彈性可擴展,多副本非同步複製,軟事務等特點。NoSQL用於超大規模數據的存儲。NoSQL資料庫的四大分類:鍵 - 值對存儲,列存儲,文檔存儲,圖形資料庫 優點: 高可擴展性,分散式計算,低成本,架構的靈活性,半結構化數據,沒有複雜的關係
1.Redis Redis是一個開源的,臨時性鍵值對存儲的記憶體/硬碟型資料庫,他可以做資料庫,緩存和消息的中間件,支持多種數據結構,以及DB消息隊列,適用於數據變化快且資料庫大小可遇見(適合記憶體容量)的應用程式。例如:股票價格、數據分析、實時數據搜集、實時通訊。
2.Memcached Memcached是一個高性能的分散式記憶體對象緩存系統,用於動態Web應用以減輕資料庫負載。 通過在記憶體中緩存數據和對象來減少讀取資料庫的次數,從而提供動態、資料庫驅動網站的速度 Memcached基於一個存儲鍵值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護進程通信。
3.MongoDB 面向無需定義表結構的文檔數據,具有非常快的處理速度,保留了一些友好的SQL特征(查詢,索引),支持JavaScript表達式查詢,硬碟型資料庫,在32位的操作系統上,資料庫限制大小約2.5Gb, 適用於需要動態查詢支持;需要使用索引而不是 map/reduce功能;需要對大資料庫有性能要求;需要使用 CouchDB但因為數據改變太頻繁而占滿記憶體的應用程式
使用對比以及優缺點
從以下幾個維度,對 redis、memcache、mongoDB 做了對比。
1、性能
都比較高,性能對我們來說應該都不是瓶頸。
總體來講,TPS 方面 redis 和 memcache 差不多,要大於 mongodb。
2、操作的便利性
memcache 數據結構單一。(key-value)
redis 豐富一些,數據操作方面,redis 更好一些,較少的網路 IO 次數,同時還提供 list,set,
hash 等數據結構的存儲。
mongodb 支持豐富的數據表達,索引,最類似關係型資料庫,支持的查詢語言非常豐富。
3、記憶體空間的大小和數據量的大小
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 做記憶體管理,吃記憶體也比較厲害,服務
不要和別的服務在一起。
4、可用性(單點問題)
對於單點問題,
redis,依賴客戶端來實現分散式讀寫;主從複製時,每次從節點重新連接主節點都要依賴整
個快照,無增量複製,因性能和效率問題,
所以單點問題比較複雜;不支持自動 sharding,需要依賴程式設定一致 hash 機制。
一種替代方案是,不用 redis 本身的複製機制,採用自己做主動複製(多份存儲),或者改成
增量複製的方式(需要自己實現),一致性問題和性能的權衡
Memcache 本身沒有數據冗餘機制,也沒必要;對於故障預防,採用依賴成熟的 hash 或者環
狀的演算法,解決單點故障引起的抖動問題。
mongoDB 支持 master-slave,replicaset(內部採用 paxos 選舉演算法,自動故障恢復),auto sharding 機制,對客戶端屏蔽了故障轉移和切分機制。
5、可靠性(持久化)
對於數據持久化和數據恢復,
redis 支持(快照、AOF):依賴快照進行持久化,aof 增強了可靠性的同時,對性能有所影
響
memcache 不支持,通常用在做緩存,提升性能;
MongoDB 從 1.8 版本開始採用 binlog 方式支持持久化的可靠性
6、數據一致性(事務支持)
Memcache 在併發場景下,用 cas 保證一致性redis 事務支持比較弱,只能保證事務中的每個操作連續執行
mongoDB 不支持事務
7、數據分析
mongoDB 內置了數據分析的功能(mapreduce),其他不支持
8、應用場景
redis:數據量較小的更性能操作和運算上
memcache:用於在動態系統中減少資料庫負載,提升性能;做緩存,提高性能(適合讀多寫
少,對於數據量比較大,可以採用 sharding)
MongoDB:主要解決海量數據的訪問效率問題。
表格比較:
資料庫 memcache redis
類型 記憶體資料庫 記憶體資料庫
數據類型 在定義value時就要固定數據類型 不需要
虛擬記憶體 不支持 支持
過期策略 支持 支持
存儲數據安全 不支持 使用 save 存儲到 dump.rdb 中
災難恢復 不支持 append only file(aof)用於數據恢復
性能
1、類型——memcache 和 redis 都是將數據存放在記憶體,所以是記憶體資料庫。當然,memcache 也可用於緩存其他東西,例如圖片等等。
2、 數據類型——Memcache 在添加數據時就要指定數據的位元組長度,而 redis 不需要。
3、 虛擬記憶體——當物理記憶體用完時,可以將一些很久沒用到的 value 交換到磁碟。
4、 過期策略——memcache 在 set 時就指定,例如 set key1 0 0 8,即永不過期。Redis 可以通 過例如 expire 設定,例如 expire name 10。
5、 分散式——設定 memcache 集群,利用 magent 做一主多從;redis 可以做一主多從。都可 以一主一從。
6、 存儲數據安全——memcache 斷電就斷了,數據沒了;redis 可以定期 save 到磁碟。
7、 災難恢復——memcache 同上,redis 丟了後可以通過 aof 恢復。
延伸及擴展問題回答參考
問題: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的空間
③:鏈表存儲是不連續的,查詢慢,插入塊。數組是連續的,查詢快,插入慢