Golang 开发:Redis 写入优化建议 - setAuthCodeValue 函数分析
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
}
优化建议:
-
使用 Redis Pipeline 提高性能:
- 将多个命令一次性发送给 Redis,减少网络通信次数,提升写入效率。
- 代码示例:
pipe := redisProxy.Pipeline() defer pipe.Close() pipe.Do('SET', redisKey, string(jb), 'EX', ex) // ... 其他命令 ... _, err := pipe.Exec() -
记录 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) // 记录具体错误 } -
使用连接池管理 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() -
提前创建 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 写入操作的效率和可维护性,提高代码质量。
原文地址: https://www.cveoy.top/t/topic/nymF 著作权归作者所有。请勿转载和采集!