zoukankan      html  css  js  c++  java
  • golangRedis最佳的Go语言驱动

    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才开始发展,还需要继续添砖加瓦。各位看完后也可以自己动手测试一下。

    转贴请注明来自:格通

  • 相关阅读:
    洛谷p1017 进制转换(2000noip提高组)
    Personal Training of RDC
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Eurasia
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Peterhof.
    Asia Hong Kong Regional Contest 2019
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Siberia
    XVIII Open Cup named after E.V. Pankratiev. Ukrainian Grand Prix.
    XVIII Open Cup named after E.V. Pankratiev. GP of SPb
    卜题仓库
    2014 ACM-ICPC Vietnam National First Round
  • 原文地址:https://www.cnblogs.com/getong/p/2993139.html
Copyright © 2011-2022 走看看