隨着互聯網Web2.0網站的興起,傳統的關係數據庫在應付Web2.0網站,特別是超大規模和高併發的SNS類型的Web2.0純動態網站已經顯得力不從心,暴露了不少難以克服的問題:redis
(1)對數據庫高併發讀寫的需求數據庫
網站要根據用戶個性化信息來實時生成動態頁面和提供動態信息,因此基本上沒法使用動態頁面靜態化技術,所以數據庫併發負載很是高,每每要達到每秒上萬次讀寫請求。關係數據庫應付上萬次SQL查詢還勉強頂得住,可是應付上萬次SQL寫數據請求,硬盤IO就已經沒法承受了。緩存
(2)對海量數據的高效率存儲和訪問的需求服務器
對於大型的SNS網站,天天用戶產生海量的用戶動態,以國外的Friendfeed爲例,一個月就達到了2.5億條用戶動態,對於關係數據庫來講,在一張2.5億條記錄的表裏面進行SQL查詢,效率是極其低下乃至不可忍受的。架構
(3)對數據庫的高可擴展性和高可用性的需求併發
在基於Web的架構當中,數據庫是最難進行橫向擴展的,當一個應用系統的用戶量和訪問量與日俱增的時候,你的數據庫卻沒有辦法像Web服務器和應用服務器那樣簡單的經過添加更多的硬件和服務節點來擴展性能和負載能力。對於不少須要提供7*24小時不間斷服務的網站來講,對數據庫系統進行升級和擴展是很是痛苦的事情,每每須要停機維護和數據遷移,爲何數據庫不能經過不斷的添加服務器節點來實現擴展呢?分佈式
在上面提到的「三高」的需求面前,關係數據庫遇到了難以克服的障礙,而對於Web2.0網站來講,關係數據庫的不少主要特性卻每每無用武之地,例如:高併發
(1)數據庫事務一致性需求oop
不少Web實時系統並不要求嚴格的數據庫事務,對讀一致性的要求很低,有些場合對寫一致性要求也不高。所以數據庫事務管理成了數據庫高負載下一個沉重的負擔。性能
(2)數據庫的寫實時性和讀實時性需求
對關係數據庫來講,插入一條數據以後馬上查詢,是確定能夠讀出來這條數據的。並不要求這麼高的實時性。
(3)對複雜的SQL查詢,特別是多表關聯查詢的需求
任何大數據量的Web系統,都很是忌諱多個大表的關聯查詢,以及複雜的數據分析類型的複雜SQL報表查詢,特別是SNS類型的網站,從需求以及產品設計角度,就避免了這種狀況的產生。每每更多的只是單表的主鍵查詢,以及單表的簡單條件分頁查詢,SQL的功能被極大的弱化了。
所以,關係數據庫在這些愈來愈多的應用場景下顯得不那麼合適了,爲了解決這類問題的非關係數據庫應運而生。NoSQL 是非關係型數據存儲的廣義定義。它打破了長久以來關係型數據庫與ACID理論大一統的局面。NoSQL 數據存儲不須要固定的表結構(例如以鍵值對存儲,它的結構不固定,每個元組能夠有不同的字段,每一個元組能夠根據須要增長一些本身的鍵值對,這樣就不會侷限於固定的結構,能夠減小一些時間和空間的開銷),一般也不存在鏈接操做。
在大數據存取上具有關係型數據庫沒法比擬的性能優點,例如:
(1)易擴展
NoSQL數據庫種類繁多,可是一個共同的特色都是去掉關係數據庫的關係型特性。數據之間無關係,這樣就很是容易擴展。也無形之間,在架構的層面上帶來了可擴展的能力。
(2)大數據量,高性能
NoSQL數據庫都具備很是高的讀寫性能,尤爲在大數據量下,一樣表現優秀。這得益於它的無關係性,數據庫的結構簡單。
(3)靈活的數據模型
NoSQL無需事先爲要存儲的數據創建字段,隨時能夠存儲自定義的數據格式。而在關係數據庫裏,增刪字段是一件很是麻煩的事情。若是是很是大數據量的表,增長字段簡直就是一個噩夢。這點在大數據量的Web2.0時代尤爲明顯。
(4)高可用
NoSQL在不太影響性能的狀況,就能夠方便的實現高可用的架構。好比Cassandra,HBase模型,經過複製模型也能實現高可用。
綜上所述,NoSQL的非關係特性使其成爲了後Web2.0時代的寵兒,助力大型Web2.0網站的再次起飛,是一項全新的數據庫革命性運動。
隨着應用對高性能需求的增長,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存儲的不足,在部分場合能夠對關係數據庫起到很好的補充做用。
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配置文件到安裝目錄:[root@rhel7-c0 redis-3.2.12]# cp redis.conf /usr/local/redis
(5)連接Redis數據庫: