Redis可以使用SETNX(SET if Not eXists)命令實現并發鎖。以下是一個使用Redis實現并發鎖的示例代碼:
import redis
import time
def acquire_lock(redis_conn, lock_name, acquire_timeout=10, lock_timeout=10):
"""
獲取鎖
"""
end_time = time.time() + acquire_timeout
while time.time() < end_time:
if redis_conn.set(lock_name, "locked", nx=True, ex=lock_timeout):
return True
time.sleep(0.001)
return False
def release_lock(redis_conn, lock_name):
"""
釋放鎖
"""
redis_conn.delete(lock_name)
# 創建Redis連接
redis_conn = redis.Redis(host='localhost', port=6379, db=0)
# 獲取鎖
if acquire_lock(redis_conn, "my_lock"):
print("獲取鎖成功")
# 執行需要加鎖的操作
# ...
# 釋放鎖
release_lock(redis_conn, "my_lock")
else:
print("獲取鎖失敗,其他線程正在使用鎖")
在上述代碼中,acquire_lock
函數會嘗試獲取鎖,若成功獲取到鎖,則返回True;若在指定的acquire_timeout
時間內未能獲取到鎖,則返回False。
release_lock
函數用于釋放鎖,即刪除鎖對應的key。
需要注意的是,為了防止鎖的過期時間設置得過長導致死鎖,建議在使用完鎖后手動調用release_lock
函數釋放鎖,而不要依賴鎖的自動過期。