Redis 實現分佈式鎖

Redis 實現分佈式鎖

伴隨著數據量的幾何增長,分佈式已經成為每一個程序員處理數據必須要使用的方式,而分佈式鎖在其中扮演著非常重要的角色 分佈式鎖的實現方式有很多種,比如:

  1. 基於數據庫(mysql)實現分佈式鎖

  2. 基於緩存(redis)實現分佈式鎖

  3. 基於zookeeper實現分佈式鎖

Redis 實現分佈式鎖

伴隨著數據量的幾何增長,分佈式已經成為每一個程序員處理數據必須要使用的方式,而分佈式鎖在其中扮演著非常重要的角色 分佈式鎖的實現方式有很多種,比如:

  1. 基於數據庫(mysql)實現分佈式鎖

  2. 基於緩存(redis)實現分佈式鎖

  3. 基於zookeeper實現分佈式鎖

Redis 實現分佈式鎖

Redis使用API setnx實現分佈式鎖,setnx意思是set if not exist, 如果setnx成功返回1,說明獲得鎖,當程序執行完成後刪除鍵到達釋放鎖的目的,如果setnx失敗返回0,說明未獲得鎖,可通過循環等待繼續獲取

如果程序獲得鎖後,斷開了與Redis的連接,鎖未進行釋放,則程序發生死鎖。解決辦法是獲得鎖時,將值設置為鎖的超時時間(當前時間+鎖有效時間),其它線程獲取鎖時,判斷當前時間是否大於超時時間,如果大於先刪除鎖的鍵,再使用setnx更新對應的值。但是當兩個線程同時刪除鎖的鍵時,還是會發生併發問題,所以需使用API getset,getset在設置值的同時會先返回舊值,通過比較舊值是否小於當前時間來判斷程序是否可以獲得鎖

相關推薦

推薦中...