一、redis
1 Redis數據庫完全在內存中,因此處理速度非常快,每秒能執行約11萬集合,每秒約81000+條記錄;
2 Redis的數據能確保一致性——所有Redis操作是原子性(Atomicity,意味着操作的不可再分,要么執行要么不執行)的,這保證了如果兩個客戶端同時訪問的Redis服務器將獲得更新后的值。
3 通過定時快照(snapshot)和基於語句的追加(AppendOnlyFile,aof)兩種方式,redis可以支持數據持久化——將內存中的數據存儲到磁盤上,方便在宕機等突發情況下快速恢復。
優點:
1. 非常豐富的數據結構;
2. Redis提供了事務的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷;
3. 數據存在內存中,讀寫非常的高速,可以達到10w/s的頻率。
缺點:
1. Redis3.0后才出來官方的集群方案,但仍存在一些架構上的問題(出處);
2. 持久化功能體驗不佳——通過快照方法實現的話,需要每隔一段時間將整個數據庫的數據寫到磁盤上,代價非常高;而aof方法只追蹤變化的數據,類似於mysql的binlog方法,但追加log可能過大,同時所有操作均要重新執行一遍,恢復速度慢;
3. 由於是內存數據庫,所以,單台機器,存儲的數據量,跟機器本身的內存大小。雖然redis本身有key過期策略,但是還是需要提前預估和節約內存。如果內存增長過快,需要定期刪除數據。
適用場景:
適用於數據變化快且數據庫大小可遇見(適合內存容量)的應用程序。
couchbase
Couchbase Server 是個面向文檔的數據庫(其所用的技術來自於Apache CouchDB項目),能夠實現水平伸縮,並且對於數據的讀寫來說都能提供低延遲的訪問(這要歸功於Membase技術)。
1.特點
1.1 數據格式
Couchbase 跟 MongoDB 一樣都是面向文檔的數據庫,不過在往 Couchbase 插入數據前,需要先建立 bucket —— 可以把它理解為“庫”或“表”。
因為 Couchbase 數據基於 Bucket 而導致缺乏表結構的邏輯,故如果需要查詢數據,得先建立 view(跟RDBMS的視圖不同,view是將數據轉換為特定格式結構的數據形式如JSON)來執行。
Bucket的意義 —— 在於將數據進行分隔,比如:任何 view 就是基於一個 Bucket 的,僅對 Bucket 內的數據進行處理。一個server上可以有多個Bucket,每個Bucket的存儲類型、內容占用、數據復制數量等,都需要分別指定。從這個意義上看,每個Bucket都相當於一個獨立的實例。在集群狀態下,我們需要對server進行集群設置,Bucket只側重數據的保管。
每當views建立時, 就會建立indexes, index的更新和以往的數據庫索引更新區別很大。 比如現在有1W數據,更新了200條,索引只需要更新200條,而不需要更新所有數據,map/reduce功能基於index的懶更新行為,大大得益。
要留意的是,對於所有文件,couchbase 都會建立一個額外的 56byte 的 metadata,這個 metadata 功能之一就是表明數據狀態,是否活動在內存中。同時文件的 key 也作為標識符和 metadata 一起長期活動在內存中。
1.2 性能
couchbase 的精髓就在於依賴內存最大化降低硬盤I/O對吞吐量的負面影響,所以其讀寫速度非常快,可以達到亞毫秒級的響應。
couchbase在對數據進行增刪時會先體現在內存中,而不會立刻體現在硬盤上,從內存的修改到硬盤的修改這一步驟是由 couchbase 自動完成,等待執行的硬盤操作會以write queue的形式排隊等待執行,也正是通過這個方法,硬盤的I/O效率在 write queue 滿之前是不會影響 couchbase 的吞吐效率的。
鑒於內存資源肯定遠遠少於硬盤資源,所以如果數據量小,那么全部數據都放在內存上自然是最優選擇,這時候couchbase的效率也是異常高。
但是數據量大的時候過多的數據就會被放在硬盤之中。當然,最終所有數據都會寫入硬盤,不過有些頻繁使用的數據提前放在內存中自然會提高效率。
1.3 持久化
其前身之一 memcached 是完全不支持持久化的,而 Couchbase 添加了對異步持久化的支持:
Couchbase提供兩種核心類型的buckets —— Couchbase 類型和 Memcached 類型。其中 Couchbase 類型提供了高可用和動態重配置的分布式數據存儲,提供持久化存儲和復制服務。
Couchbase bucket 具有持久性 —— 數據單元異步從內存寫往磁盤,防范服務重啟或較小的故障發生時數據丟失。持久性屬性是在 bucket 級設置的。
Couchbase 群集所有點都是對等的,只是在創建群或者加入集群時需要指定一個主節點,一旦結點成功加入集群,所有的結點對等。
對等網的優點是,集群中的任何節點失效,集群對外提供服務完全不會中斷,只是集群的容量受影響。
由於 couchbase 是對等網集群,所有的節點都可以同時對客戶端提供服務,這就需要有方法把集群的節點信息暴露給客戶端,couchbase 提供了一套機制,客戶端可以獲取所有節點的狀態以及節點的變動,由客戶端根據集群的當前狀態計算 key 所在的位置。
3. 優缺點
優勢
1. 高並發性,高靈活性,高拓展性,容錯性好;
2. 以 vBucket 的概念實現更理想化的自動分片以及動態擴容(了解更多);
缺點
1. Couchbase 的存儲方式為 Key/Value,但 Value 的類型很為單一,不支持數組。另外也不會自動創建doc id,需要為每一文檔指定一個用於存儲的 Document Indentifer;
2. 各種組件拼接而成,都是c++實現,導致復雜度過高,遇到奇怪的性能問題排查比較困難,(中文)文檔比較欠缺;
3. 采用緩存全部key的策略,需要大量內存。節點宕機時 failover 過程有不可用時間,並且有部分數據丟失的可能,在高負載系統上有假死現象;
4. 逐漸傾向於閉源,社區版本(免費,但不提供官方維護升級)和商業版本之間差距比較大。
適用場景
1. 適合對讀寫速度要求較高,但服務器負荷和內存花銷可遇見的需求;
2. 需要支持 memcached 協議的需求。