源碼來自https://github.com/study-only/go-locks
Redis分布式鎖
Redis SET 命令
從Redis 2.6.12版本開始,SET命令的行為可以通過一系列參數來修改,詳見Redis命令參考:
SET key value [EX seconds] [PX milliseconds] [NX|XX]
可選參數
EX seconds:將鍵的過期時間設置為seconds秒。 執行SET key value EX seconds的效果等同於執行SETEX key seconds value。PX milliseconds:將鍵的過期時間設置為milliseconds毫秒。 執行SET key value PX milliseconds的效果等同於執行PSETEX key milliseconds value。NX: 只在鍵不存在時, 才對鍵進行設置操作。 執行SET key value NX的效果等同於執行SETNX key value。XX: 只在鍵已經存在時, 才對鍵進行設置操作。
返回值
在Redis 2.6.12版本以前,SET命令總是返回 OK 。
從Redis 2.6.12版本開始,SET命令只在設置操作成功完成時才返回OK; 如果命令使用了NX或者XX選項, 但是因為條件沒達到而造成設置操作未執行, 那么命令將返回空批量回復(NULL Bulk Reply)
Redis分布式鎖實現原理
從Redis命令看出,SET命令為原子操作,我們可以用SET key value EX seconds NX來實現分布式鎖,下面為go語言實現:
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() }
