my-django/utils/redis.py
Kai 5d9073c19c
Some checks failed
test / build (push) Has been cancelled
test / deploy (push) Has been cancelled
test / release (push) Has been cancelled
first commit
2025-03-21 17:45:04 +08:00

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