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