import time from functools import wraps from django_redis import get_redis_connection class _Redis: @property def session(self): return get_redis_connection("default") @property def queue(self): return get_redis_connection("queue") @property def redis(self): return get_redis_connection("base") @property def cache(self): return get_redis_connection("cache") Redis = _Redis() def redis_lock(lock_key, timeout=10): """ 分布式锁装饰器 :param lock_key: 锁的唯一键 :param timeout: 锁的超时时间(秒) """ def decorator(func): @wraps(func) def wrapper(*args, **kwargs): end_time = time.time() + timeout while time.time() < end_time: # 尝试通过 setnx 获取锁 if Redis.redis.setnx(lock_key, "locked"): # 设置锁的超时时间 Redis.redis.expire(lock_key, timeout) try: return func(*args, **kwargs) finally: # 释放锁 Redis.redis.delete(lock_key) # 如果锁已存在,等待一段时间后重试 time.sleep(0.1) raise Exception("Could not acquire lock within the timeout") return wrapper return decorator