做了一些有限修正
This commit is contained in:
@@ -1,18 +1,57 @@
|
||||
import redis
|
||||
import uuid
|
||||
import logging
|
||||
from django.conf import settings
|
||||
from django.core.cache import cache
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Redis客户端(延迟初始化)
|
||||
_redis_client = None
|
||||
|
||||
def _get_redis_client():
|
||||
global _redis_client
|
||||
if _redis_client is None:
|
||||
import redis
|
||||
_redis_client = redis.Redis(
|
||||
host=settings.REDIS_HOST,
|
||||
port=settings.REDIS_PORT,
|
||||
password=settings.REDIS_PASSWORD,
|
||||
db=settings.REDIS_DB_CELERY,
|
||||
decode_responses=True,
|
||||
)
|
||||
return _redis_client
|
||||
|
||||
redis_client = redis.Redis(
|
||||
host=settings.REDIS_HOST,
|
||||
port=settings.REDIS_PORT,
|
||||
password=settings.REDIS_PASSWORD,
|
||||
db=2,
|
||||
decode_responses=True
|
||||
)
|
||||
|
||||
def acquire_lock(lock_key, timeout=10):
|
||||
"""获取锁,返回是否成功"""
|
||||
return redis_client.set(lock_key, '1', nx=True, ex=timeout)
|
||||
"""获取分布式锁,返回锁标识符,失败返回None"""
|
||||
client = _get_redis_client()
|
||||
identifier = str(uuid.uuid4())
|
||||
result = client.set(lock_key, identifier, nx=True, ex=timeout)
|
||||
if result:
|
||||
logger.debug(f"获取锁成功: {lock_key}, 标识: {identifier}")
|
||||
return identifier
|
||||
return None
|
||||
|
||||
def release_lock(lock_key):
|
||||
"""释放锁"""
|
||||
redis_client.delete(lock_key)
|
||||
|
||||
def release_lock(lock_key, identifier):
|
||||
"""释放分布式锁(仅当标识符匹配时才释放)"""
|
||||
if identifier is None:
|
||||
return False
|
||||
client = _get_redis_client()
|
||||
lua_script = """
|
||||
if redis.call('get', KEYS[1]) == ARGV[1] then
|
||||
return redis.call('del', KEYS[1])
|
||||
else
|
||||
return 0
|
||||
end
|
||||
"""
|
||||
try:
|
||||
result = client.eval(lua_script, 1, lock_key, identifier)
|
||||
if result:
|
||||
logger.debug(f"释放锁成功: {lock_key}")
|
||||
else:
|
||||
logger.warning(f"释放锁失败(标识不匹配或锁已过期): {lock_key}")
|
||||
return bool(result)
|
||||
except Exception as e:
|
||||
logger.error(f"释放锁异常: {lock_key}, 错误: {e}")
|
||||
return False
|
||||
|
||||
Reference in New Issue
Block a user