Redis實戰(8) -- 分布式鎖Redission底層機制

介紹

Redisson 是基于 Redis 實現的 Java 駐內存數據網格(In-Memory Data Grid),提供了分布式和可擴展的 Java 數據結構,如分布式鎖、分布式集合等。

注意如果需要重新實現redission,需要重新設置RedissionClient配置類

底層主要機制

(1)基于LUA腳本進行實現原子性

由于redission的鎖操作是需要原子性支持,例如加鎖,解鎖等,所以其底層實現是使用LUA腳本進行執行。

例如:

if?(redis.call('exists',?KEYS[1])?==?0)?thenredis.call('hincrby',?KEYS[1],?ARGV[2],?1);redis.call('pexpire',?KEYS[1],?ARGV[1]);return?nil;end;if?(redis.call('hexists',?KEYS[1],?ARGV[2])?==?1)?thenredis.call('hincrby',?KEYS[1],?ARGV[2],?1);redis.call('pexpire',?KEYS[1],?ARGV[1]);return?nil;end;return?redis.call('pttl',?KEYS[1]);

以上代碼是redission中實現加鎖代碼,主要流程是:

1)檢查鎖是否存在,不存在則創建且設置對應過期時間

2)如果鎖已經存在,則如果是屬于當前線程(通過ARGV[2]進行判斷是否為當前線程ID),是則增加重入次數

3)發現不是當前線程ID,表明其他人拿到鎖,則返回當前鎖被持有的剩余時間

(2)鎖可重入性設置

同一個線程可以獲取同一把鎖,通過HSET進行存儲鎖的持有線程和重入的次數

(3)看門狗自動續期機制

看門狗機制是應對由于操作未執行完畢,但是鎖快到期情況,因為人為不好判斷當前操作需要多久執行,所以使用看門狗機制,實現守護線程自動判斷。如果沒有設置對應的鎖檢查時間,則默認是10s自動檢查是否需要續期,而默認續期時間是30s。

實現代碼:

private?void?scheduleExpirationRenewal(final?long?threadId)?{Timeout?task =?commandExecutor.getConnectionManager().newTimeout(new?TimerTask()?{@Overridepublic?void?run(Timeout?timeout)?throws?Exception?{// 執行Lua腳本續期鎖renewExpirationAsync(threadId);}},?internalLockLeaseTime /?3,?TimeUnit.MILLISECONDS);}

而續期對象則可以實現自定義。自定義看門狗鎖:

核心續期操作是:

Config.setLockWatchhdogTimeout(60_000); ?//設置時間1分鐘

(4)聯鎖和紅鎖

Redission實現了MultiLock聯鎖和RedLock紅鎖,聯鎖就是多個獨立鎖的組合,必須全部獲取成功才算加鎖成功。而紅鎖是用于集群環境下,基于過半節點成功才算鎖的設置成功,用于緩解單節點故障問題。

單節點故障:由于在主節點加鎖,但是同步到從節點時候,主節點宕機,導致數據沒有同步到從節點,從節點此時沒有鎖,所以會導致相關問題。

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

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

相關文章

Linux基礎測試

linux基礎測試 一、環境準備 基礎環境信息 登錄用戶:root(初始密碼:redhat) 虛擬機啟動:登錄后執行 virt-manager,右鍵啟動 node1 和 node2 虛擬機 node1 信息:root 密碼為 redhat&#xf…

Linux中Docker Swarm實踐

一、部署前后分離使用你自己的自定義鏡像部署多個副本所有副本使用相同的配置和邏輯Nginx 做反向代理統一入口外部訪問形式如:http://your-domain/api/xxx1.1 建立私庫鏡像已構建并推送到可訪問的鏡像倉庫啟動 Docker Registry 容器docker run -d -p 5000:5000 --re…

Dash 中的 dcc.Clipboard 組件詳解:實現一鍵復制功能

dcc.Clipboard 是 Dash 核心組件庫中的一個實用工具,允許用戶將指定內容一鍵復制到系統剪貼板,極大提升用戶體驗。本文將深入解析該組件的用法、特性和實際應用場景。 一、組件核心功能與價值 dcc.Clipboard 解決了 Web 應用中的關鍵痛點: 簡…

初識C++類的6個默認成員函數

目錄 一、初始化和清理 二、拷貝復制 三、取地址重載 四、重要說明 五、注意事項 六、示例代碼 在C中,當一個類沒有顯式定義某些成員函數時,編譯器會自動生成6個默認成員函數。這些函數可以分為以下幾類: 一、初始化和清理 1、構造函數…

Spring事務失效場景?

題目詳細答案Spring事務失效的場景主要有以下幾種。非public方法使用Transactional場景描述:Spring事務管理是基于AOP實現的,而AOP對于JDK動態代理或CGLib動態代理只會代理public方法。如果事務方法的訪問修飾符為非public,SpringAOP無法正確…

1.電動汽車動力電池系統技術介紹與分類

1.電動汽車動力電池系統技術介紹與分類 1.1 電動汽車發展的三個 “黃金時代” 第一個黃金時代(19 世紀末 - 20 世紀初) 技術基礎:鉛酸蓄電池發明(1859 年),推動電動三輪車(1873 年)、…

調用阿里云-阿里云百煉 AI

相關文檔:大模型服務平臺百煉控制臺 多輪對話:通義千問模型的多輪對話_大模型服務平臺百煉(Model Studio)-阿里云幫助中心 創建知識庫:大模型服務平臺百煉控制臺 創建智能體:大模型服務平臺百煉控制臺 點擊智能體發布后&#x…

Apache Flink:從實時數據分析到實時AI

引言歡迎踏上這段深入了解 Apache Flink 演進歷程的旅程,Apache Flink 是一項重新定義了實時數據處理的技術。本博客文章基于王峰(阿里云開放數據平臺負責人、Apache Flink Committer)在 2025 年 Flink Forward Asia 新加坡大會上的演講內容編…

oelove奧壹新版v11.7旗艦版婚戀系統微信原生小程序源碼上架容易遇到的幾個坑,避免遺漏參數白屏顯示等問題

oelove和 金媒我都用過一段時間,其中oelove 用的時間較多,也比較了解這個系統,這個系統比較不錯的就是小程序是原生的(完全遵循微信開發者平臺規則非Uniapp)開發的,原生小程序的特點就是兼容性好&#xff0…

行為模式-模板方法模式

定義:Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithms structure.(定義一個操作中的算法的框架&a…

Java集合遍歷練習題

以下是10道難度遞增的集合遍歷練習題,涵蓋List、Set、Map的各種遍歷方式,包含解題思路、代碼實現和輸出結果: 練習題1:基礎遍歷 - ArrayList的for-each遍歷 題目:創建一個存儲5個字符串的ArrayList(元素為&…

深度學習·ZegclipClip-RC

Zegclip 獲取圖像的特殊編碼:使用prompt tuning的技術,目的是減少過擬合和計算量。調整文本編碼:使用RD關系描述符,將每一個文本對應的[cls] token和圖像對應的[cls] token作哈密頓積,最后文本[cls]token形式化任務 文…

Taro 擴展 API 深度解析與實戰指南

Taro 擴展 API 深度解析與實戰指南 Taro 作為一款優秀的多端開發框架,提供了一系列強大的擴展 API,這些 API 極大地提升了開發效率和應用的可維護性。本文將深入解析 Taro 的擴展 API,并根據其功能特性進行分類講解,幫助開發者更…

容器之王--Docker的部署及基本操作演練

1.2 部署docker 1.2.1 容器工作方法1.2.2 部署第一個容器 官方站點:https://docs.docker.com/ 1.2.2.1 配置軟件倉庫 ]# cd /etc/yum.repos.d ]# vim docker.repo [docker] name docker-ce baseurl https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/sta…

VFTO與局部放電-高壓設備絕緣系統的雙重挑戰與防護策略

目錄 引言VFTO的定義與形成機理VFTO對高壓設備絕緣系統的影響局部放電的危害與機制VFTO與局部放電的關聯性分析檢測與監測技術防護與抑制措施未來技術發展趨勢結論與展望引言 在現代電力系統中,超快速暫態過電壓(Very Fast Transient Overvoltage, VFTO&…

Windows下Rust編碼實現MP4點播服務器

Rust編碼可以實現眾多簡潔、可靠、高效的應用,但語法邏輯要求嚴格,尤其是依賴庫的選擇調用,需要耐心堅持“推敲”。借助DeepSeek并反復編程調試和問答改進,可以最終得到完整有效的Rust編碼。下面分享Windows下Rust編碼實現MP4點播…

ubuntu-相關指令

1、串口1.1確認在系統中檢查設備是否正常加載,在終端輸入以下命令:way1:ll /dev | grep ttyUSB(ll是LL的小寫) way2:ll /dev | grep ttyACM way3:ll /dev | grep ttyCH343USB&#…

docker容器臨時文件去除,服務器容量空間

概述: 接到告警提醒,服務器容量不足,去查看了一下,發現確實100g左右容量已基本用完;分析: 1)查看根目錄下哪些文件夾占用容量較大 使用命令“ du -ah --max-depth1 / ” 查看目標目錄下所有文件…

損耗對信號質量的影響

損耗通常分為介質損耗與導體損耗:介質損耗:介質被施加電場后介質內部帶電粒子在外加電場的作用力下進行微小移動介質損耗與頻率成正比導體損耗:導體由于存在電阻,在有電流流過時產生的熱量造成的損耗為導體損耗。同時,…

【42】【OpenCV C++】 計算圖像某一列像素方差 或 某一行像素的方差;

文章目錄1 要使用到的函數 和 原理1.1 cv::meanStdDev 函數詳解——計算均值和標準差1 .2 方差的通俗解釋2 代碼實現3 問題3.1 入口參數const cv::Mat& img 和 const cv::Mat img區別項目要求:C OPenCV 中 圖像img ,當 string ROIdirection “H”時,…