官术网_书友最值得收藏!

Redis應用實例

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
主站蜘蛛池模板: 合川市| 共和县| 藁城市| 桐梓县| 绥化市| 苍南县| 济宁市| 巴青县| 津南区| 晋州市| 五原县| 铁岭市| 饶阳县| 西乌珠穆沁旗| 三台县| 蒙自县| 察哈| 措美县| 女性| 新晃| 九江市| 福清市| 明水县| 苍山县| 鸡西市| 浦东新区| 临猗县| 库车县| 钦州市| 永康市| 克拉玛依市| 兴义市| 鄱阳县| 佳木斯市| 石嘴山市| 藁城市| 南乐县| 霍林郭勒市| 班戈县| 定结县| 化德县|