golang使用redis的setnx实现了一个自选锁,有key超时,同时也有我们调用redis链接时的超时。
package locker
var redisCli *redis.Client
func init() {
redisCli = 链接redis
}
type DistributeLock struct {
resource string
value interface{}
expire time.Duration //key超时间隔
}
func NewLocker(resource string, val interface{}, exp time.Duration) *DistributeLock {
return &DistributeLock{
resource: resource,
value: val,
expire: exp,
}
}
func (l *DistributeLock) tryLock() (ok bool, err error) {
ok, err = redisCli.SetNX(l.resource, l.value, l.expire).Result()
//log.Printf("resource:%s, timeout:%v, ok:%v, err:%v\n", lock.resource, lock.timeout, ok, err)
return
}
func (l *DistributeLock) Lock(ctx context.Context) (timeOut bool, err error) {
var (
ok bool
)
for {
select {
case <-ctx.Done():
timeOut = true
return
default:
ok, err = l.tryLock()
if err != nil {
return
}
if ok {
return
} el