分布式鎖的幾種實現原理

分布式鎖主流有三種模式:

實現方式 功能要求 實現難度 學習成本 運維成本
MySQL 的方案借助表鎖/行鎖實現 滿足基本要求 不難 熟悉 小量OK、大量影響現有業務、1主多從架構,不方便擴容
通過 ZK 創建數據節點的方式實現 滿足要求 熟悉 ZK API 即可 需要學習 重,需要堆機器,有跨機房請求
Redis 使用 setnxex 基本要求 不難 熟悉 擴容方便、現有服務

MySQL 單主架構,寫都會到 master,有瓶頸。ZK 的方式需要自己搭建、運維,而且需要堆機器,利用率不高。最終采用了 Redis 來實現,流量/存儲都可以擴容,運維也不需要自己。

一、基于Mysql實現分布式鎖 (樂觀鎖)

Mysql實現分布式鎖 主要是基于數據庫的排他鎖(也叫行級排他鎖), 采用樂觀鎖的方式去做。
我們可以通過一個update語句是否成功來判斷線程搶占鎖是否成功,比如如下sql語句:

CREATE TABLE `t_schedule_cluster` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '@cname:主鍵',`execute` int(1) NOT NULL COMMENT '@cname:執行狀態',`version` int(11) NOT NULL COMMENT '@cname:版本號 ',`task_name` varchar(128) NOT NULL COMMENT '@cname:任務名稱',`execute_ip` varchar(32) DEFAULT NULL COMMENT '@cname:執行ip ',`update_time` datetime DEFAULT NULL COMMENT '@cname:修改時間',PRIMARY KEY (`id`),KEY `Index_series_id` (`execute`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='@cname:多機定時任務調度';

爭搶鎖的sql語句:
update t_schedule_cluster set execute = 1 version = ?, execute_ip = ?, update_time = ? where task_name = ? and version = ?

實現原理入下圖:
2f738bd4b31c8701f38133612a7f9e2f0708ff06.jpg

但是數據庫的性能有限,如果在高并發的情況下會頻發的訪問數據庫,對數據庫會造成較大的壓力。

二,基于redis的分布式鎖實現

基于Redis實現的分布式鎖其實很簡單,底層就是使用redis的setnx指令來實現的加鎖,我們來看看官方對setnx的定義:
SETNX key value
將 key 的值設為 value ,當且僅當 key 不存在。
若給定的 key 已經存在,則 SETNX 不做任何動作。
SETNX 是『SET if Not eXists』(如果不存在,則 SET)的簡寫。
返回值:
設置成功,返回 1 。
設置失敗,返回 0 。

redis> EXISTS job # job 不存在
(integer) 0
redis> SETNX job "programmer" # job 設置成功
(integer) 1
redis> SETNX job "code-farmer" # 嘗試覆蓋 job ,失敗
(integer) 0
redis> GET job # 沒有被覆蓋
"programmer"

以上內容來自于:http://redisdoc.com/string/setnx.html

既然setnx這么強大,那么我們是不是可以高枕無憂直接使用了? 當然了,我們還要考慮一些極端場景。

2.1 死鎖問題

既然設置了value值,那么我們肯定會想到過期時間,那么就需要再使用setnx指令后繼續使用expire指令。但是這兩部操作必定不是原子性的,如果執行expire失敗怎么辦?
其實Redis官方也考慮到了這個問題,在Redis2.8 之后,官方執行setnx 和 expire命令一起使用了。如下:
SET lock_key lock_value NX PX 30000
其中:
1.lock_key:即鎖名稱,這個名稱應是公開的,在分布式環境中,對于某一確定的公共資源,所有爭用方(客戶端)都應該知道對應鎖的名字。對于 Redis 而言,lock_name 就是 key-value 中的 key,具有唯一性。

  1. lock_value:是由客戶端生成的一個隨機字符串,它要保證在足夠長的一段時間內在所有客戶端的所有獲取鎖的請求中都是唯一的,用于唯一標識鎖的持有者。
  2. NX 表示只有當 lock_key(key) 不存在的時候才能 SET 成功,從而保證只有一個客戶端能獲得鎖,而其它客戶端在鎖被釋放之前都無法獲得鎖。
  3. PX 30000 表示這個鎖節點有一個 30 秒的自動過期時間(目的是為了防止持有鎖的客戶端故障后,無法主動釋放鎖而導致死鎖,因此要求鎖的持有者必須在過期時間之內執行完相關操作并釋放鎖)。
    具體操作如下圖:
    80cb39dbb6fd5266d905cf93a618972bd407360e.jpg

2.2 鎖自動過期存在的隱患

例如我們有兩個線程A、B,此時線程A搶到了鎖,且設置自動過期時間為10s鐘,因為系統其他原因導致系統A發生阻塞。而此刻10s鐘后鎖自動過期,線程C獲取到了同一個資源的鎖,線程A從阻塞中恢復,認為自己仍然持有鎖,繼續操作同一資源。這樣就使得加鎖的互斥性失效了。

解決方案:
我們在上面set lock_key lock_value 時講過,lock_value是一個隨機生成的字符串,在每次獲取鎖的時候都會重新生成。那么我們在執行真正的業務邏輯(類似于和db進行交互的操作,同一時刻只能一個線程操作的情況)時,判斷當前生成的隨機字符串和lock_value是否一致,如果不一致則說明redis中的lock_value被修改過,也就說明此刻鎖已經被其他線程所占有。

具體操作流程如下圖:
08f790529822720e6ce3057d76cb0a46f21fab0c.jpg

主要使用的就是這兩種方案,在這里只是做個簡單總結,其實還有其他一些可以實現分布式鎖,根據自己項目本身情況選擇最合適的。
另外 已經Redis也有開源的框架可以很好地支持基于Redis的分布式鎖,這里推薦一個:Redission https://github.com/redisson/redisson

PS:2019 繼續努力加油學習更多知識,讓自己在技術這條道路上越走越遠!

轉載于:https://www.cnblogs.com/wang-meng/p/10226618.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/278508.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278508.shtml
英文地址,請注明出處:http://en.pswp.cn/news/278508.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何破解您忘記的Windows密碼

Here at How-To Geek, we’ve covered many different ways to reset your password for Windows—but what if you can’t reset your password? Or what if you’re using drive encryption that would wipe out your files if you changed the password? It’s time to cr…

sql語句練習50題(Mysql版)

表名和字段–1.學生表Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別–2.課程表Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號–3.教師表Teacher(t_id,t_name) –教師編號,教師姓名–4.成績表Score(s_id,c_id,s_score) –學生編號…

OpenCV3 識別圖中表格-JAVA 實現

2019獨角獸企業重金招聘Python工程師標準>>> 關于 JAVA 學習 OpenCV 的內容,函數講解。內容我均整理在 GitHubd的OpenCV3-Study-JAVA OpenCV 3 識別圖中表格-Java 實現 1. 說明 網上大部分資料,都是針對 C的,python、java 的例子太…

內存泄露 體現在哪個數字上_Microsoft剛剛泄漏了一個新的開始菜單。 你喜歡哪個?...

內存泄露 體現在哪個數字上NTAuthority on TwitterTwitter上的NTAuthorityMicrosoft messed up today, releasing an internal build of Windows 10 to Windows Insiders. This build was never meant to see the light of day, but it features a new Start menu design—with…

簡述 Spring Cloud 是什么

很多同學都了解了Spring ,了解了 Spring Boot, 但對于 Spring Cloud 是什么還是比較懵逼的。 本文帶你簡單的了解下,什么是Spring Cloud。 Spring Cloud 是什么 從字面理解,Spring Cloud 就是致力于分布式系統、云服務的框架。 Spring Cloud …

js DOM節點

元素節點 4種方式獲取 var oDiv document.getElementById("box");        //通過Id獲取元素var oDiv document.getElementsByClassName("div")[0];   //通過類名獲取元素  --》[ 0 ] 必須寫var oDiv document.getElementsByTagName("…

python web scraping

2019獨角獸企業重金招聘Python工程師標準>>> 最近在看《Web Scraping with Python》,借此來熟悉Python2.7如何開始編程。 發現書上主要使用的 http://example.webscraping.com/ 網站有部分變化,書中的代碼有點無法對照使用,因此稍…

傅里葉變換的物理意義

用三角函數表示周期函數 傅里葉的相關理論始于下面假設:對于周期為1的信號$f(t)$,可以由不同頻率的三角函數組成, $f(t) \frac{a_0}{2}\displaystyle{\sum^{\infty}_{k1}}(a_kcos(2\pi kt)b_ksin(2\pi kt))$ 組成的基礎波形為一個信號對&…

天貓年度總結

2019獨角獸企業重金招聘Python工程師標準>>> 魯大師天貓工作總結 時間:2017年10月22日-1月30日 1、對代理商進行6大區域的劃分管理,有專門的客服指導。 2、加班費申請和車費報銷制度。 3、簡化了特權訂金2階段改成1階段,極大的方便…

因特網使用期限_Internet死亡時使用PC的其他方式

因特網使用期限Nothing is more annoying than getting your Internet connection shut down, due to weather, or perhaps forgetting to pay your bill. Let’s take a look at some ways you can be productive and entertained without the Internet. 沒有什么比由于天氣原…

【基礎操作】線性基詳解

線性基是一個奇妙的集合(我摘的原話) 這里以非 $OI$ 的角度介紹了線性基 基礎部分 模板題 給你 $n$ 個數的集合,讓你選出任意多個不重復的數,使得它們的異或和最大。 線性基是什么 我們稱集合 $B$ 是集合 $S$ 的線性基&#xff0c…

節省大量教科書的三種潛在風險方法

Photo by Sultry 攝影: Sultry You can always save money on textbooks by buying online, going ebook, or renting what you need. But there are riskier ways to save a buck that just may yield even greater payoff, such as getting the international or …

解決內網搭建本地yum倉庫。

2019獨角獸企業重金招聘Python工程師標準>>> 一、使用iso鏡像搭建本地yum倉庫; 1、掛載鏡像到/mnt目錄下: [rootDasoncheng ~]# mount /dev/cdrom /mnt mount: /dev/sr0 is write-protected, mounting read-only2、備份配置文件,并…

通過用 .NET 生成自定義窗體設計器來定制應用程序

本文討論: ? 設計時環境基本原理 ? 窗體設計器體系結構 ? Visual Studio .NET 中窗體設計器的實現 ? 為自己的應用程序編寫窗體設計器而需要實現的服務 在很多年中,MFC 一直是生成基于 Windows? 的應用程序的流行框架。MFC 包含一個可以使窗體生成、…

airdrop 是 藍牙嗎_您可以在Windows PC或Android手機上使用AirDrop嗎?

airdrop 是 藍牙嗎Aleksey Khilko/Shutterstock.comAleksey Khilko / Shutterstock.comApple’s AirDrop is a convenient way to send photos, files, links, and other data between devices. AirDrop only works on Macs, iPhones, and iPads, but similar solutions are av…

vue加百度統計代碼(親測有效)

申請百度統計后,會得到一段JS代碼,需要插入到每個網頁中去,在Vue.js項目首先想到的可能就是,把統計代碼插入到index.html入口文件中,這樣就全局插入,每個頁面就都有了;這樣做就涉及到一個問題,V…

如何將Rant變成生產力電動工具

Ranting doesn’t have to be a waste of breathe and time. You can turn a rant into a powerful tool for productivity. Learn how to transform your sense of victim hood and irritability to self-empowerment and mental clarity. 狂歡不必浪費呼吸和時間。 您可以將r…

linux 下使用 curl post

命令: curl -X POST -d /etc/lazada/lazada_tracking.txt http://localhost:8080/booking/rs/LazadaService/post --header "Content-Type:application/json" -d 后臺 / : post 的 body 體 eg: {"a…

服務治理·理論篇(一)

0、故事主角 呱呱樂 是一家互聯網金融公司。主營現金貸、p2p理財、消費分期業務。 公司現有技術人員800名,系統極其龐雜,每日穩定處理25w左右的訂單量,有搶購活動時,系統的QPS(Query Per Second)峰值達到了3w。 系統雖然龐雜&…

2019-1-92.4G射頻芯片培訓資料

2019-1-92.4G射頻芯片培訓資料 培訓 RF 小書匠 歡迎走進zozo的學習之旅。 2.4G芯片選型2.4G芯片開發Q&A2.4G芯片選型 芯片類型 soc防盜標簽2.4G無線芯片選型發射器收發器LSD2RF-1600-V1.1 調制方式射頻基礎 2.4G芯片開發 原理圖 發射優先收發均衡PCB topbottomlayout規…