先说问题点
redis 的result 方法反馈的是 interface ,所以比较有问题
1.执行的 lua 脚本
var (
// 对应的可使用种草任务数量减1
CompanyTaskDeductionLua = `
local test = tonumber(redis.call('GET', KEYS[1]))
if test and test > 0 then
redis.call('DECR', KEYS[1])
return 1
else
return 0
end`
)
2. golang 调用 redis eval执行
注意
注意
注意
这里的 result 反馈的是值,不能直接比较,因为他是 interface 类型,就算反馈的是 lua 中的 return 0,你用 res == 0或者字符串 res == “0” 都不能进行比较,而且,如果使用 String 方法获取的是 lua 脚本的本身
res, err := rdb.Eval(ctx, CompanyTaskDeductionLua, []string{RedisCompanyTaskPre + taskId}).Result()
if err != nil {
return err
}
b, err := json.Marshal(res)
if err != nil {
return err
}
if string(b) == "0" {
return errors.New("decr task err")
}
return nil