Redis可以緩存數據,這使得操作數據可以達到一個較快的速度,在一些需要數據較快存儲的場合,例如微博,redis發揮着不可替代的作用。在redis的官網,golang驅動有幾個,忽然來了興致,那個才是redis最佳的Go語言驅動?
這些驅動都處於開發的前期,還沒有發行正式版,有些已經很久沒更新了。從更新日期來看,Gary Burd的radigo和gosexy的redis最近有更新,而且從他們的README文件來看,他們對redis的支持還不錯。很有可能,他們兩者會有1個勝出。但到底誰才是最佳的,這個現在還是不能判斷。在gosexy的redis源碼庫中的有個_benchmarks文件,里面就是一些對各個redis的Go驅動的一些簡單的性能測試。簡單看了一下,里面的代碼就是調用他們各自包中的函數來達到測試的功能。大家不妨看一下。這里就通過這個測試,來簡單判斷一下誰是最佳。
首先,安裝各個Go的驅動:
go get github.com/alphazero/Go-Redis go get github.com/simonz05/godis go get github.com/garyburd/redigo go get github.com/gosexy/redis go get cgl.tideland.biz/redis
注意:tcgl原先托管在google,不過現在它現在自己組建源碼庫了,gosexy的redis的_benchmarks的tcgl_redis_test.go就import了google的版本,不過現在要修改了。也就是注釋掉code.google.com/p/tcgl/redis,添加 cgl.tideland.biz/redis,這樣我們才能進行下一步動作。
在一個終端打開redis:
redis-server
我們要進入_benchmarks這個文件夾,里面的README.md有進行性能測試的步驟,這里要進行的性能測試的操作有Ping, Set, Get, Incr, LPush, LRange10, LRange100, 其中LRange10和 LRange100都是調用LRange操作,不過他們的數量不同而已。以下是我在這些文件夾里面進行的操作。
新開一個終端:
go test -test.bench='.*' > redis-go-driver-benchmark.txt ./grep_data.sh
grep_data是我寫的一個腳本:
#!/bin/sh for i in AlphazeroRedis GaryburdRedigo GosexyRedis Simonz05Godis TcglRedis do grep $i redis-go-driver-benchmark.txt | awk '{print $3}' > $i done
這個腳本的作用就是將AlphazeroRedis、GaryburdRedigo、GosexyRedis、Simonz05Godis、TcglRedis等的測試數據從redis-go-driver-benchmark.txt提取出來,也就是他們各自操作的數據,然后寫入以他們名字命名的文件里面。我們可以打開AlphazeroRedis看一下,
39001 43967 43459 43350 44249 58078 139603
這些數據依次對應Ping, Set, Get, Incr, LPush, LRange10, LRange100的每次操作所需要的納秒時間。我寫了一個R的小程序來把這些數據顯示到一個圖上面,對R不是很熟悉,希望了解R的大牛指正。下面上代碼:
png(filename="redis的最佳go語言驅動--使用格通測試的數據.png",width=1400, height=900) Sys.setlocale(, "zh_CN.UTF-8") oldpar <- par(lwd=4) AlphazeroRedis <- read.table("AlphazeroRedis") GaryburdRedigo <- read.table("GaryburdRedigo") GosexyRedis <- read.table("GosexyRedis") Simonz05Godis <- read.table("Simonz05Godis") TcglRedis <- read.table("TcglRedis") plot(AlphazeroRedis$V1, type="o", ylim = c(0, 360000), col = "black", axes=FALSE, ann=FALSE) text(2, AlphazeroRedis$V1[2], cex=2, pos=3, col="black", "AlphazeroRedis") axis(1, at=1:8, lab=c("Ping","Set","Get","Incr", "LPush", "LRange10", "LRange100", "")) axis(2, las=0, at=40000*0: 360000) box() title(xlab="操作", col = "black") title(ylab="每個操作多少納秒", col = "black") title(main = "5個Redis的Go語言驅動操作比較--使用格通測試的數據") lines(GaryburdRedigo, col = "red") text(6, GaryburdRedigo$V1[6]-10000, cex=2, pos=1, col="red", "GaryburdRedigo") lines(GosexyRedis, col = "blue") text(2, GosexyRedis$V1[2], pos=1,col="blue", cex=2, "GosexyRedis") lines(Simonz05Godis, col = "yellow") text(4, Simonz05Godis$V1[4]+7000,pos=3, col="yellow",cex=2, "Simonz05Godis") lines(TcglRedis, col = "gray") text(3, TcglRedis$V1[3],pos=1,cex=2, col="gray", "TcglRedis") par(oldpar) dev.off()
保存為go-redis-getongs-data.R,用R來調用這個文件:
$R >source("go-redis-getongs-data.R")
在目錄下面會生成一個叫”redis的最佳go語言驅動--使用格通測試的數據.png“的文件,我特意把圖給放大,以便能夠清楚看到線條的走向,圖有點大,可能在這里顯示不正確:
在_benchmarks的README.md有gosexy測試的數據,我修改了上面的go-redis-getongs-data.R文件,把gosexy測試的數據整理到圖上去:
2副圖可以看出,tcgl無疑是5個中耗時最多的。在我測試的數據中,GosexyRedis幾乎贏得了所有的測試(除了LRange100輸給了GaryburdRedigo),GaryburdRedigo基本上是排老二。而使用gosexy的數據,除了tcgl,其他4個的數據相差不大,而GaryburdRedigo還是贏得了LRange100測試,說明在數量比較大的list方面,GaryburdRedigo是十分有優勢的。
從上面的數據可以知道,set, get, incr,lpush的操作耗時都在40微秒左右,那就是1s里面能夠操作25000次左右。我自己算了一下,嚇了一跳, 好像比其他使用案例高了一個數量級(有錯希望指正了)。
上面的測試只涉及部分的redis操作,在整體對redis的支持方面,還是需要繼續添加其他功能測試。畢竟現在Go才開始發展,還需要繼續添磚加瓦。各位看完后也可以自己動手測試一下。
轉貼請注明來自:格通