• redis 锁的案例


    1: redis 锁 作为一种术装饰器使用

      基本逻辑:

        1:声明一个redislock类  定义生成锁和释放锁两个方法

        2:生成锁使用了一个默认值 setnx ; 如果当前时间大于 第一次锁的生成时间就重新生成(循环一次锁的时间更新一次)

        3:释放锁:在设置的时间范围timeout 内 , 就释放锁

        3:定义一个装饰器方法 参数是redis锁对象(写法值得借鉴)

      

    import time
    import redis
    
    
    class RedisLock(object):
        def __init__(self, key):
            self.rdcon = redis.Redis(host='localhost', port=6379,  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() > float(cls.rdcon.get(cls.lock_key)) and time.time() > float(cls.rdcon.getset(cls.lock_key,
                                                                                                     timestamp))):
                    print("get lock")
                    break
                else:
                    time.sleep(0.3)
    
        @staticmethod
        def release(cls):
            print('*'*10)
            print(time.time())
            print(cls.rdcon.get(cls.lock_key))
            if time.time() < float(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(5)
        print('end..')
    
    
    if __name__ == "__main__":
        myfunc()
  • 相关阅读:
    脚本化css 脚本化内联样式 脚本化css类
    jquery插件,表单验证validation plugin的使用
    跨域
    自己做的一个可以用在pc端移动端上点星星评论
    优化Jquery,提升网页加载速度
    编写灵活、稳定、高质量的 HTML 和 CSS 代码的规范
    eclipse编辑js很慢
    sortable bootstrap
    draggable,droppable
    eclipse配置
  • 原文地址:https://www.cnblogs.com/zknublx/p/11721746.html
Copyright © 2020-2023  润新知