python實現redis分散式鎖
阿新 • • 發佈:2021-07-06
1 import time 2 import redis 3 from redis.exceptions import WatchError 4 5 6 class RedisUtil(): 7 def __init__(self): 8 self.redis = redis.Redis(host="redis賬戶url", 9 port=6379, 10 password="你的redis密碼", 11 decode_responses=True)全世界的程式設計師們聯合起來吧!12 self.online_set_name = "palm_online_devices" 13 14 # 獲取鎖 15 def acquire_lock(self, key, val, acquire_time=60, time_out=60): 16 start_time = time.time() 17 # 阻塞等待,輪詢去獲取鎖,獲取不到,輪詢等待,直到拿到鎖或者超時 18 while True: 19 if time.time() - start_time > acquire_time:20 return False 21 # 用setnx實現分散式鎖,當key存在時候,setnx不做任何動作,如果key不存在,將value值設定為val 22 # 如果 SETNX 返回1,說明該程序獲得鎖,SETNX將鍵 lock.foo 的值設定為鎖的超時時間(當前時間 + 鎖的有效時間)。 23 # 如果 SETNX 返回0,說明其他程序已經獲得了鎖,程序不能進入臨界區。程序可以在一個迴圈中不斷地嘗試 SETNX 操作,以獲得鎖 24 if self.redis.setnx(name=key, value=val):25 # 設定key的時長為60秒,如果超過60秒,key銷燬 26 self.redis.expire(key, time_out) 27 return True 28 29 # 釋放鎖 30 def release_lock(self, key, val): 31 pip = self.redis.pipeline(True) 32 while True: 33 try: 34 pip.watch(key) 35 lock_value = self.redis.get(key) 36 if not lock_value: 37 return True 38 if lock_value == val: 39 pip.multi() 40 pip.delete(key) 41 pip.execute() 42 return True 43 pip.unwatch() 44 break 45 except WatchError: 46 pass 47 return False