示例:实现 MLPOP 函数

在了解了事务的使用方法之后,现在是时候用它来重新实现一个安全且正确的 mlpop 函数了:为此,我们需要使用事务包裹被执行的所有 LPOP 命令,就像代码清单 13-4 所示的那样。


代码清单 13-4 事务版本的 mlpop() 函数:/pipeline-and-transaction/mlpop.py

  1. def mlpop(client, list_key, number):
  2. # 开启事务
  3. transaction = client.pipeline()
  4. # 将多个 LPOP 命令放入事务队列
  5. for i in range(number):
  6. transaction.lpop(list_key)
  7. # 执行事务
  8. return transaction.execute()

新版的 mlpop() 函数通过事务确保自己发送的多个 LPOP 命令要么全部都执行,要么就全部都不执行,以此来避免只有一部分 LPOP 命令被执行了的情况出现。

举个例子,如果我们执行函数调用:

  1. mlpop(client, "lst", 3)

那么 mlpop() 函数将向服务器发送以下命令序列:

  1. MULTI
  2. LPOP "lst"
  3. LPOP "lst"
  4. LPOP "lst"
  5. EXEC

如果这个事务能够成功执行,那么它包含的三个 LPOP 命令也将成功执行;相反,如果这个事务执行失败,那么它包含的三个 LPOP 命令也不会被执行。

以下是新版 mlpop() 函数的实际运行示例:

  1. >>> from redis import Redis
  2. >>> from mlpop import mlpop
  3. >>> client = Redis(decode_responses=True)
  4. >>> client.rpush("lst", "123", "456", "789") # 向列表右端推入三个元素
  5. 3L
  6. >>> mlpop(client, "lst", 3) # 从列表左端弹出三个元素
  7. ['123', '456', '789']