02_redis分布式鎖原理

文章目錄

    • 一、redis如何實現分布式鎖
      • 1. 使用 SETNX 命令
      • 2. 設置過期時間
      • 3. 釋放鎖
      • 4. 注意事項
      • 5. 示例代碼
    • 二、Java中分布式鎖如何設置超時時間
      • 1. Redis分布式鎖
      • 2. 基于Zookeeper的分布式鎖
      • 3. 基于數據庫的分布式鎖
      • 注意事項

一、redis如何實現分布式鎖

Redis 實現分布式鎖是一種常見且高效的方式。以下是關于 Redis 實現分布式鎖的一些關鍵點和步驟:

1. 使用 SETNX 命令

Redis 提供了一個非常方便的命令 SETNX(SET if Not eXists),它可以在指定的 key 不存在時,為 key 設置一個值。這個命令天然地適合用作分布式鎖的占位符。

  • 命令格式SETNX key value
  • 返回值:如果 key 不存在,設置 key 的值為 value,返回 1。如果 key 已存在,不做任何操作,返回 0。

2. 設置過期時間

為了防止由于異常情況導致鎖無法釋放,我們通常需要給鎖設置一個過期時間。這可以通過 EXPIRE 命令來實現,或者更優雅地使用 SET 命令的擴展參數。

  • 命令格式EXPIRE key secondsSET key value EX seconds(后者同時設置值和過期時間)

3. 釋放鎖

釋放鎖的操作相對簡單,只需要刪除對應的 key 即可。但是,這里需要注意一個細節:只有當鎖的持有者(即設置鎖的進程)才能釋放鎖。因此,在刪除鎖之前,我們需要檢查鎖的值是否匹配。

  • 命令格式DEL keyLUA 腳本(為了確保原子性,通常使用 LUA 腳本來檢查并刪除鎖)

4. 注意事項

  • 時鐘漂移:在分布式系統中,不同機器的時鐘可能存在漂移。因此,設置過期時間時需要考慮這一點,避免由于時鐘漂移導致的鎖提前釋放或過期未釋放。
  • 可重入性:如果同一個進程需要多次獲取同一個鎖,那么鎖應該是可重入的。Redis 本身不支持可重入鎖,但可以通過在應用層實現一個計數器來解決這個問題。
  • 鎖續期:為了避免鎖因為操作時間過長而過期,可以在持有鎖期間定期續期。這同樣需要通過 LUA 腳本來確保原子性。
  • 死鎖檢測:雖然 Redis 分布式鎖本身不會直接導致死鎖(因為有過期時間),但應用層仍然需要處理可能出現的死鎖情況。例如,可以設置一個監控線程來檢測長時間未釋放的鎖,并進行相應的處理。

5. 示例代碼

以下是一個簡單的使用 Redis 實現分布式鎖的 Java 示例代碼(基于 Jedis 庫):

import redis.clients.jedis.Jedis;public class RedisDistributedLock {private Jedis jedis;private String lockKey;private String lockValue;private int expireTime;public RedisDistributedLock(Jedis jedis, String lockKey,

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

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

相關文章

酷派Cool20/20S/30/40手機安裝Play商店-谷歌三件套-GMS方法

酷派Cool系列主打低端市場,系統無任何GMS程序,也不支持直接開啟或者安裝谷歌服務等功能,對于國內部分經常使用谷歌服務商店的小伙伴非常不友好。涉及機型有酷派Cool20/Cool20S /30/40/50/60等旗下多個設備。好在這些機型運行的系統都是安卓11…

技術為器,服務為本:AI時代的客服價值重構

在智能化浪潮中,大語言模型的出現為客戶服務行業注入了全新動能。然而技術創新的價值不在于技術本身,而在于其賦能服務的深度與廣度。AI對于我們來說,如同發動機之于汽車,重要的不是引擎參數,而是整車帶給用戶的駕駛體…

技術創新如何賦能音視頻直播行業?

在全球音視頻直播行業的快速發展中,技術的持續創新始終是推動行業進步的核心動力。作為大牛直播SDK的開發者,我很榮幸能分享我們公司如何從產品的維度出發,精準把握市場需求,并不斷推動產品的發展,以滿足不斷變化的行業…

Linux線程池(下)(34)

文章目錄 前言一、v3版本二、單例模式概念特點簡單實現 三、其余問題STL線程安全問題智能指針線程安全問題其他鎖的概念 總結 前言 加油!!! 一、v3版本 「優化版」:從任務隊列入手,引入 「生產者消費者模型」&#xff…

Netty 實戰篇:Netty RPC 框架整合 Spring Boot,邁向工程化

本文將基于前面構建的 RPC 能力,嘗試將其與 Spring Boot 整合,借助注解、自動掃描、依賴注入等機制,打造“開箱即用”的 Netty RPC 框架,提升開發效率與工程規范。 一、為什么要整合 Spring Boot? 手動 new 實例、寫注…

Axure中繼器學習筆記

一、中繼器概述 中繼器(Axure Repeater)是Axure中的高級組件,功能類似于數據集成器,主要用于: 數據存儲與管理 數據的增刪改查操作 數據的分頁與展示控制 二、中繼器基本使用流程 數據存儲:將數據儲存在中繼器組件中 數據展…

hf-mirror斷點續傳下載權重

直接瀏覽器雙擊一個一個下載 這種方式不支持斷點續傳 dnf install git-lfs -y 下面成功跳過 LFS 權重下載只拿到 Git 元數據和 LFS 占位符文件了 GIT_LFS_SKIP_SMUDGE1 git clone https://hf-mirror.com/Tongyi-Zhiwen/QwenLong-L1-32B cd QwenLong-L1-32B git lfs install -…

【軟件安裝那些事 3 】CAD(2026 V60.7z) 安裝教程(中文簡體版)步驟完整不跳步 { 附軟件提取下載鏈接,永久有效---------百度網盤 }

通過網盤分享的文件:CAD2026 V60.7z 安裝包 中文 (永久有效) 鏈接: https://pan.baidu.com/s/122UXbOK9iGsD5Ld-lzrfAA?pwdneqd 提取碼: neqd 1、解壓完成后,打開【Setup】文件夾 2、鼠標右擊【Setup】…

RK3399 Android7.1增加應用安裝白名單機制

通過設置應用包名白名單的方式限制未授權的應用軟件安裝。 diff --git a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java index af9a533..ca…

體現物聯網環境下安全防護的緊迫性 :物聯網環境下的個人信息安全:隱憂與防護之道

摘要:隨著物聯網的飛速發展,個人信息在物聯網環境下面臨的安全風險日益嚴峻。本文深入探討了物聯網環境下個人信息泄露的主要途徑,分析了當前個人信息安全保護面臨的挑戰,并從技術、法律、企業責任和個人意識等多方面提出了相應的…

vue3 項目配置多語言支持,如何從服務端拿多語言配置

在 Vue3 項目中實現多語言支持并從服務端獲取配置,可以使用 Vue I18n 庫。在初始化階段可以發送請求獲取多語言配置或者通過本地文件加載json文件的方式,都可以實現。我這里是tauri項目,所以使用的是invoke從tauri端拿到配置文件,…

使用ssh-audit掃描ssh過期加密算法配置

使用ssh-audit掃描ssh過期加密算法配置 安裝檢查ssh的加密算法配置修改ssh的加密算法配置 安裝 # pip3安裝ssh-audit pip3 instal ssh-audit檢查ssh的加密算法配置 # 檢查ssh的配置 ssh-audit 192.168.50.149修改ssh的加密算法配置 # 查看ssh加密配置文件是否存在 ls /etc/c…

LeetCode 高頻 SQL 50 題(基礎版)之 【連接】部分 · 下

前五道題&#xff1a;LeetCode 高頻 SQL 50 題&#xff08;基礎版&#xff09;之 【連接】部分 上 題目&#xff1a;577. 員工獎金 題解&#xff1a; select r.name,b.bonus from Employee r left join Bonus b on r.empIdb.empId where b.bonus <1000 or b.bonus is nul…

[yolov11改進系列]基于yolov11引入感受野注意力卷積RFAConv的python源碼+訓練源碼

[RFAConv介紹] 1、RFAConv 在傳統卷積操作中&#xff0c;每個感受野都使用相同的卷積核參數&#xff0c;無法區分不同位置的信息差異&#xff0c;這都限制了網絡性能。此外&#xff0c;由于空間注意力以及現有空間注意力機制的局限性&#xff0c;雖然能夠突出關鍵特征&#xf…

【軟件設計】通過軟件設計提高 Flash 的擦寫次數

目錄 0. 個人簡介 && 授權須知1. Flash 和 EEROM 基本情況2. 場景要求3. 軟件設計思路4. 代碼展示4.1 flash.h4.2 flash.c 0. 個人簡介 && 授權須知 &#x1f4cb; 個人簡介 &#x1f496; 作者簡介&#xff1a;大家好&#xff0c;我是喜歡記錄零碎知識點的菜鳥…

OpenCV CUDA模塊直方圖計算------在 GPU 上計算輸入圖像的直方圖(histogram)函數histEven()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數用于在 GPU 上計算輸入圖像的直方圖&#xff08;histogram&#xff09;。它將像素值區間均勻劃分為若干個 bin&#xff08;桶&#xff09;…

龍虎榜——20250530

上證指數陽包陰&#xff0c;量能較前期下跌有放大&#xff0c;但個股跌多漲少&#xff0c;下跌超過4000個。 深證指數和上漲總體相同。 2025年5月30日龍虎榜行業方向分析 1. 醫藥&#xff08;創新藥原料藥&#xff09; 代表標的&#xff1a;華納藥廠、舒泰神、睿智醫藥、華…

HarmonyNext使用request.agent.download實現斷點下載

filedownlaod(API12) &#x1f4da;簡介 filedownload 這是一款支持大文件斷點下載的開源插件&#xff0c;退出應用程序進程殺掉以后或無網絡情況下恢復網絡后&#xff0c;可以在上次位置繼續恢復下載等 版本更新—請查看更新日志!!! 修復已知bug,demo已經更新 &#x1f4d…

nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: 80端口被占用

Nginx啟動報錯&#xff1a;nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions) 這個報錯代表80端口被占用 先查看占用80的端口 netstat -aon | findstr :80 把它殺掉&#xff0c;強…

embbeding 視頻截圖

Embedding是什么&#xff1f;有什么作用&#xff1f;是怎么得到的&#xff1f;_嗶哩嗶哩_bilibili