Redis分布式鎖的應用及實現

2022-07-22 20:24:09 字數 1358 閱讀 1198

實際工作場景中可以出現多執行緒情況下多資料庫的某一條記錄進行處理操作,會導致資料出現異常,例如,庫存超賣情況,這種情況就要使用到鎖機制,可以根據不同的應用場景來使用不同的鎖。

1.使用資料庫樂觀鎖,樂觀鎖就是在資料庫表中新增version欄位,在查詢的時候將version一併查詢出來,在更新的時候通過比較version+1值與資料庫的關係來判斷有沒有其他執行緒 更新過此條記錄。注意,樂觀鎖獲取鎖失敗的處理機制由業務決定,如果在此之前有做資料庫其他更新操作,是否丟擲異常回滾資料需要由業務決定。

2.悲觀鎖,可以使用資料庫select for update 語句來實現悲觀鎖,這時候本質上是獲取行鎖中的排它鎖。(僅對innerdb引擎而言)。注意,此機制在併發情況下可能會占用過多連線池資訊。

3.redis分布式鎖

redis分布式鎖有多種實現方式,因為redis是單執行緒,可以利用自增序列來進行判斷有沒有拿鎖成功,也可以利用set nx px指令來進行。下面給出一種的實現方式。需要注意,redis客戶端版本不同,api介面不同,如果不能設定鎖的過期時間,需要自行實現獲取鎖邏輯。

/**

* @description: redis分布式鎖實現

* @createdate: 2020/4/10

*/@service

@allargsconstructor

@slf4j

public class commonmanager

/*** 通用redis分布式鎖

* @param key

* @param value

* @return 是否拿鎖成功

*/public boolean getlock(string key, string value)

//判斷鎖超時 - 防止原來的操作異常,沒有執行解鎖操作 防止死鎖

string currentvalue = stringredistemplate.opsforvalue().get(key);

//如果鎖過期,currentvalue不為空且小於當前時間

if(!stringutils.isempty(currentvalue) && long.parselong(currentvalue) < system.currenttimemillis())

}return false;

}/**

* 解鎖

* @param key

* @param value

*/public void unlock(string key,string value)

} catch (exception e) ",e);}}

}

**是通用的 

這裡給出類似的實現方案及說明 

他們寫的更細一些

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...

Redis分布式鎖原理及實現

ps 該篇博文目錄為 redis分布式鎖使用 中的 有瑕疵,為避免錯誤使用,請移步 感興趣的也可以看看到底瑕疵在哪 解決問題 多個程序多台機器,對乙個資料進行的操作的互斥。比如,下訂單和扣庫存的操作,這兩個操作必須連貫,乙個執行緒執行完這兩個操作後,下面乙個執行緒才可以介入執行,如果同時併發執行,極...

redis實現分布式鎖

隨便 系統越來越大,各功能模組除了垂直切割以外,同時也得做集群處理,那麼問題來了,在多執行緒情況下對於資源的競爭就需要乙個統一的訪問限制。以選課系統為例子,集群中各節點對課程可選數量同時操作,這裡就需要同步了,否則會導致最後選到的數量比可選的數量大,這裡我們的分布式鎖就派上用場了。利用redis來實...