源碼來自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() }