redis 實現簡單分布式鎖

Redis分布式鎖

Redis SET 命令如下:

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

參數說明:

  • EX seconds:將鍵的過期時間設置為seconds秒。 執(zhí)行SET key value EX seconds的效果等同于執(zhí)行SETEX key seconds value。

  • PX milliseconds:將鍵的過期時間設置為milliseconds毫秒。 執(zhí)行SET key value PX milliseconds的效果等同于執(zhí)行 PSETEX key milliseconds value。

  • NX : 只在鍵不存在時, 才對鍵進行設置操作。 執(zhí)行SET key value NX的效果等同于執(zhí)行SETNX key value。

  • XX : 只在鍵已經存在時, 才對鍵進行設置操作。

返回值

在Redis 2.6.12版本以前,SET命令總是返回 OK 。

從Redis 2.6.12版本開始,SET命令只在設置操作成功完成時才返回OK; 如果命令使用了NX或者XX選項, 但是因為條件沒達到而造成設置操作未執(zhí)行, 那么命令將返回空批量回復(NULL Bulk Reply)

Redis分布式鎖實現原理

從Redis命令看出,SET命令為原子操作,我們可以用SET key value EX seconds NX來實現分布式鎖,下面為go語言實現:

下面簡單的go代碼

      package main
        import(
            "errors"
           "time"
          "github.com/go-redis/redis"
       )

      var(
              redisClient  *redis.Client
        )

type  TryLocker interface{
        TryLock() error
         Unlock() error
}

type redisLock struct{
      Name string  //key
     Expire   time.Duration //過期時間
}

func newRedisLock(name string, t time.Duration) *redisLock{
        return & redisLock{
            Name:name,
            Expire:t, 
       }
}

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


func(l *redisLock)Unlock() error{
     return redisClient.Del(l.Name).Err()
}
  func main(){
        l:=newRedisLock("cr",time.Second)
       err:=l.TryLock()
      var wg sync.WaitGroup
    for i := 0; i < 100; i++ {
        wg.Add(1)
               if err != nil {
            time.Sleep(50*time.Millisecond)
            if i >= 100 {
                fmt.Println("任務處理 異常:", i)
                wg.Done()
                return
            }
        }
        fmt.Println("任務處理中....")
        l.Unlock()
        fmt.Println("任務處理 ok:", i)
        wg.Done()
    }
    wg.Wait()
 }
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 在單實例JVM中,常見的處理并發(fā)問題的方法有很多,比如synchronized關鍵字進行訪問控制、volatile...
    朱小廝閱讀 830評論 2 8
  • Redis從入門到精通:中級篇 本文目錄 上一篇文章以認識Redis為主,寫了Redis系列的第一篇,現在開啟第二...
    叨唧唧的閱讀 783評論 0 0
  • 基本的Redis key的操作都已經熟悉了之后,便可以開始針對Redis提供的各種可操作的數據結構進行學習和了解。...
    Yorking閱讀 907評論 0 0
  • 1 介紹 這篇博文講介紹如何一步步構建一個基于Redis的分布式鎖。會從最原始的版本開始,然后根據問題進行調整,最...
    Java黎先生閱讀 560評論 0 2
  • 美樂家是一家環(huán)保工廠超市,直接對應消費者。消費者在這里購物是計劃性消費,可以讓消費者享受到高質量低價格的產品。顧客...
    米太陽閱讀 1,829評論 0 1

友情鏈接更多精彩內容