golang-对redis进行压力测试 用golang来检测redis的qps。
直接上代码吧!
package mainimport (
"fmt"
"github.com/garyburd/redigo/redis"
"sync"
"time"
)var(
Poolredis.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
结果
和redis自带的测试结果差不多哈。
文章图片
注意
【golang|golang-对redis进行压力测试】1.请确保电脑性能能跟的上,在只有单核,2G内存的虚拟机上协程没能完全跑起来,数值很低。
2.并发设置:大概30-50就合适了,多了获得的结果也差不多。
推荐阅读
- 【golang】leetcode中级-字母异位词分组&无重复字符的最长子串
- 彻底理解Golang Map
- kratos线上开源年会它来啦~
- 深入浅出 Golang 资源嵌入方案(go-bindata篇)
- 深入浅出 Golang 资源嵌入方案(前篇)
- golang 经典案例总结
- Go实战 | 基于有向无环图的并发执行流的实现
- Golang 数组和切片
- Go JSON编码与解码()
- golang map基础知识