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

  • 相关阅读:
    C#实现断点续传
    记住密码"功能的正确设计
    异常处理的性能开销
    asp.net提高程序性能的技巧(一)
    C#创建文件夹
    一个商人应遵守的22条规矩
    列不属于表--可能出现的问题总结
    存储过程无法得到返回型参数
    通用存储过程(增、删、改、查询分页)
    Mac下使用Charles抓包https接口
  • 原文地址:https://www.cnblogs.com/wangwei916797941/p/10030805.html
Copyright © 2011-2022 走看看