Golang 开发:Redis 写入优化建议 - setAuthCodeValue 函数分析

代码片段:

// setAuthCodeValue AuthCode值写入redis
func setAuthCodeValue(ctx context.Context, authCode string, value *authCodeInfo, nx string) error {
	ex := int64(1) // 默认立即过期
	if time.Now().Unix() < value.ExpireTimeStamp {
		ex = value.ExpireTimeStamp - time.Now().Unix() // 延用过期时间
	}
	jb, err := json.Marshal(value)
	if err != nil {
		log.ErrorContextf(ctx, 'json.Marshal err %+v', err)
		return err
	}
	// 将auth_code信息写入redis
	redisKey := getAuthCodeKey(authCode)
	redisProxy := redis.NewClientProxy('cloud_pay.defend_retry')
	if nx == 'NX' {
		reply, redisErr := redis.String(redisProxy.Do(ctx, 'SET', redisKey, string(jb), 'EX', ex, 'NX'))
		if reply != 'OK' || redisErr != nil {
			stat.IncrCounter(ctx, 'redis.setAuthCodeValue.err', 1)
			log.ErrorContextf(ctx, 'SetPayAuthCodeToRedisErr,key:%+v,reply:%+v,err:%+v', redisKey, reply, redisErr)
			return errors.New('redis set fail')
		}
		log.InfoContextf(ctx, 'SetPayAuthCodeToRedis,key:%+v,reply:%+v', redisKey, reply)
	} else {
		reply, redisErr := redisProxy.Do(ctx, 'SET', redisKey, string(jb), 'EX', ex)
		if redisErr != nil {
			stat.IncrCounter(ctx, 'redis.setAuthCodeValue.err', 1)
			log.ErrorContextf(ctx, 'SetPayAuthCodeToRedisErr,key:%+v,reply:%+v,err:%+v', redisKey, reply, redisErr)
			return redisErr
		}
		log.InfoContextf(ctx, 'SetPayAuthCodeToRedis,key:%+v,reply:%+v', redisKey, reply)
	}
	return nil
}

优化建议:

  1. 使用 Redis Pipeline 提高性能:

    • 将多个命令一次性发送给 Redis,减少网络通信次数,提升写入效率。
    • 代码示例:
    	pipe := redisProxy.Pipeline()
    	defer pipe.Close()
    	pipe.Do('SET', redisKey, string(jb), 'EX', ex)
    	// ... 其他命令 ...
    	_, err := pipe.Exec()
    
  2. 记录 Redis 写入失败原因:

    • 在写入失败时记录具体的错误信息,方便后续调试和分析问题。
    • 代码示例:
    	if redisErr != nil {
    		stat.IncrCounter(ctx, 'redis.setAuthCodeValue.err', 1)
    		log.ErrorContextf(ctx, 'SetPayAuthCodeToRedisErr,key:%+v,reply:%+v,err:%+v', redisKey, reply, redisErr)
    		return fmt.Errorf('redis set fail: %w', redisErr) // 记录具体错误
    	}
    
  3. 使用连接池管理 Redis 连接:

    • 避免频繁创建和销毁连接,提高连接效率,降低资源消耗。
    • 代码示例:
    	// 使用连接池管理 Redis 连接
    	pool, err := redis.NewPool(func() (redis.Conn, error) {
    		return redis.Dial('tcp', 'localhost:6379') // 连接 Redis
    	}, &redis.PoolOptions{MaxIdle: 10, MaxActive: 100}) // 配置连接池
    	defer pool.Close()
    	conn := pool.Get()
    	defer conn.Close()
    
  4. 提前创建 Redis 连接和 Client 对象:

    • 如果该函数经常被调用,可以将 Redis 连接和 Client 对象提前创建好,避免每次调用都重复创建,提升性能。
    • 代码示例:
    	// 全局变量,提前创建连接和 Client 对象
    	var redisClient = redis.NewClient('tcp', 'localhost:6379')
    
    	func setAuthCodeValue(ctx context.Context, authCode string, value *authCodeInfo, nx string) error {
    		// ...
    		reply, redisErr := redisClient.Do(ctx, 'SET', redisKey, string(jb), 'EX', ex)
    		// ...
    	}
    

总结:

通过以上优化建议,可以有效提升 Golang 代码中 Redis 写入操作的效率和可维护性,提高代码质量。

Golang 开发:Redis 写入优化建议 - setAuthCodeValue 函数分析

原文地址: https://www.cveoy.top/t/topic/nymF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录