日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分布式锁的几种实现原理

發布時間:2023/12/9 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分布式锁的几种实现原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

實現方式 功能要求 實現難度 學習成本 運維成本
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 = ?

實現原理入下圖:

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

二,基于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,具有唯一性。

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

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

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

    具體操作流程如下圖:

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

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

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

    總結

    以上是生活随笔為你收集整理的分布式锁的几种实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 污污内射在线观看一区二区少妇 | 欧美呦呦呦| 九草视频在线观看 | 女生被男生桶 | 一级免费av| 禁欲天堂| 黄色片免费播放 | 波多野结衣av一区二区全免费观看 | 亚洲免费视频网 | www欧美com| 中文字幕乱码人妻无码久久 | 国产又黄又嫩又滑又白 | 国产精品二区一区二区aⅴ污介绍 | 欧美成人精品在线观看 | 精品毛片一区二区三区 | 亚洲激情视频在线播放 | 欧美a级在线免费观看 | 国产一区二区三区影院 | 欧美成人精品一区二区三区在线看 | 顶臀精品视频www | 日韩成人在线观看 | 九九爱精品视频 | 午夜宅男在线 | 国产欧美精品一区 | 日韩va在线| 国产欧美日韩一区 | 久久av一区二区三区亚洲 | 日韩欧美视频一区二区 | 黄色成人av | 黄污视频网站 | 亚洲一区免费在线观看 | 亚洲av高清一区二区三区 | 国产精品无码一区二区三区在线看 | 久久精品日韩 | 操老女人视频 | 日本a在线播放 | www.999av| 国产精品自拍在线观看 | 日韩av色图 | 免费级毛片 | 亚洲av无码一区东京热久久 | 爱情岛论坛自拍亚洲品质极速最新章 | 国产女主播自拍 | 日韩激情综合 | 精品国产九九 | 午夜精品三级久久久有码 | 萌白酱喷水视频 | 国产精品a级 | 成人欧美视频在线观看 | 日本一区二区三区四区视频 | 黄色av大片| 中文字幕不卡在线观看 | 男女免费视频 | 午夜成人亚洲理伦片在线观看 | 成年人免费在线视频 | 国产一区二区三区免费观看 | 麻豆视频传媒入口 | 欧美日韩国产精品综合 | 亚洲综合图片网 | 国产真实乱人偷精品 | 天天摸天天爽 | 亚洲午夜久久久久久久久久久 | 亚洲一区二区av在线 | 亚洲人成电影在线播放 | 欧美色图五月天 | 天堂俺去俺来也www久久婷婷 | 无码人妻丰满熟妇区96 | 色版视频在线观看 | 中文字幕一二三四区 | 91麻豆精品国产91 | 成人在线激情 | 国产精品外围 | 污污在线看 | 亚洲人性生活视频 | www国产亚洲精品久久麻豆 | 福利片第一页 | 日韩视频中文字幕在线观看 | 特级西西444www大精品视频免费看 | 99热这里只有精品18 | 久久久久久爱 | 尤物在线精品 | 成人在线免费视频观看 | 嫩草99 | 久久艹精品视频 | 一二三区中文字幕 | 中国女人黄色大片 | 黄视频国产 | 在线观看亚洲区 | 国产一国产二国产三 | 成人mv| 少妇扒开粉嫩小泬视频 | 浪漫樱花动漫在线观看免费 | 丰满少妇被猛烈进入 | 亚洲a∨无码无在线观看 | 五月婷婷开心 | 一区二区精品免费 | 亚洲精品激情视频 | 色姑娘av| 体内精69xxxxx |