示例:实现 MLPOP 函数
在了解了事务的使用方法之后,现在是时候用它来重新实现一个安全且正确的 mlpop
函数了:为此,我们需要使用事务包裹被执行的所有 LPOP
命令,就像代码清单 13-4 所示的那样。
代码清单 13-4 事务版本的 mlpop()
函数:/pipeline-and-transaction/mlpop.py
- def mlpop(client, list_key, number):
- # 开启事务
- transaction = client.pipeline()
- # 将多个 LPOP 命令放入事务队列
- for i in range(number):
- transaction.lpop(list_key)
- # 执行事务
- return transaction.execute()
新版的 mlpop()
函数通过事务确保自己发送的多个 LPOP
命令要么全部都执行,要么就全部都不执行,以此来避免只有一部分 LPOP
命令被执行了的情况出现。
举个例子,如果我们执行函数调用:
- mlpop(client, "lst", 3)
那么 mlpop()
函数将向服务器发送以下命令序列:
- MULTI
- LPOP "lst"
- LPOP "lst"
- LPOP "lst"
- EXEC
如果这个事务能够成功执行,那么它包含的三个 LPOP
命令也将成功执行;相反,如果这个事务执行失败,那么它包含的三个 LPOP
命令也不会被执行。
以下是新版 mlpop()
函数的实际运行示例:
- >>> from redis import Redis
- >>> from mlpop import mlpop
- >>> client = Redis(decode_responses=True)
- >>> client.rpush("lst", "123", "456", "789") # 向列表右端推入三个元素
- 3L
- >>> mlpop(client, "lst", 3) # 从列表左端弹出三个元素
- ['123', '456', '789']