用golang来检测redis的qps。
直接上代码吧!
package main import ( "fmt" "github.com/garyburd/redigo/redis" "sync" "time" ) var( Pool redis.Pool //连接池 oSynWait sync.WaitGroup //互斥锁 ) const ( OnMaxRun = 10000 //单线程执行命令数 AllMaxRun = 50 //并发数 TimeFormat = "2006-01-02 15:04:05.999" //打印时间 Type = "set" //指令类型 ) func main() { fmt.Println("--------------------------redis压力测试--------------------------") GetPool(&Pool) OldTime := time.Now() fmt.Println("开始",OldTime.Format(TimeFormat)) oSynWait.Add(AllMaxRun) for i := 0; i < AllMaxRun; i ++ { go ReadWriteInfo() } oSynWait.Wait() EndTime := time.Now() fmt.Println("结束",EndTime.Format(TimeFormat)) fmt.Printf("并发数: %d ;总数据量:%d ;耗时: %.2fs ;\n类型:%s ;key:1;value:1;\nqps:%.0f\n", AllMaxRun,AllMaxRun*OnMaxRun,EndTime.Sub(OldTime).Seconds(),Type,AllMaxRun*OnMaxRun/time.Now().Sub(OldTime).Seconds()) fmt.Println("-----------------------------测试结束-----------------------------") } //取得一个连接池 func GetPool(this *redis.Pool) { this.MaxActive = 10 this.MaxIdle = 10 this.Wait = true this.IdleTimeout = 100*time.Second this.Dial = func() (conn redis.Conn, err error) { conn,err = redis.Dial("tcp","127.0.0.1:6379") if err != nil{ fmt.Println("连接失败:",err) } return } } //存放数据 func ReadWriteInfo() { defer oSynWait.Done() for i := 0; i <OnMaxRun; i++ { conn := Pool.Get() //存 _, err := conn.Do(Type, "1", "1") if err != nil { fmt.Println("存放数据失败", err) return } //取 //_, err = conn.Do("get", "1") //if err != nil { // fmt.Println("取出数据失败", err) // return //} //关 err = conn.Close() if err!= nil{ fmt.Println("关闭连接失败 ",err) return } } }和redis自带的测试结果差不多哈。
1.请确保电脑性能能跟的上,在只有单核,2G内存的虚拟机上协程没能完全跑起来,数值很低。 2.并发设置:大概30-50就合适了,多了获得的结果也差不多。
