利用setnx函數實現分布式鎖的基本思路是:
使用setnx命令嘗試在redis中設置一個指定的key,如果該key不存在則返回1,表示成功獲取鎖;如果該key已經存在則返回0,表示獲取鎖失敗。
在獲取鎖成功后,設置一個過期時間,確保鎖在一定時間內自動釋放,避免鎖被長時間占用造成死鎖。
在釋放鎖時,使用del命令刪除該key,確保鎖釋放成功。
以下是一個簡單的示例代碼來實現分布式鎖:
import redis
import time
# 連接redis
redis_client = redis.Redis(host='localhost', port=6379, db=0)
# 獲取分布式鎖
def acquire_lock(lock_key, expire_time=10):
lock = redis_client.setnx(lock_key, time.time() + expire_time)
if lock:
return True
current_time = time.time()
# 判斷鎖是否過期
if current_time > float(redis_client.get(lock_key) or 0):
# 如果鎖已經過期,則重新設置鎖
new_expire_time = current_time + expire_time
old_expire_time = float(redis_client.getset(lock_key, new_expire_time) or 0)
if old_expire_time == current_time:
return True
return False
# 釋放分布式鎖
def release_lock(lock_key):
current_time = time.time()
if current_time < float(redis_client.get(lock_key) or 0):
redis_client.delete(lock_key)
return True
return False
# 測試分布式鎖
lock_key = "distributed_lock"
if acquire_lock(lock_key):
try:
# 業務邏輯處理
print("獲取鎖成功,執行業務邏輯")
finally:
release_lock(lock_key)
else:
print("獲取鎖失敗")
在上面的示例中,首先通過acquire_lock函數嘗試獲取分布式鎖,成功獲取鎖后執行業務邏輯,最后通過release_lock函數釋放鎖。通過這種方式可以確保在分布式環境下對資源的互斥訪問。