3.3 實現代碼
代碼清單3-1展示了根據3.2節所述解決方案實現的鎖程?序。
代碼清單3-1 鎖程序lock.py
VALUE_OF_LOCK = "" class Lock: def __init__(self, client, key): self.client = client self.key = key def acquire(self): """ 嘗試加鎖,成功時返回True,失敗時則返回False。 """ return self.client.set(self.key, VALUE_OF_LOCK, nx=True) is True def release(self): """ 嘗試解鎖,成功時返回True,失敗時則返回False。 """ return self.client.delete(self.key) == 1
在acquire()
方法中,程序通過檢查SET
命令的返回值是否為True
來判斷設置是否被成功執行;而在release()
方法中,程序則通過檢查DEL
命令返回的成功刪除鍵數量是否為1
來判斷鎖鍵是否已被成功刪?除。
作為例子,下面這段代碼展示了上述鎖程序的具體用法:
>>> from redis import Redis >>> from lock import Lock >>> client = Redis(decode_responses=True) >>> locker1 = Lock(client, "Lock:10086") >>> locker1.acquire() # 加鎖 True >>> locker1.release() # 解鎖 True
在locker1
持有鎖期間,如果有其他客戶端嘗試加鎖,那么acquire()
方法將返回False
表示加鎖失敗:
>>> locker1.acquire() # locker1嘗試加鎖并成功 True >>> locker2 = Lock(client, "Lock:10086") # 模擬另一客戶端 >>> locker2.acquire() # locker2也嘗試加鎖,但失敗 False