Redis分布式鎖

2021-08-14 06:38:58 字數 1441 閱讀 8548

原文:

翻譯:快取主要目的是加快查詢的速度,最好不要頻繁的改動。

但現在有個需求,**每個店鋪的訪問量,這個數值,是頻繁變動的,也放到redis中了。而且用分布式部署。

對這個數值的操作是讀出來,加一,再寫回去。這三步應該是原子操作,不應該多個執行緒交叉進行,否則會出現錯誤。

如果沒有分布式,**只在乙個機器上執行,那麼可以在這段**上加上synchronized關鍵字保證執行緒同步。

其實synchronized也就是將乙個物件作為鎖,執行緒要想執行**,必須先獲得鎖,同一時間只有乙個執行緒有鎖,就可以保證執行緒同步。

參考:現在是分布式系統,乙份**部署到了幾台機器上,要想實現執行緒同步,同樣需要一把鎖,這個鎖可以放到redis中。

參考:命令)

命令)如果只有一條redis伺服器,可以這樣做:

對每個店鋪設乙個鎖

set store_id current_time_mills nx px 30000
如果store_id不存在,就將它的值設為乙個唯一值,設定過期時間為30s,返回值為「ok」,獲得鎖。如果store_id已經存在,就什麼都不做,返回值為「null」,沒有獲得鎖,等待,再試。

判斷值是不是當初設的值(所有這個值要唯一),如果是刪除,如果不是什麼都不做。

如果只有乙個redis,這個redis崩潰後,同步機制就癱瘓了。多個redis保證安全。

多個redis是這樣做的:

redlock演算法:

記錄當前時間,以毫秒為單位;

以序列的方式嘗試從所有的n個例項中獲取鎖,使用的是相同的key值和相同的隨機的value值。在從每個redis例項獲取鎖時,客戶端會設定乙個連線超時,其時長相比鎖的自動釋放時間要短的多。例如,如果鎖的自動釋放時間是10s,那麼連線超時大概設定在5~50ms之間。這可以避免當redis節點關掉時,會長時間堵住客戶端,如果這個節點沒及時響應,就應該盡快轉到下個節點。

客戶端計算獲取所有鎖耗費的時長,方法是當前時間減去步驟1中的時間戳。當且僅當客戶端能從多數節點(n/2+1)中獲得鎖,並且耗費時長小於鎖的有效期時,可以認為鎖已經獲得了。

如果鎖獲得了,它的最終有效時長將重新計算為遠時長將去步驟3中獲取鎖耗費的時長;

如果鎖獲取失敗了(要麼是沒有鎖住n/2+1個節點,要麼是鎖的最終有效時長為負數),客戶端會對所有例項進行解鎖操作(即時對沒有加鎖成功的例項也一樣)

redis分布式鎖

redis分布式鎖 直接上 我寫了四個redis分布式鎖的方法,大家可以提個意見 第一種方法 redis分布式鎖 param timeout public void lock long timeout thread.sleep 100 catch exception e override publi...

Redis分布式鎖

分布式鎖一般有三種實現方式 1.資料庫樂觀鎖 2.基於redis的分布式鎖 3.基於zookeeper的分布式鎖.首先,為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 互斥性。在任意時刻,只有乙個客戶端能持有鎖。不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保...

redis分布式鎖

使用redis的setnx命令實現分布式鎖 redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多個客戶端對redis的連線並不存在競爭關係。redis的setnx命令可以方便的實現分布式鎖。setnx key value 將key的值設為value,當且僅當key不存在。如給定的...