基于redis秒杀场景的分布式锁实现(包含全局唯一id实现)
import redis
import uuid
class RedisDistributedLock:
def __init__(self, redis_conn):
self.redis_conn = redis_conn
self.lock_key = "distributed_lock"
def acquire_lock(self, acquire_timeout=10, lock_timeout=10):
identifier = str(uuid.uuid4())
end = time.time() + acquire_timeout
while time.time() < end:
if self.redis_conn.set(self.lock_key, identifier, ex=lock_timeout, nx=True):
return identifier
time.sleep(0.001)
return False
def release_lock(self, identifier):
while True:
with self.redis_conn.pipeline() as pipe:
try:
pipe.watch(self.lock_key)
if pipe.get(self.lock_key) == identifier:
pipe.multi()
pipe.delete(self.lock_key)
pipe.execute()
return True
pipe.unwatch()
break
except redis.exceptions.WatchError:
pass
return False
# 使用示例
redis_conn = redis.StrictRedis(host='localhost', port=6379, db=0)
lock = RedisDistributedLock(redis_conn)
identifier = lock.acquire_lock()
if identifier:
try:
# 这里执行你的业务逻辑
pass
finally:
lock.release_lock(identifier)
else:
# 未能获得锁,执行备选方案或抛出异常
pass
这段代码实现了一个基于Redis的分布式锁,用于解决秒杀等高并发场景下的同步问题。它使用了Redis的SET命令的NX
(只在键不存在时设置)和PX
(设置键的过期时间)选项来尝试获取锁,并通过一个唯一标识符来确保只有获得锁的客户端能够释放它。代码提供了获取和释放锁的方法,并且在获取锁之后,提供了使用try-finally语句来确保即使发生异常也能释放锁。
评论已关闭