公司内有多个 go-redis 的 client 和多种 redis cluster 版本,业务压测发现即使只访问 redis 的 API 接口也可能会延迟达到秒级,非常反直觉。
我们用不同版本的 go-redis 和不同版本的 redis cluster 来简单做个压测,redis 命令用简单的 get,kv 大小都是一个字节,这里把数据先放出来:
Client 版本 |
Server 版本 |
平均延迟 |
qps |
v6 |
5.0 |
2.58ms |
42138.85 |
v8 |
5.0 |
2.29ms |
43567.68 |
v6 |
6.0 |
549.22ms |
117 |
v8 |
6.0 |
2.48ms |
41794.86 |
可以看到第三行数据异常,访问 redis 竟然有 500ms,说明如果 client 和 server 版本没没对上确实会有比较麻烦的问题。
下面我们来分析一下这个问题。
压测环境准备
安装 redis-server,没啥可说的,不要用 mac 的 brew,因为 brew 安装的版本没有 create-cluster 脚本工具。从官网下载分发版本就可以,在 mac 上到 redis 根目录执行一次 make 就好。
这里我们只测试server 5.0 和 6.0。
进入到 redis 的 utils/create-cluster 目录,直接执行
./create-cluster start ./create-cluster create
默认应该是启动三主三从,启动了以后随便连一个实例就可以进去了
~ ❯❯❯ redis-cli -c -p 30001 127.0.0.1:30002> set 1 1
提前把 kv 存好,然后用 30001,30002,30003 这三个实例来创建 client。
client 端要分别准备 go-redis/redis 和 go-redis/redis/v8。
v6 版本:
package main import ( "fmt" "log" "net/http" _ "net/http/pprof" "github.com/go-redis/redis" ) var cli = redis.NewClusterClient(&redis.ClusterOptions{ Addrs: []string{"127.0.0.1:30001", "127.0.0.1:30002", "127.0.0.1:30003"}, }) func sayhello(wr http.ResponseWriter, r *http.Request) { s := cli.Get( "1") err := s.Err() if err != nil { fmt.Println(err) } } func main() { http.HandleFunc(&#