NoSQL初探之人人都愛Redis:(1)Redis簡介與簡單安裝


一、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存儲的不足,在部分場合可以對關系數據庫起到很好的補充作用

三、Redis在Windows上的安裝與配置

  前面介紹了一大堆,現在開始真刀實干!首先,肯定是安裝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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM