chatgpt
分布式锁在分布式系统中是非常必要的,因为传统的锁机制如 synchronized
只适用于单个 JVM 进程内的线程同步,而不能跨进程、跨服务器甚至跨数据中心使用。以下是详细解释:
synchronized
是 Java 提供的一种用于实现线程同步的机制,其作用范围和特点如下:
synchronized
无法跨越 JVM 边界实现锁。在分布式系统中,多个节点可能同时访问共享资源,例如数据库、缓存或文件系统。为了避免数据不一致和竞争条件,需要一种机制来确保同一时刻只有一个节点能够访问或修改资源,这就是分布式锁的作用。
Redis 提供了一种常见的分布式锁实现方式,利用 SETNX
(SET if Not eXists)命令或更复杂的 RedLock 算法。
import redis
import time
r = redis.Redis()
def acquire_lock(lock_name, acquire_timeout=10, lock_timeout=10):
end = time.time() + acquire_timeout
lock_timeout = int(lock_timeout)
while time.time() < end:
if r.setnx(lock_name, lock_timeout):
r.expire(lock_name, lock_timeout)
return True
elif r.ttl(lock_name) == -1:
r.expire(lock_name, lock_timeout)
time.sleep(0.01)
return False
def release_lock(lock_name):
r.delete(lock_name)
# 使用示例
if acquire_lock("my_lock"):
try:
# 临界区
pass
finally:
release_lock("my_lock")