《Redis应用实例》书摘(5):锁

锁是计算机系统中经常会用到的一种重要的机制,它可以用来保证特定资源在任何时候最多只能有一个使用者。

每个锁程序至少需要实现两个方法:

  • 上锁——尝试获得锁的独占权,在任何时候只能有最多一个客户端成功上锁,而除此以外的其他客户端则会失败。

  • 解锁——成功上锁的客户端可以通过解锁释放对锁的独占权,使得包括它自身在内的所有客户端能够重新获得上锁的机会。

代码清单 CODE_BASIC_LOCK 展示了实现上述两个操作的锁程序。


代码清单 CODE_BASIC_LOCK 基本锁实现 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

Tip

本文摘录自《Redis应用实例》一书。
欢迎访问书本主页以了解更多Redis使用案例:huangz.works/rediscookbook/
../_images/rediscookbook-banner.png