校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識(shí)庫 > 詳解使用Redis SETNX 命令實(shí)現(xiàn)分布式鎖

詳解使用Redis SETNX 命令實(shí)現(xiàn)分布式鎖

熱門標(biāo)簽:地圖標(biāo)注費(fèi)用 西藏教育智能外呼系統(tǒng)價(jià)格 竹間科技AI電銷機(jī)器人 最簡(jiǎn)單的百度地圖標(biāo)注 太原營(yíng)銷外呼系統(tǒng) 地圖標(biāo)注如何即時(shí)生效 百度商家地圖標(biāo)注怎么做 小紅書怎么地圖標(biāo)注店 玄武湖地圖標(biāo)注

使用Redis的 SETNX 命令可以實(shí)現(xiàn)分布式鎖,下文介紹其實(shí)現(xiàn)方法。

SETNX命令簡(jiǎn)介

命令格式

SETNX key value

將 key 的值設(shè)為 value,當(dāng)且僅當(dāng) key 不存在。

若給定的 key 已經(jīng)存在,則 SETNX 不做任何動(dòng)作。

SETNX 是SET if Not eXists的簡(jiǎn)寫。

返回值

返回整數(shù),具體為

- 1,當(dāng) key 的值被設(shè)置

- 0,當(dāng) key 的值沒被設(shè)置

例子

redis> SETNX mykey “hello” 
(integer) 1 
redis> SETNX mykey “hello” 
(integer) 0 
redis> GET mykey 
“hello” 
redis>

使用SETNX實(shí)現(xiàn)分布式鎖

多個(gè)進(jìn)程執(zhí)行以下Redis命令:

SETNX lock.foo current Unix time + lock timeout + 1>

如果 SETNX 返回1,說明該進(jìn)程獲得鎖,SETNX將鍵 lock.foo 的值設(shè)置為鎖的超時(shí)時(shí)間(當(dāng)前時(shí)間 + 鎖的有效時(shí)間)。

如果 SETNX 返回0,說明其他進(jìn)程已經(jīng)獲得了鎖,進(jìn)程不能進(jìn)入臨界區(qū)。進(jìn)程可以在一個(gè)循環(huán)中不斷地嘗試 SETNX 操作,以獲得鎖。

解決死鎖

考慮一種情況,如果進(jìn)程獲得鎖后,斷開了與 Redis 的連接(可能是進(jìn)程掛掉,或者網(wǎng)絡(luò)中斷),如果沒有有效的釋放鎖的機(jī)制,那么其他進(jìn)程都會(huì)處于一直等待的狀態(tài),即出現(xiàn)“死鎖”。

上面在使用 SETNX 獲得鎖時(shí),我們將鍵 lock.foo 的值設(shè)置為鎖的有效時(shí)間,進(jìn)程獲得鎖后,其他進(jìn)程還會(huì)不斷的檢測(cè)鎖是否已超時(shí),如果超時(shí),那么等待的進(jìn)程也將有機(jī)會(huì)獲得鎖。

然而,鎖超時(shí)時(shí),我們不能簡(jiǎn)單地使用 DEL 命令刪除鍵 lock.foo 以釋放鎖。考慮以下情況,進(jìn)程P1已經(jīng)首先獲得了鎖 lock.foo,然后進(jìn)程P1掛掉了。進(jìn)程P2,P3正在不斷地檢測(cè)鎖是否已釋放或者已超時(shí),執(zhí)行流程如下:

  • P2和P3進(jìn)程讀取鍵 lock.foo 的值,檢測(cè)鎖是否已超時(shí)(通過比較當(dāng)前時(shí)間和鍵 lock.foo 的值來判斷是否超時(shí))
  • P2和P3進(jìn)程發(fā)現(xiàn)鎖 lock.foo 已超時(shí)
  • P2執(zhí)行 DEL lock.foo命令
  • P2執(zhí)行 SETNX lock.foo命令,并返回1,即P2獲得鎖
  • P3執(zhí)行 DEL lock.foo命令將P2剛剛設(shè)置的鍵 lock.foo 刪除(這步是由于P3剛才已檢測(cè)到鎖已超時(shí))
  • P3執(zhí)行 SETNX lock.foo命令,并返回1,即P3獲得鎖
  • P2和P3同時(shí)獲得了鎖

從上面的情況可以得知,在檢測(cè)到鎖超時(shí)后,進(jìn)程不能直接簡(jiǎn)單地執(zhí)行 DEL 刪除鍵的操作以獲得鎖。

為了解決上述算法可能出現(xiàn)的多個(gè)進(jìn)程同時(shí)獲得鎖的問題,我們?cè)賮砜匆韵碌乃惴ā?

我們同樣假設(shè)進(jìn)程P1已經(jīng)首先獲得了鎖 lock.foo,然后進(jìn)程P1掛掉了。接下來的情況:

1、進(jìn)程P4執(zhí)行 SETNX lock.foo 以嘗試獲取鎖

2、由于進(jìn)程P1已獲得了鎖,所以P4執(zhí)行 SETNX lock.foo 返回0,即獲取鎖失敗

3、P4執(zhí)行 GET lock.foo 來檢測(cè)鎖是否已超時(shí),如果沒超時(shí),則等待一段時(shí)間,再次檢測(cè)

4、如果P4檢測(cè)到鎖已超時(shí),即當(dāng)前的時(shí)間大于鍵 lock.foo 的值,P4會(huì)執(zhí)行以下操作

GETSET lock.foo current Unix timestamp + lock timeout + 1>

5、由于 GETSET 操作在設(shè)置鍵的值的同時(shí),還會(huì)返回鍵的舊值,通過比較鍵 lock.foo 的舊值是否小于當(dāng)前時(shí)間,可以判斷進(jìn)程是否已獲得鎖

6、假如另一個(gè)進(jìn)程P5也檢測(cè)到鎖已超時(shí),并在P4之前執(zhí)行了 GETSET 操作,那么P4的 GETSET 操作返回的是一個(gè)大于當(dāng)前時(shí)間的時(shí)間戳,這樣P4就不會(huì)獲得鎖而繼續(xù)等待。注意到,即使P4接下來將鍵 lock.foo 的值設(shè)置了比P5設(shè)置的更大的值也沒影響。

另外,值得注意的是,在進(jìn)程釋放鎖,即執(zhí)行 DEL lock.foo 操作前,需要先判斷鎖是否已超時(shí)。如果鎖已超時(shí),那么鎖可能已由其他進(jìn)程獲得,這時(shí)直接執(zhí)行 DEL lock.foo 操作會(huì)導(dǎo)致把其他進(jìn)程已獲得的鎖釋放掉。

程序代碼

用以下Python代碼來實(shí)現(xiàn)上述的使用 SETNX 命令作分布式鎖的算法。

LOCK_TIMEOUT = 3
lock = 0
lock_timeout = 0
lock_key = 'lock.foo'

# 獲取鎖
while lock != 1:
  now = int(time.time())
  lock_timeout = now + LOCK_TIMEOUT + 1
  lock = redis_client.setnx(lock_key, lock_timeout)
  if lock == 1 or (now > int(redis_client.get(lock_key))) and now > int(redis_client.getset(lock_key, lock_timeout)):
    break
  else:
    time.sleep(0.001)

# 已獲得鎖
do_job()

# 釋放鎖
now = int(time.time())
if now  lock_timeout:
  redis_client.delete(lock_key)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • SpringBoot結(jié)合Redis哨兵模式的實(shí)現(xiàn)示例
  • 基于Docker搭建Redis一主兩從三哨兵的實(shí)現(xiàn)
  • Redis Sentinel實(shí)現(xiàn)哨兵模式搭建小結(jié)
  • Redis安裝配置與常用命令
  • redis命令行查看中文不亂碼的方法(十六進(jìn)制字符串處理)
  • redis哨兵常用命令和監(jiān)控示例詳解

標(biāo)簽:林芝 唐山 廣東 澳門 景德鎮(zhèn) 贛州 香港 揚(yáng)州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解使用Redis SETNX 命令實(shí)現(xiàn)分布式鎖》,本文關(guān)鍵詞  詳解,使用,Redis,SETNX,命令,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解使用Redis SETNX 命令實(shí)現(xiàn)分布式鎖》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解使用Redis SETNX 命令實(shí)現(xiàn)分布式鎖的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    日韩黄色在线观看| 一区二区三区在线看| 国产精品影音先锋| 亚洲国产成人在线| 成人91在线观看| 亚洲亚洲精品在线观看| 欧美久久免费观看| 久久国产三级精品| 中国av一区二区三区| 91蜜桃在线免费视频| 午夜不卡av免费| 久久美女艺术照精彩视频福利播放| 国产精品456露脸| 亚洲激情欧美激情| 91精品国产福利在线观看| 国产乱码字幕精品高清av| 亚洲三级在线观看| 日韩天堂在线观看| av电影在线观看完整版一区二区| 亚洲国产aⅴ成人精品无吗| 日韩亚洲欧美一区二区三区| 成人综合在线观看| 亚洲一区免费观看| 久久青草国产手机看片福利盒子 | 七七婷婷婷婷精品国产| 26uuuu精品一区二区| 色婷婷激情综合| 久久成人久久鬼色| 亚洲一区二区三区四区五区黄| 欧美大尺度电影在线| 成人18视频在线播放| 日本成人在线视频网站| 中文字幕一区二区日韩精品绯色| 91精品国产91久久综合桃花| 99v久久综合狠狠综合久久| 美腿丝袜亚洲综合| 一区二区在线观看免费| 久久精品欧美一区二区三区不卡| 欧美亚洲国产一卡| 成人免费观看av| 久久精品国产99久久6| 亚洲激情在线播放| 欧美国产成人精品| 精品国产91九色蝌蚪| 欧美午夜寂寞影院| 色婷婷综合在线| 成人性生交大合| 精品一区二区免费在线观看| 艳妇臀荡乳欲伦亚洲一区| 国产午夜精品久久| 精品处破学生在线二十三| 欧美性大战久久久久久久蜜臀| 波多野结衣的一区二区三区| 精品综合免费视频观看| 青青国产91久久久久久| 亚洲一区二区免费视频| 亚洲美女在线一区| 亚洲同性gay激情无套| 欧美国产国产综合| 国产欧美精品区一区二区三区 | 久久久精品国产免费观看同学| 欧美日韩国产高清一区二区| 欧美综合亚洲图片综合区| aaa亚洲精品| 99精品久久久久久| 成人精品国产福利| 成人激情视频网站| 99久久综合99久久综合网站| 成人妖精视频yjsp地址| 国产成人久久精品77777最新版本| 极品美女销魂一区二区三区| 激情图区综合网| 国产一区二区导航在线播放| 久久99精品久久久久久国产越南| 免费欧美日韩国产三级电影| 三级一区在线视频先锋| 日韩电影在线免费| 另类人妖一区二区av| 麻豆一区二区三| 国产综合久久久久久鬼色| 国产在线日韩欧美| 成人自拍视频在线| 色婷婷综合久久| 欧美日韩一本到| 欧美一区二区三级| 亚洲精品一区二区精华| 久久丝袜美腿综合| 国产精品久久看| 亚洲一区二区三区四区五区黄| 亚洲一区二区av电影| 午夜精品久久久久久久久久| 麻豆一区二区三| 成人精品视频一区二区三区尤物| 99这里只有精品| 欧美日韩国产成人在线91| 日韩三级在线免费观看| 久久久久久久精| 亚洲精品视频一区二区| 亚洲va天堂va国产va久| 精品一区二区三区香蕉蜜桃 | 精品中文字幕一区二区小辣椒| 狠狠久久亚洲欧美| 99久久精品国产麻豆演员表| 欧美日本在线观看| 久久美女艺术照精彩视频福利播放| 国产精品欧美经典| 水蜜桃久久夜色精品一区的特点| 国产高清不卡一区二区| 日本久久电影网| 欧美大黄免费观看| 亚洲人成小说网站色在线| 水蜜桃久久夜色精品一区的特点| 国产精品一区二区久激情瑜伽| 日本韩国一区二区三区视频| 91精品国产福利在线观看 | 欧美系列一区二区| 精品国产乱码久久久久久蜜臀| 国产精品网站在线| 视频一区二区国产| 91在线视频网址| 久久综合久久99| 亚洲成国产人片在线观看| 成人在线视频一区| 日韩三级视频中文字幕| 亚洲视频图片小说| 国产酒店精品激情| 欧美福利视频一区| 日韩一区中文字幕| 久久精品国产免费| 色婷婷av一区二区三区gif| 亚洲精品一区二区三区福利| 亚洲第一福利一区| 一本色道久久综合亚洲91| 精品处破学生在线二十三| 亚洲成人激情综合网| 9i看片成人免费高清| 久久精品一区二区三区不卡| 日韩精品亚洲一区二区三区免费| 91亚洲午夜精品久久久久久| 国产欧美日韩一区二区三区在线观看| 偷窥国产亚洲免费视频| 日本丰满少妇一区二区三区| 欧美国产日韩亚洲一区| 国产一区二区三区香蕉| 日韩情涩欧美日韩视频| 国产在线精品不卡| 91精品婷婷国产综合久久性色 | 亚洲精品一区二区三区香蕉 | 一卡二卡欧美日韩| 成人av电影在线| 日本一二三四高清不卡| 国产剧情在线观看一区二区| 日韩三级在线免费观看| 日本女优在线视频一区二区| 欧美日韩精品二区第二页| 亚洲尤物在线视频观看| 色噜噜久久综合| 亚洲免费在线看| 一本色道久久综合精品竹菊| 亚洲日本成人在线观看| www.久久精品| 亚洲精品成人精品456| 91女神在线视频| 一区二区三区在线高清| 欧美主播一区二区三区| 亚洲一区二区五区| 欧美丰满美乳xxx高潮www| 天天射综合影视| 欧美一二区视频| 国产乱人伦精品一区二区在线观看 | 91在线观看地址| 综合久久给合久久狠狠狠97色| 99九九99九九九视频精品| 亚洲丝袜美腿综合| 欧美日韩一区二区三区四区| 亚洲成人777| 日韩欧美的一区二区| 国产一区二区导航在线播放| 中文字幕第一区综合| 一本色道a无线码一区v| 亚洲成av人片在线观看| 欧美一区二区三区电影| 国产精选一区二区三区| 国产精品电影一区二区| 日本道免费精品一区二区三区| 亚洲电影你懂得| 精品成人一区二区三区| av一区二区三区四区| 洋洋成人永久网站入口| 日韩精品一区二区三区在线播放 | av在线一区二区三区| 亚洲手机成人高清视频| 欧美精品在线观看一区二区| 韩国成人在线视频| 亚洲精品一二三| 精品日韩欧美一区二区| 成人h动漫精品| 日日夜夜一区二区| 亚洲国产精品av| 在线不卡的av|