| 
														 | 
														 | 
														 | 
														 | 
														 | 
													
													
												
													
														 | 
														 | 
														
  | 
														 | 
														 | 
														
  | 
													
													
												
													
														 | 
														 | 
														@singleton | 
														 | 
														 | 
														@singleton | 
													
													
												
													
														 | 
														 | 
														class RedisDB: | 
														 | 
														 | 
														class RedisDB: | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														    lua_delete_if_equal = None | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														    LUA_DELETE_IF_EQUAL_SCRIPT = """ | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														        local current_value = redis.call('get', KEYS[1]) | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														        if current_value and current_value == ARGV[1] then | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														            redis.call('del', KEYS[1]) | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														            return 1 | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														        end | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														        return 0 | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														    """ | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														
  | 
													
													
												
													
														 | 
														 | 
														    def __init__(self): | 
														 | 
														 | 
														    def __init__(self): | 
													
													
												
													
														 | 
														 | 
														        self.REDIS = None | 
														 | 
														 | 
														        self.REDIS = None | 
													
													
												
													
														 | 
														 | 
														        self.config = settings.REDIS | 
														 | 
														 | 
														        self.config = settings.REDIS | 
													
													
												
													
														 | 
														 | 
														        self.__open__() | 
														 | 
														 | 
														        self.__open__() | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														        self.register_scripts() | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														
  | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														    def register_scripts(self) -> None: | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														        cls = self.__class__ | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														        client = self.REDIS | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														        if cls.lua_delete_if_equal is None: | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														            cls.lua_delete_if_equal = client.register_script(cls.LUA_DELETE_IF_EQUAL_SCRIPT) | 
													
													
												
													
														 | 
														 | 
														
  | 
														 | 
														 | 
														
  | 
													
													
												
													
														 | 
														 | 
														    def __open__(self): | 
														 | 
														 | 
														    def __open__(self): | 
													
													
												
													
														 | 
														 | 
														        try: | 
														 | 
														 | 
														        try: | 
													
													
												
											
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														 | 
													
													
												
													
														 | 
														 | 
														            ) | 
														 | 
														 | 
														            ) | 
													
													
												
													
														 | 
														 | 
														        return None | 
														 | 
														 | 
														        return None | 
													
													
												
													
														 | 
														 | 
														
  | 
														 | 
														 | 
														
  | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														    def delete_if_equal(self, key: str, expected_value: str) -> bool: | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														        """ | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														        Do follwing atomically: | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														        Delete a key if its value is equals to the given one, do nothing otherwise. | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														        """ | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														        return bool(self.lua_delete_if_equal(keys=[key], args=[expected_value], client=self.REDIS)) | 
													
													
												
													
														 | 
														 | 
														
  | 
														 | 
														 | 
														
  | 
													
													
												
													
														 | 
														 | 
														REDIS_CONN = RedisDB() | 
														 | 
														 | 
														REDIS_CONN = RedisDB() | 
													
													
												
													
														 | 
														 | 
														
  | 
														 | 
														 | 
														
  | 
													
													
												
											
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														 | 
													
													
												
													
														 | 
														 | 
														        self.lock = Lock(REDIS_CONN.REDIS, lock_key, timeout=timeout, blocking_timeout=blocking_timeout) | 
														 | 
														 | 
														        self.lock = Lock(REDIS_CONN.REDIS, lock_key, timeout=timeout, blocking_timeout=blocking_timeout) | 
													
													
												
													
														 | 
														 | 
														
  | 
														 | 
														 | 
														
  | 
													
													
												
													
														 | 
														 | 
														    def acquire(self): | 
														 | 
														 | 
														    def acquire(self): | 
													
													
												
													
														 | 
														 | 
														        return self.lock.acquire() | 
														 | 
														 | 
														 | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														        REDIS_CONN.delete_if_equal(self.lock_key, self.lock_value) | 
													
													
												
													
														 | 
														 | 
														 | 
														 | 
														 | 
														        return self.lock.acquire(token=self.lock_value) | 
													
													
												
													
														 | 
														 | 
														
  | 
														 | 
														 | 
														
  | 
													
													
												
													
														 | 
														 | 
														    def release(self): | 
														 | 
														 | 
														    def release(self): | 
													
													
												
													
														 | 
														 | 
														        return self.lock.release() | 
														 | 
														 | 
														        return self.lock.release() |