56 lines
1.4 KiB
Python
56 lines
1.4 KiB
Python
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
|