1. 程式人生 > 其它 >python實現redis分散式鎖

python實現redis分散式鎖

 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
全世界的程式設計師們聯合起來吧!