標籤:ODB 集合 操作 memcached oca 系統 move 自訂 資訊
一、NoSQL的風生水起 1.1 後Web2.0時代的發展要求
隨著互連網Web2.0網站的興起,傳統的關聯式資料庫在應付Web2.0網站,特別是超大規模和高並發的SNS類型的Web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題:
(1)對資料庫高並發讀寫的需求
網站要根據使用者個人化資訊來即時產生動態網頁面和提供動態資訊,所以基本上無法使用動態網頁面靜態化技術,因此資料庫並發負載非常高,往往要達到每秒上萬次讀寫請求。關聯式資料庫應付上萬次SQL查詢還勉強頂得住,但是應付上萬次SQL寫資料請求,硬碟IO就已經無法承受了。
(2)對海量資料的高效率儲存和訪問的需求
對於大型的SNS網站,每天使用者產生海量的使用者動態,以國外的Friendfeed為例,一個月就達到了2.5億條使用者動態,對於關聯式資料庫來說,在一張2.5億條記錄的表裡面進行SQL查詢,效率是極其低下乃至不可忍受的。
(3)對資料庫的高可擴充性和高可用性的需求
在基於Web的架構當中,資料庫是最難進行橫向擴充的,當一個應用系統的使用者量和訪問量與日俱增的時候,你的資料庫卻沒有辦法像Web伺服器和應用伺服器那樣簡單的通過添加更多的硬體和服務節點來擴充性能和負載能力。對於很多需要提供7*24小時不間斷服務的網站來說,對資料庫系統進行升級和擴充是非常痛苦的事情,往往需要停機維護和資料移轉,為什麼資料庫不能通過不斷的添加伺服器節點來實現擴充呢?
在上面提到的“三高”的需求面前,關聯式資料庫遇到了難以克服的障礙,而對於Web2.0網站來說,關聯式資料庫的很多主要特性卻往往無用武之地,例如:
(1)資料庫事務一致性需求
很多Web即時系統並不要求嚴格的資料庫事務,對讀一致性的要求很低,有些場合對寫一致性要求也不高。因此資料庫交易管理成了資料庫高負載下一個沉重的負擔。
(2)資料庫的寫即時性和讀即時性需求
對關聯式資料庫來說,插入一條資料之後立刻查詢,是肯定可以讀出來這條資料的。並不要求這麼高的即時性。
(3)對複雜的SQL查詢,特別是多表關聯查詢的需求
任何大資料量的Web系統,都非常忌諱多個大表的關聯查詢,以及複雜的資料分析類型的複雜SQL報表查詢,特別是SNS類型的網站,從需求以及產品設計角度,就避免了這種情況的產生。往往更多的只是單表的主鍵查詢,以及單表的簡單條件分頁查詢,SQL的功能被極大的弱化了。
因此,關聯式資料庫在這些越來越多的應用情境下顯得不那麼合適了,為瞭解決這類問題的非關聯式資料庫應運而生。NoSQL 是非關係型資料存放區的廣義定義。它打破了長久以來關係型資料庫與ACID理論大一統的局面。NoSQL 資料存放區不需要固定的表結構(例如以索引值對儲存,它的結構不固定,每一個元組可以有不一樣的欄位,每個元組可以根據需要增加一些自己的索引值對,這樣就不會局限於固定的結構,可以減少一些時間和空間的開銷),通常也不存在串連操作。
1.2 NoSQL無與倫比的特點
在大資料存取上具備關係型資料庫無法比擬的效能優勢,例如:
(1)易擴充
NoSQL資料庫種類繁多,但是一個共同的特點都是去掉關聯式資料庫的關係型特性。資料之間無關係,這樣就非常容易擴充。也無形之間,在架構的層面上帶來了可擴充的能力。
(2)大資料量,高效能
NoSQL資料庫都具有非常高的讀寫效能,尤其在大資料量下,同樣表現優秀。這得益於它的無關係性,資料庫的結構簡單。
(3)靈活的資料模型
NoSQL無需事先為要儲存的資料建立欄位,隨時可以儲存自訂的資料格式。而在關聯式資料庫裡,增刪欄位是一件非常麻煩的事情。如果是非常大資料量的表,增加欄位簡直就是一個噩夢。這點在大資料量的Web2.0時代尤其明顯。
(4)高可用
NoSQL在不太影響效能的情況,就可以方便的實現高可用的架構。比如Cassandra,HBase模型,通過複製模型也能實現高可用。
綜上所述,NoSQL的非關係特性使其成為了後Web2.0時代的寵兒,助力大型Web2.0網站的再次起飛,是一項全新的資料庫革命性運動。
二、Redis的脫穎而出
隨著應用對高效能需求的增加,NoSQL逐漸在各大名企的系統架構中生根發芽。時至今日,湧現出的NoSQL產品已經有很多種了,例如Membase、MongoDB、Apache Cassandra、CouchDB等。不過,在國內外互連網巨頭例如社交巨頭新浪微博、傳媒巨頭Viacom及圖片分享領域佼佼者Pinterest等名企都不約而同地採用了Redis作為其NoSQL資料庫的選擇,到底Redis是何方神聖呢?能讓如此多的名企為它而癡狂。
按照官方的說法,Redis是一個開源的,使用C語言編寫,面向“鍵/值”(Key/Value)對類型資料的分布式NoSQL資料庫系統,特點是高效能,持久儲存,適應高並發的應用情境。因此,可以說Redis純粹為應用而產生,它是一個高效能的key-value資料庫,並且還提供了多種語言的API(包括我們的大C#)。那麼,也許我們會問:到底效能如何呢?以下是官方的bench-mark資料:
測試完成了
50個並發執行
100000個請求。 設定和擷取的值是一個256位元組字串。 Linux box是運行Linux 2.6,這是X3320 Xeon 2.5 ghz。 文本執行使用loopback介面(127.0.0.1)。 結果:
讀的速度是110000次/s,寫的速度是81000次/s 。(當然不同的伺服器配置效能也有所不同)。
和Memcached類似,Redis支援儲存的value類型相對更多,包括string(字串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(雜湊類型)。這些資料類型都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,Redis支援各種不同方式的排序。與Memcached一樣,為了保證效率,資料都是緩衝在記憶體中。區別的是Redis會周期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步(資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。)。
因此,Redis的出現,很大程度補償了Memcached這類key/value儲存的不足,在部分場合可以對關聯式資料庫起到很好的補充作用。
3. Redis安裝
Redis的安裝過程很簡單:
(1)下載Redis安裝包redis-3.2.12.tar.gz:https://redis.io/download
(2)解壓:tar -xzvf redis-3.2.12.tar.gz
(3)安裝:sudo make PREFIX=/usr/local/redis install
(4)拷貝redis.conf設定檔到安裝目錄:[[email protected] redis-3.2.12]# cp redis.conf /usr/local/redis
(5)連結Redis資料庫:
NoSQL之Redis資料庫初探