天天看點

淺嘗key-value資料庫(一)——一覽NoSQL

淺嘗key-value資料庫(一)——一覽NoSQL

最近由于一個項目的關系,研究了一下key-value資料庫這個最近很火的概念。本系列從項目需求的角度分析并測試了幾個key-value資料庫的性能。

key-value資料庫,又稱作NoSQL資料庫,他的最基本的基礎原理就是CAP。

CAP是2000年PODC上Eric Brewer提出的一個概念,即

C -> Consistency;

A -> Availability;

P -> Tolerance to network Partitions;

You can have at most two of these properties for any shared-data system.

翻譯成中文,大緻是完備性、可用性、網絡可分割性,三者不可兼得。

那麼經典的關系型資料庫在C,A兩方面做的非常好,于是在網際網路飛速發展的今天,在網絡擴充方面出現了緻命的硬傷。由于各種web2.0網站追求使用者創造内容,于是産生了大量的寫操作,關系型資料庫的replication模式已經不能承受,資料庫必須進行分割。但分割對于業務沒有普遍性,于是資料庫的擴容變得捉襟見肘。于是,key-value資料庫應運而生。

key-value資料庫就是盡可能地滿足A,P兩方面,甚至不惜犧牲C來滿足。

于是在key-value資料庫中,基本不支援事務,大多自帶replication功能,可以很友善的分表以及分布式實作。

以下是robbin的《NoSQL資料庫探讨之一 -為什麼要用非關系資料庫?》一文中提到的一些著名的key-value資料庫:

1、Redis Redis

本質上是一個Key-Value類型的記憶體資料庫,很像memcached,整個資料庫統統加載在記憶體當中進行操作,定期通過異步操作把資料庫資料flush到硬碟上進行儲存。因為是純記憶體操作,Redis的性能非常出色,每秒可以處理超過10萬次讀寫操作。但有硬傷就是資料庫容量受到實體記憶體的限制,不能用作海量資料的高性能讀寫,并且它沒有原生的可擴充機制,不具有可擴充能力,要依賴用戶端來實作分布式讀寫,是以Redis适合的場景主要局限在較小資料量的高性能操作和運算上。

2、Tokyo Cabinet和Tokyo Tyrant

前者是一個高性能的存儲引擎,後者是一個提供了多線程高并發的伺服器。一聽名字就是日本人開發的,最初被用在日本最大的SNS站點mixi.jp上。TC除了支援Key-Value存儲之外,還支援儲存Hashtable資料類型,是以很像一個簡單的資料庫表,并且還支援基于column的條件查詢,分頁查詢和排序功能,基本上相當于支援單表的基礎查詢功能了,是以可以簡單的替代關系資料庫的很多操作。但他的主要缺點是在資料量達到上億級别以後,并發寫資料性能會大幅度下降——《NoSQL: If Only It Was That Easy》。

3、MongoDB

MongoDB是一個介于關系資料庫和非關系資料庫之間的産品,是非關系資料庫當中功能最豐富,最像關系資料庫的。他支援的資料結構非常松散,是類似json的bson格式,是以可以存儲比較複雜的資料類型,他主要是用來解決海量資料的通路效率問題。他的存儲似乎對磁盤空間方面的需求比較大。新版本開始支援分布式。

4、Hypertable

Hypertable與類似的HBase都是從Google的Bigtable模式發展出來的,對分布式支援比較好,不過配置起來比較複雜。先介紹這幾個吧,其他還有許多key-value資料庫正在或已經發展起來。不過學術界似乎并不看好key-value資料庫。在我看來,key-value現在很熱,但是炒作的成分比較大,在真正的應用中還是應該根據自身的特點來選擇資料存儲方式才是王道。