激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Redis - 談談Redis分布式鎖的正確實現方法

談談Redis分布式鎖的正確實現方法

2019-11-27 15:40Rytia Redis

這篇文章主要給大家介紹了關于Redis分布式鎖的正確實現方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

最近在參加學校安排的實訓任務,我們小組需完成一套分布式&微服務跨境電商,雖然這題目看起來有點老套,并且隊友多是 Java 技術棧,所以我光榮(被迫)
的成為了一名前端,并順路使用 PHP 的 Swoole 幫助負責服務器端的同學編寫了幾個微服務模塊。在小組成員之間的協作中,還是出現了不少有趣的火花。

在昨天 review 隊友代碼的過程中,發現了我們組分布式鎖的寫法似乎有點問題,實現代碼如下:

加鎖部分

談談Redis分布式鎖的正確實現方法

解鎖部分

談談Redis分布式鎖的正確實現方法

主要原理是使用了 redis 的 setnx 去插入一組 key-value,其中 key 要上鎖的標識(在項目中是鎖死用戶 userId),如果上鎖失敗則返回 false。但是根據二段鎖的思路,仔細思考會存在這么一個有趣的現象:

假設微服務 A 的某個請求對 userId = 7 的用戶上鎖,則微服務 A 的這個請求可以讀取這個用戶的信息,且可以修改其內容 ;其他模塊只能讀取這個用戶的信息,無法修改其內容。
假設微服務 A 的當前請求對 userId = 7 的用戶解鎖,則所有模塊可以讀取這個用戶的信息,且可以修改其內容
如此一來:

  • 若微服務模塊 A 接收到另一個需要修改 userId = 7 的用戶 的請求時,假設這個用戶還在被鎖狀態下,這次請求可以修改它嗎?(可以,解個鎖就行)

  • 若微服務模塊 B 接收到另一個需要修改 userId = 7 的用戶 的請求時,假設這個用戶還在被鎖狀態下,這次請求可以修改它嗎?(可以,解個鎖就行)

  • 若微服務模塊 A 執行上鎖的請求中途意外崩掉,其他用戶還能修改信息嗎? (可以,解個鎖就行)

很明顯,這三點并不是我們所希望的。那么如何實現分布式鎖才是最佳實踐吶?

一個好的分布式鎖需要實現什么

  • 由某個模塊的某次請求上鎖,并且只有由這個模塊的這次請求解鎖(互斥,只能有一個微服務的某次請求持有鎖)

  • 若上鎖模塊的上鎖請求超時執行,則應自動解鎖,并還原其所做修改(容錯,就算 一個持有鎖的微服務宕機也不影響最終其他模塊的上鎖 )

我們應該怎么做

綜上所述,我們小組的分布式鎖在實現模塊互斥的情況下,忽略的一個重要問題便是“請求互斥”。我們只需要在加鎖時,key-value 的值保存為當前請求的 requestId ,解鎖時加多一次判斷,是否為同一請求即可。

那么這么修改之后,我們可以高枕無憂了嗎?

是的,夠用了。因為我們開發環境 Redis 是統一用一臺服務器上的單例,采用上述方式實現的分布式鎖并沒有什么問題,但在準備部署到生產環境下時,突然意識到一個問題:如果實現主從讀寫分離,redis 多機主從同步數據時,采用的是異步復制,也便是一個“寫”操作到我們的 reids 主庫之后,便馬上返回成功(并不會等到同步到從庫后再返回,如果這種是同步完成后再返回便是同步復制),這將會造成一個問題:

假設我們的模塊 A中 id=1 的請求上鎖成功后,沒同步到從庫前主庫被我們玩壞了(宕機),則 redis 哨兵將會從從庫中選擇出一臺新的主庫,此時若模塊 A 中 id=2 的請求重新請求加鎖,將會是成功的。

技不如人,我們只能借助搜索引擎劃水了(大霧),發現這種情況還真的有通用的解決方案:redlock。

怎么實現 Redlock 分布式安全鎖

首先 redlock 是 redis 官方文檔推薦的實現方式,本身并沒有用到主從層面的架構,采用的是多態主庫,依次去取鎖的方式。假設這里有 5 臺主庫,整體流程大致如下:

加鎖

  1. 應用層請求加鎖

  2. 依次向 5 臺 redis 服務器發送請求

  3. 若有超過半數的服務器返回加鎖成功,則完成加鎖,如果沒有則自動執行解鎖,并等待一段隨機時間后重試。(客觀原因加鎖失敗:網絡情況不好、服務器未響應等問題, 等待一段隨機時間后重試可以避開“蜂擁而進”的情況造成服務器資源占用瞬時猛增 )

  4. 如有其中任意一臺服務器已經持有該鎖,則加鎖失敗, 等待一段隨機時間后重試。 (主觀原因加鎖失敗:已經被被別人鎖上了)

解鎖

直接向 5 臺服務器發起請求即可,無論這臺服務器上是不是已經有鎖。

整體思路很簡單,但是實現起來仍有許多值得注意的地方。在向這 5 臺服務器發送加鎖請求時,由于會帶上一個過期時間以保證上文所提到的“自動解鎖(容錯性) ”,考慮到延時等原因,這 5 臺機自動解鎖的時間不完全相同,因此存在一個加

鎖時間差的問題,一般而言是這么解決的:

  • 在加鎖之前,必須在應用層(或者把分布式鎖單獨封裝成一個全局通用的微服務亦可)2. 記錄請求加鎖的時間戳 T1

  • 完成最后一臺 redis 主庫加鎖后,記錄時間戳 T2

  • 則加鎖所需時間為 T1 – T2

  • 假設資源自動解鎖的時間為 10 秒后,則資源真正可利用的時間為 10 – T1 + T2。若

可利用時間不符合預期,或者為負數,你懂的,重新來一遍吧。

如果你對鎖的過期時間有著更加嚴格的把控,可以把 T1 到第一臺服務器加鎖成功的時間單獨記錄,再在最后的可用時間上加上這段時間即可得到一個更加準確的值

現在考慮另一個問題,如果恰好某次請求的鎖保存在了三臺服務器上,其中這三臺都宕機了(怎么這么倒霉.. TAT),那此時另一個請求又來請求加鎖,豈不又回到最初我們小組所面臨的問題了?很遺憾的說,是的,在這種問題上官方文檔給出的答案是:啟用AOF持久化功能情況會得到好轉

延伸 · 閱讀

精彩推薦
  • RedisRedis如何實現數據庫讀寫分離詳解

    Redis如何實現數據庫讀寫分離詳解

    Redis的主從架構,能幫助我們實現讀多,寫少的情況,下面這篇文章主要給大家介紹了關于Redis如何實現數據庫讀寫分離的相關資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • RedisRedis的配置、啟動、操作和關閉方法

    Redis的配置、啟動、操作和關閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關于Redis全量復制與部分復制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農5812019-11-18
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現高可用的...

    李留廣10222021-08-09
  • Redisredis實現排行榜功能

    redis實現排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
主站蜘蛛池模板: 毛片在线免费播放 | 久久久久久亚洲国产精品 | 欧美日韩爱爱视频 | 国产午夜精品久久久久久免费视 | 欧美激情精品久久久久久久久久 | 狠狠操天天射 | 国产精品一区在线免费观看 | 欧美女孩videos | 日操操夜操操 | 日本道中文字幕 | 日韩精品dvd | 亚洲无av | 久草在线高清视频 | 亚洲成人福利在线观看 | 一级观看免费完整版视频 | 99精品在线观看 | 美女黄页网站免费进入 | 亚洲精品在线观看免费 | 日本在线视频二区 | 国产精品久久久久久久久久尿 | 99pron| 狠狠久久伊人中文字幕 | 国产一区二区在线观看视频 | av电影免费在线 | 国产午夜免费福利 | 欧美精品日日鲁夜夜添 | 欧美一级网 | 亚洲精品午夜国产va久久成人 | xxnxx中国18| 国产午夜精品理论片a级探花 | 免费视频www在线观看 | 91免费视频版 | 操你逼 | 亚洲无线看 | av在线免费观看不卡 | 国产精品91在线 | japanese末成年free | 欧美性受ⅹ╳╳╳黑人a性爽 | 狠狠一区二区 | 午夜视频久久 | 久草在线手机视频 |