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
原文:https://www.cnblogs.com/chaojiyingxiong/p/14978949.html