首页 > 编程语言 > 详细

python实现redis分布式锁

时间:2021-07-06 23:19:11      阅读:31      评论:0      收藏:0      [点我收藏+]
 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

 

python实现redis分布式锁

原文:https://www.cnblogs.com/chaojiyingxiong/p/14978949.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!