在查询重复并插入新数据的场景下可能存在重复插入的问题,所以利用redis进行加锁解决:
//加锁
func LockEdit(name, text string) (bool, error) {
key := global.ResubmitKey.GetKey() + name + ":" + text
//锁定10秒
return global.RDB.SetNX(key, "lock", time.Duration(10)*time.Second).Result()
}
//解锁
func UnLockEdit(name, text string) error {
key := global.ResubmitKey.GetKey() + name + ":" + text
return global.RDB.Del(key).Err()
}
使用方法:
//加锁
if ok, err := redis.LockEdit("orders", t_acr); !ok || err != nil {
response.SendText(c, global.ErrorCode.ResubmitError, nil)
return
}
//解锁
defer func() {
redis.UnLockEdit("orders", t_acr)
}()