(面試經典問題之分布式鎖)分布式鎖的基本原理、作用以及實現

一、什么是分布式鎖

分布式鎖指的是在分布式場景中實現互斥類型的鎖。

分布式是什么意思?分布式表示運行的節點可能在不同的機器或不同的網段中,節點間通信通過socket。互斥類型是什么意思?互斥類型表示同一時刻只允許一個執行體進入臨界資源。

二、分布式鎖的特性

分布式鎖具有三大特性:

1、互斥性:同上所述,互斥性要求同一時刻只允許一個執行體進入臨界資源。具體的操作包括加鎖、解鎖、給執行體打上唯一標記。

2、鎖超時性:由于其分布式的特性(節點間需要通過網絡進行通信),而一旦某獲取了鎖的節點出現網絡故障或者進程宕機,從而無法釋放鎖,這將導致其他嘗試獲取該鎖的節點或進程一直阻塞。因此,為避免該情況的發生,需要對其設置鎖超時特性,即在某節點獲取鎖的時候設定一個時間,當超過該時間后該節點自動釋放鎖資源。

3、可用性:通俗來講就是在合理時間內得到合理的回復。具體展開來又可細分為:

  • 高可用性:確保即使部分節點故障,鎖的機制仍然能保持有效,避免系統宕機。
  • 網絡分區容忍性:能夠合理處理網絡分區情況,確保系統的正常運行。
  • 死鎖防止:通過超時機制等方式,避免死鎖的發生。
  • 性能和響應時間:保持高效的鎖操作,減少性能開銷。

三、解決了什么問題?

在分布式場景下,只允許一個節點執行某類任務。

四、分布式鎖的實現問題

常見的分布式鎖的實現方式為:

  • 基于 Redis 實現分布式鎖
  • 基于 ZooKeeper 實現分布式鎖
  • 基于 Etcd 實現分布式鎖
  • 基于 Mysql 實現分布式鎖

看到這讀者是否有產生跟我一樣的疑問:分布式鎖在層次結構上應屬于“基礎組件”層次,而redis,mysql這些屬于“中間件”層次,正常來說,中間件是在基礎組件的基礎上實現的,那為什么這里反而是基于中間件去實現基礎組件呢??

原因在于,像redis這樣的中間件,它們提供了構建分布式鎖所需的原子操作,而這些原子操作是實現分布式鎖的基礎。換句話說,redis等這些中間件,它們的某些功能(SETNX EXPIRE)可以非常有效的用于實現分布式鎖,我們基于redis實現分布式鎖就是基于這些他們自帶的功能。

這里以使用redis實現分布式鎖舉例:

import redis
import uuid
import time# 創建 Redis 連接
r = redis.StrictRedis(host='localhost', port=6379, db=0)lock_key = "my_lock"
lock_value = str(uuid.uuid4())  # 鎖的唯一標識
lock_timeout = 10  # 鎖的超時時間(秒)# 獲取鎖
def acquire_lock():# 使用 SETNX 設置鎖并設置過期時間if r.setnx(lock_key, lock_value):r.expire(lock_key, lock_timeout)return Truereturn False# 釋放鎖
def release_lock():# 只有鎖的持有者才能釋放鎖if r.get(lock_key) == lock_value:r.delete(lock_key)# 使用鎖
if acquire_lock():try:print("Lock acquired, doing work...")time.sleep(5)  # 模擬任務執行finally:release_lock()print("Lock released")
else:print("Unable to acquire lock")
  • SETNX:用于設置一個值,僅當該鍵不存在時才設置。如果 Redis 返回 True,則表示鎖成功獲取;否則,表示鎖已被其他客戶端占用。
  • expire:為鎖設置超時時間,避免死鎖發生。如果客戶端崩潰或網絡中斷,鎖會在超時后自動釋放。
  • DEL:釋放鎖時,首先需要檢查當前鎖值是否與客戶端的值匹配,防止誤刪其他客戶端的鎖。

綜上所述:?

  • Redis 本身并沒有直接提供“分布式鎖”功能,但它提供了支持實現分布式鎖所需的基礎操作(如 SETNXEXPIRE)。
  • 基于這些操作,我們可以構建一個分布式鎖系統。因此,可以說 Redis 提供了實現分布式鎖的基礎構建塊,但實現分布式鎖的功能依賴于如何使用這些操作。

?如果希望使用一個現成的分布式鎖庫,可以選擇 Redisson,它是基于 Redis 的高層次封裝,提供了直接的分布式鎖功能。

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

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

相關文章

機械硬盤與固態硬盤的區別-機械硬盤的未來在哪里?

隨著近年來固態硬盤的技術成熟和成本的下探,固態硬盤(SSD)儼然有要取代傳統機械硬盤(HDD)的趨勢,但目前單位容量下機械硬盤每GB價格相比閃存還有5-7倍的優勢,那么機械硬盤是否已經發展到極限&am…

06排序 + 查找(D1_排序(D1_基礎學習))

目錄 學習預熱:基礎知識 一、什么是排序 二、為什么要排序 三、排序的穩定性 四、排序穩定性的意義 五、排序分類方式 方式一:內外分類 方式二:比較分類 六、排序算法性能評估 1. 算法的時間復雜度 2. 算法的空間復雜度 七、知識小…

簡訊:Rust 2024 edition and v1.85.0 已發布

詳見 https://blog.rust-lang.org/2025/02/20/Rust-1.85.0.html 升級方法:rustup update stable

Python 錯誤和異常處理

目錄 try-except塊 例子: 輸出: 捕獲多種異常 例子: else和finally 例子: 輸出: 自定義異常 例子: 輸出: 好的,簡單來說,錯誤和異常處理是編程中用來處理程序…

Linux系統使用Docker部署Geoserver并做數據掛載進行地圖服務的發布和游覽

文章目錄 1、前提環境2、拉取geoserver鏡像3、創建數據掛載目錄4、 運行容器5、 測試使用(發布shp數據為服務)5.1、創建工作區5.2、添加數據存儲5.3、發布圖層5.4、服務游覽 1、前提環境 部署環境:Linux,Centos7 ,Doc…

Innovus中快速獲取timing path邏輯深度的golden腳本

在實際項目中我們經常會遇到一條timing path級數特別多,可能是一兩頁都翻不完。此時,我們大都需要手工去數這條path上到底有哪些是設計本身的邏輯,哪些是PR工具插入的buffer和inverter。 數字IC后端手把手培訓教程 | Clock Gating相關clock …

Python爬蟲實戰:從零到一構建數據采集系統

文章目錄 前言一、準備工作1.1 環境配置1.2 選擇目標網站 二、爬蟲實現步驟2.1 獲取網頁內容2.2 解析HTML2.3 數據保存 三、完整代碼示例四、優化與擴展4.1 反爬應對策略4.2 動態頁面處理4.3 數據可視化擴展 五、注意事項六、總結互動環節 前言 在大數據時代,數據采…

SpringBoot中實現限流和熔斷功能

我們將使用Java的ScheduledExecutorService來實現一個簡單的令牌桶算法(Token Bucket Algorithm),并結合一個自定義的服務類來處理第三方API調用。 1. 創建限流器 首先,創建一個簡單的限流器類: import java.util.concurrent.*;public class SimpleRateLimiter {

如何使用Python快速開發一個帶管理系統界面的網站-解析方案

如果你想用 Python 開發一個 管理系統界面 的網站,并且希望界面美觀,可以考慮以下幾個框架和庫: 1. Streamlit(快速、簡潔) 適合:數據分析、儀表盤、內部管理系統特點: 寫法簡單,類…

Git常見命令--助力開發

git常見命令: 創建初始化倉庫: git 將文件提交到暫存區 git add 文件名 將文件提交到工作區 git commit -m "注釋(例如這是發行的版本1)" 文件名 查看狀態 如果暫存區沒有文件被提交顯示: $ git status On…

Java 前后端時間格式轉換

在 Web 開發里,時間格式處理既常見又關鍵。由于前端和后端對時間的表示、處理方式存在差異,熟練掌握時間格式的轉換方法就顯得尤為重要。這篇文章會深入探討 Java 前后端時間格式轉換的相關知識,特別是 Java 時間轉換的多種方式,其…

MySQL要點總結一

大綱 一.InnoDB的內存結構和更新機制 二.InnoDB的存儲模型 三.并發事務原理 四.索引原理和索引優化 一.InnoDB的內存模型 1.SQL的執行流程 2.InnoDB的內存模型 3.Buffer Pool中的空閑緩存頁與free鏈表 4.Buffer Pool中的臟頁和flush鏈表 5.Buffer Pool通過LRU鏈表來淘…

常用網絡工具分析(ping,tcpdump等)

寫在前面 本文看下常用網絡工具。 1:ping 1.1:用途 用于檢驗網絡的連通性。 1.2:實戰 在Linux環境中執行:ping www.sina.com.cn: [rootlocalhost ~]# ping www.sina.com.cn PING spool.grid.sinaedge.com (111.…

基于Flask的第七次人口普查數據分析系統的設計與實現

【Flask】基于Flask的第七次人口普查數據分析系統的設計與實現(完整系統源碼開發筆記詳細部署教程)? 目錄 一、項目簡介二、項目界面展示三、項目視頻展示 一、項目簡介 基于Flask的人口普查可視化分析系統 二、項目界面展示 登錄/注冊 首頁/詳情 …

11.Docker 之分布式倉庫 Harbor

Docker 之分布式倉庫 Harbor Docker 之分布式倉庫 Harbor1. Harbor 組成2. 安裝 Harbor Docker 之分布式倉庫 Harbor Harbor 是一個用于存儲和分發 Docker 鏡像的企業級 Registry 服務器,由 VMware 開源,其通過添加一些企業必需的功能特性,例…

Zookeeper應用案例-分布式鎖-實現思路

以下是具體實現代碼 第一步:注冊鎖節點 第二步:獲取鎖節點,如果自己是最小的節點,就獲取權限 第三步:拿到鎖就開始自己的業務邏輯 第四步:業務邏輯好了就要釋放這把鎖 第五步:重新注冊監聽&…

Elasticsearch7.1.1 配置密碼和SSL證書

生成SSL證書 ./elasticsearch-certutil ca -out config/certs/elastic-certificates.p12 -pass 我這里沒有設置ssl證書密碼,如果需要設置密碼,需要再配置給elasticsearch 在之前的步驟中,如果我們對elastic-certificates.p12 文件配置了密碼…

Linux(ubuntu) GPU CUDA 構建Docker鏡像

一、創建Dockerfile FROM ubuntu:20.04#非交互式,以快速運行自動化任務或腳本,無需圖形界面 ENV DEBIAN_FRONTENDnoninteractive# 安裝基礎工具 RUN apt-get update && apt-get install -y \curl \wget \git \build-essential \software-proper…

藍橋杯——lcd顯示

一:復制文件 從官方參考文件中復制相關文件,Src中的lcd.c,Inc中的lcd.h,fonts.h復制到自己創建的文件中 二:lcd初始化 在lcd.h中找到四個初始化函數,將其寫到main文件中 三:寫lcd顯示函數 在…

【C++游戲開發-五子棋】

使用C開發五子棋游戲的詳細實現方案,涵蓋核心邏輯、界面設計和AI對戰功能: 1. 項目結構 FiveChess/ ├── include/ │ ├── Board.h // 棋盤類 │ ├── Player.h // 玩家類 │ ├── AI.h // AI類 │ └── Game.h // 游戲主邏輯 ├── src/ …