https://github.com/study-only/go-locks

Redis分布式锁

SET
Redis 2.6.12SET
SET key value [EX seconds] [PX milliseconds] [NX|XX]

可选参数

EX secondssecondsSET key value EX secondsSETEX key seconds valuePX millisecondsmillisecondsSET key value PX millisecondsPSETEX key milliseconds valueNXSET key value NXSETNX key valueXX

返回值

Redis 2.6.12SETRedis 2.6.12SETOKNXXX

Redis分布式锁实现原理

SETSET key value EX seconds NX
import (
    "errors"
    "time"
    "github.com/go-redis/redis"
)

var redisClient *redis.Client

type redisLock struct {
    name    string
    expiry  time.Duration
}

func (l *redisLock) TryLock() error {
    if ok, _ := redisClient.SetNX(l.name, 1, l.expiry).Result(); !ok {
        return errors.New("redis lock: already locked")
    }

    return nil
}

func (l *redisLock) Unlock() error {
    return redisClient.Del(l.name).Err()
}