高性能Key-Value數據庫的主要特點就是具有極高的並發讀寫性能,Redis,Tokyo Cabinet, Flare,這3個Key-Value DB都是用C編寫的,他們的性能都相當出色,但出了出色的性能,他們還有自己獨特的功能:
1、Redis
Redis是一個很新的項目,剛剛發布了1.0版本。Redis本質上是一個Key-Value類型的內存數據庫,很像memcached,整個數據庫統 統加載在內存當中進行操作,定期通過異步操作把數據庫數據flush到硬盤上進行保存。因為是純內存操作,Redis的性能非常出色,每秒可以處理超過 10萬次讀寫操作,是我知道的性能最快的Key-Value DB。
Redis的出色之處不僅僅是性能,Redis最大的魅力是支持保存List鏈表和Set集合的數據結構,而且還支持對List進行各種操作,例如 從List兩端push和pop數據,取List區間,排序等等,對Set支持各種集合的並集交集操作,此外單個value的最大限制是1GB,不像 memcached只能保存1MB的數據,因此Redis可以用來實現很多有用的功能,比方說用他的List來做FIFO雙向鏈表,實現一個輕量級的高性 能消息隊列服務,用他的Set可以做高性能的tag系統等等。另外Redis也可以對存入的Key-Value設置expire時間,因此也可以被當作一 個功能加強版的memcached來用。
Redis的主要缺點是數據庫容量受到物理內存的限制,不能用作海量數據的高性能讀寫,並且它沒有原生的可擴展機制,不具有scale(可擴展)能 力,要依賴客戶端來實現分布式讀寫,因此Redis適合的場景主要局限在較小數據量的高性能操作和運算上。目前使用Redis的網站有 github,Engine Yard。
2、Tokyo Cabinet和Tokoy Tyrant
TC和TT的開發者是日本人Mikio Hirabayashi,主要被用在日本最大的SNS網站mixi.jp上,TC發展的時間最早,現在已經是一個非常成熟的項目,也是Kye-Value 數據庫領域最大的熱點,現在被廣泛的應用在很多很多網站上。TC是一個高性能的存儲引擎,而TT提供了多線程高並發服務器,性能也非常出色,每秒可以處理 4-5萬次讀寫操作。
TC除了支持Key-Value存儲之外,還支持保存Hashtable數據類型,因此很像一個簡單的數據庫表,並且還支持基於column的條件 查詢,分頁查詢和排序功能,基本上相當於支持單表的基礎查詢功能了,所以可以簡單的替代關系數據庫的很多操作,這也是TC受到大家歡迎的主要原因之一,有 一個Ruby的項目miyazakiresistance將TT的hashtable的操作封裝成和ActiveRecord一樣的操作,用起來非常爽。
TC/TT在mixi的實際應用當中,存儲了2000萬條以上的數據,同時支撐了上萬個並發連接,是一個久經考驗的項目。TC在保證了極高的並發讀 寫性能的同時,具有可靠的數據持久化機制,同時還支持類似關系數據庫表結構的hashtable以及簡單的條件,分頁和排序操作,是一個很棒的NoSQL 數據庫。
TC的主要缺點是在數據量達到上億級別以後,並發寫數據性能會大幅度下降,NoSQL: If Only It Was That Easy提到,他們發現在TC裡面插入1.6億條2-20KB數據的時候,寫入性能開始急劇下降。看來是當數據量上億條的時候,TC性能開始大幅度下降, 從TC作者自己提供的mixi數據來看,至少上千萬條數據量的時候還沒有遇到這麼明顯的寫入性能瓶頸。
這個是Tim Yang做的一個Memcached,Redis和Tokyo Tyrant的簡單的性能評測,僅供參考
3、Flare
TC是日本第一大SNS網站mixi開發的,而Flare是日本第二大SNS網站green.jp開發的,有意思吧。Flare簡單的說就是給TC添加了 scale功能。他替換掉了TT部分,自己另外給TC寫了網絡服務器,Flare的主要特點就是支持scale能力,他在網絡服務端之前添加了一個 node server,來管理後端的多個服務器節點,因此可以動態添加數據庫服務節點,刪除服務器節點,也支持failover。如果你的使用場景必須要讓TC可 以scale,那麼可以考慮flare。
flare唯一的缺點就是他只支持memcached協議,因此當你使用flare的時候,就不能使用TC的table數據結構了,只能使用TC的 key-value數據結構存儲。
二、滿足海量存儲需求和訪問的面向文檔的數據庫:MongoDB,CouchDB
面向文檔的非關系數據庫主要解決的問題不是高性能的並發讀寫,而是保證海量數據存儲的同時,具有良好的查詢性能。MongoDB是用C++開發的, 而CouchDB則是Erlang開發的:
1、MongoDB
MongoDB是一個介於關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。他支持的數據結構非常松散,是類似 json的bjson格式,因此可以存儲比較復雜的數據類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似於面向對象的查詢語言,幾 乎可以實現類似關系數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。
Mongo主要解決的是海量數據的訪問效率問題,根據官方的文檔,當數據量達到50GB以上的時候,Mongo的數據庫訪問速度是MySQL的10 倍以上。Mongo的並發讀寫效率不是特別出色,根據官方提供的性能測試表明,大約每秒可以處理0.5萬-1.5次讀寫請求。對於Mongo的並發讀寫性 能,我也打算有空的時候好好測試一下。
因為Mongo主要是支持海量數據存儲的,所以Mongo還自帶了一個出色的分布式文件系統GridFS,可以支持海量的數據存儲,但我也看到有些 評論認為GridFS性能不佳,這一點還是有待親自做點測試來驗證了。
最後由於Mongo可以支持復雜的數據結構,而且帶有強大的數據查詢功能,因此非常受到歡迎,很多項目都考慮用MongoDB來替代MySQL來實 現不是特別復雜的Web應用,比方說why we migrated from MySQL to MongoDB就是一個真實的從MySQL遷移到MongoDB的案例,由於數據量實在太大,所以遷移到了Mongo上面,數據查詢的速度得到了非常顯著 的提升。
MongoDB也有一個ruby的項目MongoMapper,是模仿Merb的DataMapper編寫的MongoDB的接口,使用起來非常簡 單,幾乎和DataMapper一模一樣,功能非常強大易用。
2、CouchDB
CouchDB現在是一個非常有名氣的項目,似乎不用多介紹了。但是卻對CouchDB沒有什麼興趣,主要是因為CouchDB僅僅提供了基於HTTP REST的接口,因此CouchDB單純從並發讀寫性能來說,是非常糟糕的,這讓我立刻拋棄了對CouchDB的興趣。
三、滿足高可擴展性和可用性的面向分布式計算的數據庫:Cassandra,Voldemort