本篇要評測的NoSQL產品是Redis,能夠把它的功能理解爲一個Key-Value的數據結構操做,數據都保存在內存中按期刷新到磁盤,以極高的讀寫效率而備受關注。國內的新浪微博就大規模的使用了Redis來存儲用戶關係和計數。php
介 紹html
按照官方的說法,Redis是用ANSI C開發的,能運行在大多數POSIX(Linux, *BSD, OS X 和Solaris等)系統上,官方沒有支持Windows的版本。目前最新的版本是2.2.11,這個版本主要是修復了一個2.2.7版本中遍歷方式優化 帶來的一個bug。git
和普通的Key-Value結構不一樣,Redis的Key支持靈活的數據結構,除了strings,還有hashes、lists、 sets 和sorted sets等結構。正是這些靈活的數據結構,豐富了Redis的應用場景,能知足更多業務上的靈活存儲需求。github
Redis的數據都保存在內存中,並且底層實現上是本身寫了epoll event loop部分,而沒有采用開源的libevent等通用框架,因此讀寫效率很高。爲了實現數據的持久化,Redis支持按期刷新(可經過配置實現)或寫日誌的方式來保存數據到磁盤。web
安裝和使用redis
因爲沒有第三方的包依賴關係,Redis的安裝十分簡單:數據庫
$ wget http://redis.googlecode.com/files/redis-2.2.11.tar.gzapache
$ tar xzf redis-2.2.11.tar.gz緩存
$ cd redis-2.2.11服務器
$ make
這樣就安裝完畢了,執行src目錄下的redis-server能夠啓動Redis進程,不過最好先配置一下redis.conf文件,經常使用的幾個要注意的參數以下:
daemonize yes
指定Redis以守護進程的方式運行。
pidfile /home/banping/redis/redis.pid
當Redis以守護進程方式運行時,把pid寫入指定的文件。
port 6379
指定監聽端口,默認端口爲6379。
bind 192.168.0.35
綁定的主機IP地址。
logfile stdout
指定日誌的記錄方式,默認爲標準輸出。
databases 16
設置數據庫的數量。
save
Redis默認配置文件中提供了三個條件:
save 900 1
save 300 10
save 60 10000
分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改的時候,同步數據到磁盤文件。
rdbcompression yes
指定存儲至本地數據庫時是否壓縮數據,默認爲yes。
dbfilename dump.rdb
指定本地數據庫文件名。
dir /home/banping/redis/data
指定本地數據庫存放目錄。
requirepass foobared
設置Redis鏈接密碼,默認關閉。
maxclients 128
設置最大客戶端鏈接數,默認無限制。
maxmemory
指定Redis能使用的最大內存。
其餘更詳細的參數說明請參見官方文檔。修改完配置文件後,咱們能夠用指定的配置文件啓動Redis服務:
[root@localhost redis-2.2.10]# src/redis-server /home/banping/redis/redis-2.2.11/redis.conf
這樣一個redis服務進程就啓動了,它監聽6379端口來提供服務。
測試說明
1、測試環境
MongoDB部署在一臺PC 服務器上,配置以下:
CPU爲Xeon 2.80GHz *4
內存爲4G
硬盤爲一塊400G SATA盤
操做系統爲64位CentOS 5.3版本
2、測試方法
這裏仍然採用PHP客戶端進行測試,Redis官方推薦了兩個PHP客戶端,一個是PHP程序包Predis,另外一個是C開發的擴展包 phpredis,咱們這裏採用後者,網址爲https://github.com/nicolasff/phpredis ,能夠編譯到PHP運行環境中來使用。
爲了避免對測試服務器產生額外的影響,測試客戶端部署在另一臺獨立的服務器上,運行的PHP的版本是5.3.5,web server是Nginx 0.8.54,經過fastcgi的方式調用PHP服務。使用apache ab工具實現多個請求和併發操做。
測試過程當中就使用上文提到的已經啓動的Redis服務,首先是進行寫操做,經過500個請求,每一個請求寫入10000條記錄,併發度爲2來共寫入500 萬條數據,key爲數字1到5000000,value大小爲100個字節。而後是讀操做,也是用500個請求,每一個請求隨機根據key值讀出10000 條記錄,併發度爲10共讀出500萬條記錄,評測的重點是寫入和讀出數據的時間,以及在此過程當中服務器的資源使用狀況。
測試結果及總結
1、寫操做
成功寫入500萬條記錄,共耗時524秒,平均每秒寫入數據9542筆。磁盤上的數據文件大小134M。寫入過程當中,服務器內存、CPU和磁盤等資源使用狀況以下圖所示:
可見,內存使用平穩上升,最後佔用140M左右,主要用來緩存數據,對比數據文件的大小能夠設想,在操做系統內 存可用的狀況下,內存的分配和數據文件的大小是大體至關的。內存佔用會有臨時的超過實際佔用的幾個點,並且會立刻釋放掉,CPU和磁盤IO都表現出週期性 的上下波動,估計這些和Redis刷新數據到磁盤的實現機制有關,在高點的時候正好是數據寫入磁盤的過程。整體來講佔用資源不多,表現也很平穩。
2、讀操做
成功讀出500萬條記錄,共耗時184秒,平均每秒讀出數據27174筆。
讀數據過程當中沒有發生磁盤IO。CPU有所消耗,Idle值穩定在77左右,等待CPU資源的進程一直是1個。內存表現平穩沒有波動。
經過以上測試結果能夠看出,Redis數據操做都在內存完成,按期刷新到磁盤,佔用的磁盤空間和內存大小由實際的數據量決定,在內存可用的狀況下兩者是 一致的。從功能角度看Redis高效的讀寫效率和豐富的數據結構能知足不少互聯網應用場景的需求,並且在高負載的狀況下,數據內存化是趨勢,整體來講 Redis雖然還在不斷髮展之中,代碼量也很少,可是一個輕量級的頗有潛力的NoSQL產品,確定會有愈來愈多的成功案例。