zoukankan      html  css  js  c++  java
  • Redis分布式锁的python实现

    案例1:

    #!/usr/bin/env python
    # coding=utf-8
     
    import time
    import redis
     
    class RedisLock(object):
        def __init__(self, key):
            self.rdcon = redis.Redis(host='', port=6379, password="", db=1)
            self._lock = 0
            self.lock_key = "%s_dynamic_test" % key
     
        @staticmethod
        def get_lock(cls, timeout=10):
            while cls._lock != 1:
                timestamp = time.time() + timeout + 1
                cls._lock = cls.rdcon.setnx(cls.lock_key, timestamp)
           # 注意下方括号的范围
    if cls._lock == 1 or (time.time() > cls.rdcon.get(cls.lock_key) and time.time() > cls.rdcon.getset(cls.lock_key, timestamp)): print "get lock" break else: time.sleep(0.3) @staticmethod def release(cls): if time.time() < cls.rdcon.get(cls.lock_key): print "release lock" cls.rdcon.delete(cls.lock_key) def deco(cls): def _deco(func): def __deco(*args, **kwargs): print "before %s called [%s]."%(func.__name__, cls) cls.get_lock(cls) try: return func(*args, **kwargs) finally: cls.release(cls) return __deco return _deco @deco(RedisLock("112233")) def myfunc(): print "myfunc() called." time.sleep(20) if __name__ == "__main__": myfunc()

    案例2:

    import redis
    import time, datetime
    
    
    def acquire_lock(conn, lockname, identifier, expire=10):
        if conn.setnx(lockname, identifier):
            conn.expire(lockname, expire)
            return identifier
        elif not conn.ttl(lockname):
            conn.expire(lockname, expire)
    
        return False
    
    
    def release_lock(conn, lockname, identifier):
        pipe = conn.pipeline(True)
        while True:
            try:
                pipe.watch(lockname)
                if pipe.get(lockname) == identifier:
                    pipe.multi()
                    pipe.delete(lockname)
                    pipe.execute()
                    return True
                pipe.unwatch()
                break
            except redis.exceptions.WatchError:
                pass
    
        # we lost the lock
        return False
    
    
    conn = redis.Redis(host='localhost', port=6379, db=0)
    
    # 1 identifier
    # 2 False
    # 11 True
    # 22 False
    # 33 barx2
    # 44 True
    
    ret = acquire_lock(conn, "lockname", "identifier", 3)
    print "1", ret
    ret = acquire_lock(conn, "lockname", "identifier", 3)
    print "2", ret
    ret = release_lock(conn, "lockname", "identifier")
    print "11", ret
    ret = release_lock(conn, "lockname", "identifier")
    print "22", ret
    
    ret = acquire_lock(conn, "footest", "bartest", 10)
    print "33", ret

    参考文档:

    https://blog.csdn.net/weixin_39471249/article/details/79121291

    http://xiaorui.cc/2014/12/19/python%E4%BD%BF%E7%94%A8redis%E5%AE%9E%E7%8E%B0%E5%8D%8F%E5%90%8C%E6%8E%A7%E5%88%B6%E7%9A%84%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81/

    https://www.cnblogs.com/SimplifyIT/p/6691584.html

  • 相关阅读:
    Js将字符串转换成对象或数组en
    iview渲染函数
    iview中render函数监听事件
    Arduino Nano 读取ADS1100实例
    Raspberry Pi 3 安装 Lazarus 1.6.2(2017-02-09更新)
    Lazarus for Raspbian安装
    Delphi xe7 FireMonkey / Mobile (Android, iOS)生成 QR Code完整实例
    Delphi xe7 up1 调用android振动功能
    Delphi xe7 android实现透明度可以调整的对话框
    delphi XE7 在Android编译SharedActivity时出错
  • 原文地址:https://www.cnblogs.com/wangwei916797941/p/10030805.html
Copyright © 2011-2022 走看看