redis學習:分布式鎖
分布式鎖本質(zhì)是占茅坑 當別人也想上廁所 但發(fā)現(xiàn)坑位已經(jīng)被占了 只能等你拉好
redis一般使用setnx來占坑 del去釋放 。但如果在del之前 執(zhí)行的邏輯出錯了 可能導致del無法被調(diào)用 產(chǎn)生死鎖。為了應對這樣的問題 一般會設置個expire過期時間 就算del沒被調(diào)用 在一定時間后也會釋放鎖。但setnx expire這個不是原子性的 如果在expire之前出故障線程掛了 那么也會有死鎖 且expire要依賴setnx來執(zhí)行 所以也不能使用事務來執(zhí)行 但幸好redis已經(jīng)把這個問題解決了 set ex nx就是一條原子指令 把setnx和expire結合在一起
超時問題:分布式鎖解決不了超時問題 當一個業(yè)務執(zhí)行時間太長 以至于超過expire過期時間 那么就可能產(chǎn)生問題。如線程1執(zhí)行時間過長 導致鎖提前釋放 那么線程2就會獲得鎖并開始執(zhí)行 如果此時線程1完成 并執(zhí)行del 那么又會把鎖釋放 讓線程3也開始獲得鎖并執(zhí)行 這可能會帶來一些問題。為了解決線程1在鎖過期之后又del鎖 可以設置隨機變量 set key random(隨機產(chǎn)生的數(shù)字) 每次在要del的時候檢查一下這個key的值與這個線程產(chǎn)生的隨機數(shù)是否匹配 整個檢查加刪除使用lua腳本來實現(xiàn) 以確保原子性 若不使用 則在檢查完之后 正好過期 其他客戶端搶占鎖 此時又會把別人的鎖給刪了。