简单的 redis get 为什么也会有秒级的延迟

在业务压测中,使用go-redis客户端访问redis cluster时发现get命令出现秒级延迟。研究发现,client与server版本不匹配时,初始化cmdsInfoCache时的命令解析错误导致锁竞争,影响性能。解决方案是更新到最新版go-redis以避免此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司内有多个 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(&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值