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