该函数是将 AuthCode 值写入 Redis 缓存中,函数参数包括上下文、AuthCode 字符串、AuthCode 信息结构体指针、nx 字符串。其中,AuthCode 信息结构体包含过期时间等信息,函数首先根据过期时间计算出缓存过期时间 ex,并将结构体指针序列化为 json 格式的字符串。然后,函数通过 redis 代理客户端将数据写入 Redis 缓存中。如果 nx 参数为 'NX',表示只有在缓存中不存在该键值时才写入,否则直接写入。函数返回写入结果,如果写入失败,会返回错误信息。

// 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
}
Golang 开发:将 AuthCode 值写入 Redis 缓存

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

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