我是靠谱客的博主 纯情老师,最近开发中收集的这篇文章主要介绍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("创建新的连接: %vn", 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, //写超时,默认等于读超时

执行结果

小结

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

最后

以上就是纯情老师为你收集整理的Golang go-redis cluster模式下不断创建新连接,效率下降问题解决前言问题复现问题解决小结的全部内容,希望文章能够帮你解决Golang go-redis cluster模式下不断创建新连接,效率下降问题解决前言问题复现问题解决小结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部