隨着互聯網Web2.0網站的興起,傳統的關係數據庫在應付Web2.0網站,特別是超大規模和高併發的SNS類型的Web2.0純動態網站已經顯得力不從心,暴露了不少難以克服的問題:html
(1)對數據庫高併發讀寫的需求git
網站要根據用戶個性化信息來實時生成動態頁面和提供動態信息,因此基本上沒法使用動態頁面靜態化技術,所以數據庫併發負載很是高,每每要達到每秒上萬次讀寫請求。關係數據庫應付上萬次SQL查詢還勉強頂得住,可是應付上萬次SQL寫數據請求,硬盤IO就已經沒法承受了。github
(2)對海量數據的高效率存儲和訪問的需求redis
對於大型的SNS網站,天天用戶產生海量的用戶動態,以國外的Friendfeed爲例,一個月就達到了2.5億條用戶動態,對於關係數據庫來講,在一張2.5億條記錄的表裏面進行SQL查詢,效率是極其低下乃至不可忍受的。sql
(3)對數據庫的高可擴展性和高可用性的需求數據庫
在基於Web的架構當中,數據庫是最難進行橫向擴展的,當一個應用系統的用戶量和訪問量與日俱增的時候,你的數據庫卻沒有辦法像Web服務器和應用服務器那樣簡單的經過添加更多的硬件和服務節點來擴展性能和負載能力。對於不少須要提供7*24小時不間斷服務的網站來講,對數據庫系統進行升級和擴展是很是痛苦的事情,每每須要停機維護和數據遷移,爲何數據庫不能經過不斷的添加服務器節點來實現擴展呢?windows
在上面提到的「三高」的需求面前,關係數據庫遇到了難以克服的障礙,而對於Web2.0網站來講,關係數據庫的不少主要特性卻每每無用武之地,例如:緩存
(1)數據庫事務一致性需求服務器
不少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,這裏咱們選擇比較熟悉的Windows平臺來進行安裝。既然是Windows平臺,那麼確定要選擇一個Windows版本的Redis安裝包(其實NoSQL大部分都是部署在Linux服務器上得,什麼緣由?你們都懂得,開源+免費=成熟的服務器方案)。
(1)進入GitHub的Redis相關包下載頁面:https://github.com/MSOpenTech/redis
Of course,這個地址也是能夠的:https://github.com/dmajkic/redis/downloads
(2)選擇相應版本,我這裏選擇的是2.6的版本,點擊Download ZIP按鈕進行下載;
(3)打開壓縮包,能夠看到咱們下載的實際上是一個完整的Redis-2.6的包,包含了bin、src等文件夾,src是源碼,而bin則是編譯好的執行文件,也是咱們主要使用的東東。進入bin目錄,能夠看到裏面又有兩個目錄,一個是32位操做系統使用的,另外一個則是64位操做系統使用的。
(4)我所使用的是64位系統,因此我將redisbin64.zip拷貝出來,解壓後移動至個人D:/Redis目錄中,能夠看到解壓後的內容包含如下的一些可執行exe文件:
下面來看看這幾個可執行exe文件都是幹嗎用的?
①redis-server.exe:服務程序,也是最最最核心的一個程序。說到底,Redis也就是咱們服務器系統上一直運行的一個服務甚至就是一個進程而已。
②redis-check-dump.exe:本地數據庫檢查
③redis-check-aof.exe:更新日誌檢查
④redis-benchmark.exe:性能測試,用以模擬同時由N個客戶端發送M個 SETs/GETs 查詢。上面所提到的測試結果就是使用的該程序來進行的。
⑤redis-cli.exe: 服務端開啓後,咱們的客戶端就能夠輸入各類命令測試了,例如GET、SET等操做;
另外,將剛剛下載的包裏邊的redis.conf默認配置文件拷貝到工做目錄中(個人是D:/Redis),redis.conf主要是一些Redis的默認服務配置,包括默認端口號(通常默認6379)啊之類的配置。
(5)既然咱們知道了redis-server.exe是最核心的一個程序,那麼咱們就首先來將它開啓。這裏須要在Windows的命令行界面中來開啓,首先在運行窗口輸入cmd進入命令窗口,使用cd命令切換到指定的目錄(我是將剛剛解壓的文件放在了D:/Redis文件夾下)
(6)最後就是驚心動魄地開啓Redis的服務了,輸入一句簡單的命令:redis-server.exe redis.conf
這裏須要注意的是:開啓Redis服務後,命令行窗口不要關閉,一旦關閉,Redis服務也會相應關閉。所以,咱們通常會將其改成Windows服務,而且設置爲開機自動啓動,就像咱們數據庫服務器中的SQL Server服務和Web服務器中的IIS服務同樣。
(7)究竟咱們的Redis安裝好了沒呢?咱們能夠經過新打開(記得是新打開一個,而不是將原來那個關閉了)一個cmd窗口使用redis-cli.exe來測試一下:redis-cli.exe -h 服務器IP –p 端口
(8)既然每次都須要在命令窗口中開啓Redis服務不爽,那咱們就動手將其改成Windows服務,讓它自動啓動。經過在網上查找,我在CSDN找到了一個批處理文件和一個RedisService的可執行文件,並將這兩個文件拷貝到指定的Redis目錄(個人是D:/Redis):
其中,install-service這個批處理文件的代碼以下:
@echo off set cur_path=%cd% sc create redis-instance binpath= "\"%cur_path%\RedisService.exe\" %cur_path%\redis.conf" start= "auto" DisplayName= "Redis"
意思是在咱們的Windows中建立一個Redis的服務實例,指定要啓動的程序路徑與配置文件路徑。這裏須要注意的是:RedisService是另外的一個exe,不是咱們剛剛下載下來就有的,這個RedisService.exe的下載地址爲:http://pan.baidu.com/s/1sjrvmTf。啓動模式設置爲auto表明自動啓動,顯示的服務名稱爲Redis。這樣,一個bat文件就作好了,點擊運行以後,一個Redis的Windows服務也出如今了咱們的Windows服務列表中,以下圖所示:
隨着新浪、趕集這些大型網站同一時刻的訪問量逐步飆升,但它們卻能作到讓用戶順利的訪問,運用的就是Redis的數據優化處理技術。所以,Redis通過了各大名企的考驗,是一個高性能的NoSQL數據庫,具備多種實用的用途。那麼,咱們.Net開發者是否能夠藉助Redis解決平常開發中遇到的高併發的問題呢,答案是確定的。下一篇,咱們會熟悉一下Redis爲咱們.Net開發者提供的API,以及Redis中提供的常見的數據類型(多種)等等。最後,衷心感謝本文的參考文獻做者,特別是傳智播客的王承偉老師,本文是基於其發佈的公開課視頻學習整理而成,感謝其提供了這麼好的公開課教程!
(1)傳智播客Redis公開課,王承偉主講,http://bbs.itcast.cn/thread-26525-1-1.html
(2)NoSQL百度百科,http://baike.baidu.com/view/2677528.htm
(3)孫立,《NoSQL開篇—爲何使用NoSQL》,http://www.infoq.com/cn/news/2011/01/nosql-why/
(4)Redis百度百科,http://baike.baidu.com/view/4595959.htm
(5)Ruthless,《Windows下安裝Redis》,http://www.cnblogs.com/linjiqin/archive/2013/05/27/3101694.html
(6)張善友,《在Windows上以服務方式運行Redis》,http://www.cnblogs.com/shanyou/archive/2013/01/17/redis-on-windows.html
(1)Redis-2.6服務包:http://pan.baidu.com/s/1dDEKojJ
(2)Redis註冊Windows服務的批處理文件:http://pan.baidu.com/s/1jGJtNXs
(3)Redis註冊Windows服務的啓動程序(RedisServcie.exe):http://pan.baidu.com/s/1sjrvmTf
(4)Redis Desktop Manager 下載地址 http://redisdesktop.com/download