Golang go-redis cluster模式下不断创建新连接,效率下降问题解决

前言

至于go-redis的cluster模式怎么调用,我就不多说了。可以参考我的另一篇文章:Go语学习笔记 - redis cluster集群模式 | Web框架Gin(十三)_剑客阿良_ALiang的博客-CSDN博客

在我测试集群模式下redis调用的时候发现效率不如单一节点模式。

我们先复现一下问题是怎么出现的。

问题复现

先初始化构建一个cluster集群连接。

package connect

import (
	"context"
	"fmt"
	"github.com/go-redis/redis/v8"
	"time"
)

var Cluster *redis.ClusterClient

func init() {
	Cluster = redis.NewClusterClient(&redis.ClusterOptions{
		Addrs: []string{
			"xxxxx:7379",
			"xxxxx:7380",
		},
		Password: "123456",
		//DialTimeout:  100 * time.Microsecond,
		ReadTimeout: 100 * time.Microsecond,
		//WriteTimeout: 100 * time.Microsecond,
		DialTimeout: 5 * time.Second, //连接建立超时时间,默认5秒。
		//ReadTimeout:  3 * time.Second, //读超时,默认3秒, -1表示取消读超时
		WriteTimeout: 3 * time.Second, //写超时,默认等于读超时
		OnConnect: func(ctx context.Context, conn *redis.Conn) error {
			fmt.Printf("创建新的连接: %v\n", conn)
			return nil
		},
	})
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	Cluster.Ping(ctx).Result()
}

写一个简单的测试redis使用的demo。

package demo

import (
	"RedisCluster/connect"
	"context"
	"fmt"
	"time"
)

const Key = "test-111"

func SampleDemo() {
	// 第一次写入数据,并设置10分钟缓存
	connect.Cluster.Set(context.TODO(), Key, "666", 10*time.Minute)
	cmd := connect.Cluster.Get(context.TODO(), Key)
	result, _ := cmd.Result()
	fmt.Println("result:", result)

	// 第二次写入数据,并设置10分钟缓存
	start := time.Now().UnixMilli()
	connect.Cluster.Set(context.TODO(), Key, "777", 10*time.Minute)
	end := time.Now().UnixMilli()
	fmt.Println("set ->", (end - start))
	cmd = connect.Cluster.Get(context.TODO(), Key)
	end1 := time.Now().UnixMilli()
	fmt.Println("get ->", (end1 - end))
	result, _ = cmd.Result()
	fmt.Println("result:", result)
}

代码说明

1、启动的时候会对Cluster进行初始化,我们先存取一次,然后接着存取第二次。主要看一下第二次的耗时情况。

2、在创建Cluster的时候建了一个钩子函数,如果创建新连接会打印一句话。

执行结果

可以看到在第二次执行的时候,创建了多个连接,直接导致设置key的时间到了150ms。

问题解决

我在网上找了挺久,类似问题没怎么找到,我开始试着看一遍入参。

最终是将ReadTimeout调整为3秒后,正常了。

代码调整如下:

		//DialTimeout:  100 * time.Microsecond,
		ReadTimeout: 3000 * time.Microsecond,
		//WriteTimeout: 100 * time.Microsecond,
		DialTimeout: 5 * time.Second, //连接建立超时时间,默认5秒。
		//ReadTimeout:  3 * time.Second, //读超时,默认3秒, -1表示取消读超时
		WriteTimeout: 3 * time.Second, //写超时,默认等于读超时

执行结果

小结

以后有时间还是要看看具体原因。

猜你喜欢

转载自blog.csdn.net/zhiweihongyan1/article/details/125715222
今日推荐