redis鎖處理并發(fā)問題

redis鎖處理高并發(fā)問題十分常見,使用的時(shí)候常見有幾種錯(cuò)誤,和對(duì)應(yīng)的解決辦法,在此進(jìn)行自己的總結(jié)和整理。

set方式

setnx方式

setnx+getset方式

set方式?

作為redis小白,一開始能想到的使用redis加鎖的方式就是set。?

加鎖:redis中set一個(gè)值,set(lock,1);?

并發(fā)處理:其他線程必須拿到這個(gè)值,才可以往下進(jìn)行,否則等待。

釋放鎖:執(zhí)行完業(yè)務(wù)代碼之后,釋放redis鎖,jedis.del(lock)?

防止死鎖:set(lock,1) —>3秒后未釋放,則自動(dòng)釋放setex(lock, 3, 1)?

問題:高并發(fā)情況下,進(jìn)程同時(shí)獲取鎖狀態(tài)為null,同時(shí)設(shè)置,鎖之間相互覆蓋,但是倆進(jìn)程仍在并發(fā)執(zhí)行業(yè)務(wù)代碼。?

setnx方式?

后來發(fā)現(xiàn)有setnx的原子操作命令,鎖存在不能設(shè)置值,返回0;鎖不存在,則設(shè)置鎖,返回1;?

加鎖:jedis.setnx(lock, 1)?

并發(fā)處理:

釋放鎖:執(zhí)行完業(yè)務(wù)代碼之后,釋放redis鎖,jedis.del(lock)?

問題:當(dāng)進(jìn)程執(zhí)行出現(xiàn)問題,鎖未釋放,則其他進(jìn)程永遠(yuǎn)處于阻塞狀態(tài),出現(xiàn)死鎖。?

防止死鎖:加鎖時(shí)帶上時(shí)間戳,setnx(lock, 時(shí)間戳+超時(shí)時(shí)間)

問題:當(dāng)倆進(jìn)程同時(shí)讀到發(fā)現(xiàn)鎖超時(shí),都去釋放鎖,相互覆蓋,則倆進(jìn)程同時(shí)獲得鎖,仍并發(fā)執(zhí)行業(yè)務(wù)代碼。?

setnx+getset方式?

為解決上面的問題,可以使用getset命令,getset設(shè)置鍵值,并返回原來的鍵值。?

加鎖:setnx(lock, 時(shí)間戳+超時(shí)時(shí)間)?

解決并發(fā):


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容