redis 分布式鎖的缺陷:1、客戶端長時間阻塞導(dǎo)致鎖失效問題;2、redis服務(wù)器時鐘漂移問題;3、單點實例安全問題。客戶端長時間阻塞導(dǎo)致鎖失效問題是指,某個客戶端得到了鎖,因為某些原因?qū)е麻L時間阻塞,然后業(yè)務(wù)程序還沒執(zhí)行完鎖就過期了。
一、redis 分布式鎖的缺陷
1、客戶端長時間阻塞導(dǎo)致鎖失效問題
客戶端1得到了鎖,因為網(wǎng)絡(luò)問題或者GC等原因?qū)е麻L時間阻塞,然后業(yè)務(wù)程序還沒執(zhí)行完鎖就過期了,這時候客戶端2也能正常拿到鎖,可能會導(dǎo)致線程安全的問題。
2、redis服務(wù)器時鐘漂移問題
如果redis服務(wù)器的機器時鐘發(fā)生了向前跳躍,就會導(dǎo)致這個key過早超時失效,比如說客戶端1拿到鎖后,key的過期時間是12:02分,但redis服務(wù)器本身的時鐘比客戶端快了2分鐘,導(dǎo)致key在12:00的時候就失效了,這時候,如果客戶端1還沒有釋放鎖的話,就可能導(dǎo)致多個客戶端同時持有同一把鎖的問題。
3、單點實例安全問題
如果redis是單master模式的,當這臺機宕機的時候,那么所有的客戶端都獲取不到鎖了,為了提高可用性,可能就會給這個master加一個slave,但是因為redis的主從同步是異步進行的,可能會出現(xiàn)客戶端1設(shè)置完鎖后,master掛掉,slave提升為master,因為異步復(fù)制的特性,客戶端1設(shè)置的鎖丟失了,這時候客戶端2設(shè)置鎖也能夠成功,導(dǎo)致客戶端1和客戶端2同時擁有鎖。
二、分布式鎖需要滿足的特性
· 互斥性:在任何時刻,對于同一條數(shù)據(jù),只有一臺應(yīng)用可以獲取到分布式鎖;
· 高可用性:在分布式場景下,一小部分服務(wù)器宕機不影響正常使用,這種情況就需要將提供分布式鎖的服務(wù)以集群的方式部署;
· 防止鎖超時:如果客戶端沒有主動釋放鎖,服務(wù)器會在一段時間之后自動釋放鎖,防止客戶端宕機或者網(wǎng)絡(luò)不可達時產(chǎn)生死鎖;
· 獨占性:加鎖解鎖必須由同一臺服務(wù)器進行,也就是鎖的持有者才可以釋放鎖,不能出現(xiàn)你加的鎖,別人給你解鎖了。