代码拉取完成,页面将自动刷新
package gmredis
import (
"fmt"
"time"
"gitee.com/micro-tools/wf/util/gconv"
"gitee.com/micro-tools/wf/util/guid"
)
type Lock struct {
}
//LockWithTimeout 设置分布式 lockTime 锁设置的ttl时间 ; waitTime 等待时间
func (c *Lock) LockWithTimeout(key string, lockTime, waitTime int) (string, bool) {
id := guid.S()
name := "lock:" + key
end := time.Now().Add(time.Second * time.Duration(waitTime))
for time.Now().Before(end) {
res, err := Get().Str.SetNX(name, id)
if err != nil {
return "", false
} else {
if res {
res, err = Get().Key.Expire(name, lockTime)
if err != nil {
return "", false
} else {
if res {
return id, true
} else {
return "", false
}
}
} else {
n, err := Get().Key.TTl(name)
if err != nil {
return "", false
}
if n == -1 {
// 如果key存在,但是没有设置剩余时间
_, _ = Get().Key.Expire(name, lockTime)
}
}
}
time.Sleep(time.Microsecond)
}
return "", false
}
//ReleaseLock 释放锁 id LockWithTimeout 返回的记录,用于比较存储中的一致性
func (c *Lock) ReleaseLock(key, id string) error {
name := "lock:" + key
has, err := Get().Key.Exists(name)
if err != nil {
return err
}
if has {
res, err := Get().Str.Get(name)
if err != nil {
return err
}
if id == gconv.String(res) {
_, _ = Get().Key.Del(name)
return nil
} else {
return fmt.Errorf("id %s != %s", id, gconv.String(res))
}
} else {
return fmt.Errorf("key %s is not exist", key)
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。