golang]使用redis實現簡單的分布式鎖


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM