婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Redis如何實現分布式鎖

Redis如何實現分布式鎖

熱門標簽:魔獸2青云地圖標注 山東外呼銷售系統招商 宿遷便宜外呼系統平臺 北京400電話辦理收費標準 日本中國地圖標注 貴州電銷卡外呼系統 鄭州人工智能電銷機器人系統 超呼電話機器人 十堰營銷電銷機器人哪家便宜

今天我們來聊一聊分布式鎖的那些事。

相信大家對鎖已經不陌生了,我們在多線程環境中,如果需要對同一個資源進行操作,為了避免數據不一致,我們需要在操作共享資源之前進行加鎖操作。在計算機科學中,鎖(lock)或互斥(mutex)是一種同步機制,用于在有許多執行線程的環境中強制對資源的訪問限制。

比如你去相親,發現你和一大哥同時和一個女的相親,那怎么行呢...,搞不好還要被揍一頓。

那什么是分布式鎖呢。當多個客戶端需要爭搶鎖時,我們就需要分布式鎖。這把鎖不能是某個客戶端本地的鎖,否則的話,其它客戶端是無法訪問的。所以分布式鎖是需要存儲在共享存儲系統中的,比如Redis、Zookeeper等,可以被多個客戶端共享訪問和獲取。今天我們就來看一下如何使用Redis來實現分布式鎖。

一、前言

在正式開始之前,我們先來了解兩個Redis的命令:

SETNX key value

這個命名的含義是,當key存在時,不做任何賦值操作;當key不存在時,就創建key,并賦值成value,即(不存在即設置)。

SET key value [EX seconds | PX milliseconds] NX

SET后加NX選項,就和SETNX命令類似了,也實現不存在即設置的功能。此外,這個命令在執行時,可以通過EX或者PX設置鍵值對的過期時間。

二、正文

開始之前,我們先引入一個場景:

假設要給某個商品舉行秒殺活動,我們事先把庫存數據100已經存入到了redis中,我們現在需要來進行庫存扣減。

如圖所示,我們假設有1000個客戶端來進行庫存扣減操作,那我們該如何做,才能保證庫存扣減順序一致且不會超扣呢。

我們首先想到的就是加鎖,在進行庫存扣減之前,我們先拿到鎖,然后進行扣減,最后再釋放鎖。在redis中我們創建一個key來代表一個鎖變量,然后對應的值來表示鎖變量的值。我們來看一下如何進行加鎖。

假設1000個客戶端同時進行加鎖請求。因為redis使用單線程來處理請求,所以redis會串行執行他們的請求操作。假設redis先處理客戶端2的請求,讀取lock_key的值,發現lock_key為0,所以客戶端2就把lock_key的value設置成1,表示已經進行了加鎖操作。如果此時客戶端3被處理,發現lock_key的值已經為1了,所以就返回加鎖失敗的信息。

當拿到鎖的客戶端2處理完共享資源后,就要進行釋放鎖的操作,釋放鎖很簡單,就是將lock_key重新設置為0。

由于加鎖操作包含了三個操作(讀取鎖變量、判斷鎖變量的值以及把鎖變量的值設置成1),而這三個操作在執行的過程中需要保證原子性。那怎么保證原子性呢?

我們可以使用SETNX命令來實現加鎖操作,SETNX命令表示key不存在時就創建,key存在時就不做任何賦值操作,當加鎖時候,我們執行

SETNX lock_key 1

對于釋放鎖操作來說,我們可以使用DEL命令來刪除鎖變量。比如客戶端2進行加鎖,執行SETNX lock_key 1,如果lock_key不存在,則會創建lock_key,返回加鎖成功,此時客戶端2可以進行共享資源的訪問。如果這時客戶端1來發起請求加鎖操作,而此時lock_key已經存在,SETNX lock_key 1不做任何賦值操作操作,返回加鎖失敗,所以客戶端1加鎖失敗。當客戶端2執行完共享資源訪問后,執行DEL命令來釋放鎖。此時當有其它客戶端再來訪問時,lock_key已經不存在了,就可以進行正常的加鎖操作了。所以,我們可以使用SETNX和DEL命令組合來進行加鎖和釋放鎖的操作。

不過這里有兩個問題:

1.當某個客戶端執行完SETNX命令、加鎖后,此時發生了異常,結果一直沒有執行DEL操作命令來釋放鎖。因此,這個客戶端一直占用著這個鎖,其它客戶端無法拿到鎖。

解決這個問題,一個有效的方法就是,給鎖變量設置一個過期時間。這樣一來,即使持有鎖的客戶端發生了異常,無法主動的釋放鎖,Redis也會根據鎖變量的過期時間把它刪除。其它客戶端在鎖變量過期后,就可以重新進行加鎖操作了。

2.如果客戶端1執行了SETNX命令加鎖后。如果此時客戶端2執行DEL命令刪除鎖,這時,客戶端A的鎖就被誤釋放了。這是我們不能接受的。

為了解決這個問題,我們需要能區分來自不同客戶端的鎖操作。我們該如何做呢?我們可以給每個客戶端生成一個唯一值,在進行加鎖時,我們把鎖變量賦值成這個唯一值。這樣在釋放鎖的時候,客戶端需要判斷,當前鎖變量的值是否和自己的唯一標識相等,在相等的情況下,才能釋放鎖。

下面來看一下如何在Redis中進行實現。我們可以使用SET加EX/PX和NX選項,來進行加鎖操作。

SET lock_key uuid NX PX 100

 其中lock_key是鎖變量,uuid表示客戶端的唯一標識,PX 100表示100ms過期。由于我們在釋放鎖時需要對比客戶端的標識和鎖變量的值是否一致,這包含了多個操作,為了保證原子性,我們需要使用lua腳本,下面是lua腳本的實現。

if redis.call("get",KEYS[1]) == ARGV[1] then  
   return redis.call("del",KEYS[1])
else 
   return 0
end

其中KEY[1]表示lock_key,ARGV[1]表示當前客戶端的唯一標識,這兩個值是我們在執行lua腳本時作為參數傳入的。下面我們來看一下完整的代碼實現。

import redis
import traceback
import uuid
import time
 
class Inventory(object):
    def __init__(self):
        pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
        client = redis.StrictRedis(connection_pool=pool, max_connections=20)
        self.client=client
        self.uuid=str(uuid.uuid1())
        print(self.uuid)
        self.key="lock_key"
        self.inventory_key="inventory"
    def unlock(self):
        unlock_script="" \

                      "if redis.call(\"get\",KEYS[1]) == ARGV[1] then" \

                      "   return redis.call(\"del\",KEYS[1])" \

                      "else" \

                      "   return 0 " \

                      "end"
        try:
            unlock_cmd=self.client.register_script(unlock_script)
            result=unlock_cmd(keys=[self.key],args=[self.uuid])
            if result==1:
                print("釋放成功")
            else:
                print("釋放出錯")
        except:
            print(traceback.format_exc())
 
    def lock(self):
        try:
          while True:
             result=self.client.set(self.key,self.uuid,px=100,nx=True)
             print(result)
             if result==1:
                 break
 
             print("sleep 1s")
             time.sleep(1)
          print("加鎖成功")
          return True
        except:
          print(traceback.format_exc())
    def inventory(self):
        if self.lock():
           print("庫存扣減")
           self.client.decr(self.inventory_key)
           print("扣減完成")
           self.unlock()
 
 
inv=Inventory()
inv.inventory()

到此,我們就把Redis實現分布式鎖就聊完了。既然都讀到了這里,不妨給個「三連」吧,你的三連就是我最大的動力。

到此這篇關于Redis如何實現分布式鎖的文章就介紹到這了,更多相關Redis 分布式鎖內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Redis實現分布式鎖的幾種方法總結
  • 詳解Java如何實現基于Redis的分布式鎖
  • 淺談Redis分布式鎖的正確實現方式
  • Redis分布式鎖實現方式及超時問題解決
  • Redis上實現分布式鎖以提高性能的方案研究
  • Java Redis分布式鎖的正確實現方式詳解
  • 基于redis分布式鎖實現秒殺功能

標簽:江蘇 大慶 北京 楊凌 果洛 吉安 臺州 朝陽

巨人網絡通訊聲明:本文標題《Redis如何實現分布式鎖》,本文關鍵詞  Redis,如何,實現,分布式,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Redis如何實現分布式鎖》相關的同類信息!
  • 本頁收集關于Redis如何實現分布式鎖的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    91女厕偷拍女厕偷拍高清| 久久精品国产亚洲a| 国产日本亚洲高清| 精品久久人人做人人爱| 欧美一级欧美三级| 精品国产青草久久久久福利| 日韩精品一区国产麻豆| 精品久久久久久久一区二区蜜臀| 日韩精品中午字幕| 国产清纯白嫩初高生在线观看91| 国产日韩欧美一区二区三区综合| 久久女同精品一区二区| 一区二区中文视频| 亚洲影视资源网| 污片在线观看一区二区| 久久精品噜噜噜成人88aⅴ| 国产在线精品国自产拍免费| 国产成人免费视频网站| 91黄色免费网站| 欧美一区二区三区思思人| 欧美r级电影在线观看| 久久精品夜色噜噜亚洲aⅴ| 亚洲人成网站在线| 老鸭窝一区二区久久精品| 国产精品77777| 91黄色免费网站| 欧美成人精品高清在线播放| 国产精品久久久久婷婷二区次| 亚洲精品欧美激情| 精品一区二区av| 91麻豆国产香蕉久久精品| 欧美一二三区精品| 国产精品午夜在线观看| 日韩电影在线观看电影| 国产69精品久久久久777| 欧美性色综合网| 日本一区二区三区免费乱视频| 亚洲国产一二三| 国产精品一品视频| 欧美电影在线免费观看| 亚洲欧洲精品一区二区三区| 日本强好片久久久久久aaa| 国产精品萝li| 日本一区二区三区在线不卡| 成人丝袜高跟foot| 91热门视频在线观看| 韩国女主播成人在线观看| 波多野结衣一区二区三区| 欧美一区二区三区免费视频| 国产精品视频第一区| 日本不卡视频一二三区| 色老汉一区二区三区| 国产精品午夜在线| 国产成人午夜精品影院观看视频| 欧美日韩国产免费一区二区| 亚洲色图色小说| 国产成人精品亚洲日本在线桃色| 日韩欧美一区中文| 日韩激情视频网站| 欧美日韩精品一区视频| 洋洋av久久久久久久一区| 99久久99久久精品免费看蜜桃| 久久久久综合网| 精品一区二区免费看| 久久婷婷综合激情| 国产一区二区三区蝌蚪| 日韩欧美的一区二区| 五月激情六月综合| 91精品在线免费观看| 婷婷久久综合九色综合伊人色| 欧美视频一区二区在线观看| 亚洲女爱视频在线| 日本韩国一区二区三区| 一区二区高清免费观看影视大全| 色妹子一区二区| 亚洲一区二区综合| 欧美精品黑人性xxxx| 日韩国产欧美在线观看| 精品日韩99亚洲| 国产在线播放一区三区四| 久久美女高清视频| 波多野结衣中文字幕一区| 中文字幕中文字幕在线一区| 91福利在线播放| 日本美女视频一区二区| 久久免费电影网| 99国产精品一区| 夜夜揉揉日日人人青青一国产精品| 欧美午夜精品一区二区三区| 免费人成黄页网站在线一区二区| 日韩美女一区二区三区| 成人精品视频.| 五月综合激情婷婷六月色窝| 久久伊99综合婷婷久久伊| 9久草视频在线视频精品| 亚洲综合成人在线视频| 欧美精品v日韩精品v韩国精品v| 国内精品免费**视频| 亚洲欧美日韩国产手机在线 | 午夜精品久久久久久久久久| 91麻豆精品国产91久久久久| 国产精品影视在线观看| 一区二区三区在线视频观看58| 欧美一区二区三区日韩| 国产九色sp调教91| 亚洲综合色丁香婷婷六月图片| 精品国产人成亚洲区| 在线观看成人小视频| 国产美女精品在线| 午夜精品福利久久久| 中文字幕一区二区三区蜜月| 91精品国产综合久久久久久久久久| 国产成人精品亚洲午夜麻豆| 午夜精品在线视频一区| 中文字幕av免费专区久久| 91精品国产综合久久久久久| 色综合中文综合网| 亚洲免费成人av| 久久久不卡影院| 欧美日韩视频不卡| 波多野结衣的一区二区三区| 韩国精品在线观看| 亚洲成人三级小说| 最新国产成人在线观看| 久久久久久99精品| 日韩免费高清av| 欧美撒尿777hd撒尿| 色综合天天综合网天天看片| 国产乱码精品1区2区3区| 日本最新不卡在线| 午夜视频在线观看一区二区三区| 国产精品美女久久久久久| 欧美不卡一区二区三区| 欧美日本韩国一区二区三区视频 | 一区在线播放视频| 国产日韩欧美在线一区| 久久亚洲综合色| 欧美成人一区二区三区| 欧美日韩成人综合| 欧美性极品少妇| 日本精品一区二区三区高清 | 日韩精品专区在线| 日韩网站在线看片你懂的| 欧美视频中文字幕| 欧美日韩一区高清| 欧美美女一区二区| 在线电影国产精品| 日韩欧美成人一区| 久久伊99综合婷婷久久伊| 久久精品一区二区三区不卡| 欧美韩国一区二区| 国产精品美女久久久久久久久久久| 国产精品视频一二三| 国产精品婷婷午夜在线观看| 国产精品不卡在线| 一级做a爱片久久| 午夜精品福利一区二区蜜股av| 亚洲成人综合视频| 麻豆91在线观看| 国产一区视频导航| 国产福利91精品| 一本一道波多野结衣一区二区| 在线观看一区二区精品视频| 欧美视频中文字幕| 日韩三级视频在线看| 精品国产免费视频| 亚洲国产精品成人综合色在线婷婷| 国产欧美一区二区精品久导航| 中文字幕+乱码+中文字幕一区| 亚洲人成小说网站色在线| 亚洲v精品v日韩v欧美v专区| 国内精品伊人久久久久av影院| 成人污视频在线观看| 欧美性色aⅴ视频一区日韩精品| 日韩一区二区不卡| 国产精品久久久久久久久搜平片| 亚洲乱码中文字幕| 久久电影国产免费久久电影 | 五月激情综合婷婷| 国产高清精品网站| 欧美三级视频在线观看| 久久精品一区四区| 亚洲成人高清在线| 成人深夜福利app| 欧美一区二区女人| 国产精品理论片在线观看| 日韩av网站在线观看| 成人精品免费看| 日韩一区二区三区三四区视频在线观看 | 最新久久zyz资源站| 水野朝阳av一区二区三区| 99re这里都是精品| 精品久久久久久综合日本欧美| 一区二区三区鲁丝不卡| 久久成人久久爱| 欧美肥胖老妇做爰| 一区二区三区中文在线观看| 国产精品亚洲专一区二区三区| 欧美麻豆精品久久久久久| 亚洲精品乱码久久久久|