zoukankan      html  css  js  c++  java
  • 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
    全世界的程序员们联合起来吧!
  • 相关阅读:
    源码搭建zabbix平台
    如何用手机远程控制自己的电脑
    nginx无法启动问题详解
    在<script>中加HTML注释标签<!-- --> 的原因?
    UNICODE,GBK,UTF-8区别
    dart学习一 windows环境安装dart环境
    Git使用方法(精心整理,绝对够用)
    非常好用的jQuery表格排序插件
    Redis NOAUTH Authentication required.
    Docker概念、安装
  • 原文地址:https://www.cnblogs.com/chaojiyingxiong/p/14978949.html
Copyright © 2011-2022 走看看