Redis中的事务与读取操作

Tre*_*reg 6 transactions atomicity redis

使用Redis,我想执行一个原子序列的命令,即我需要保证在执行序列时没有其他客户端会在数据库中执行更改.

如果我只使用write命令,我可以使用MULTIEXEC语句来确保使用事务的原子性.但是,我还想在我的事务中使用read命令.因此我无法使用MULTI,因为读命令也在排队!

基本上,以原子方式,我需要做以下事情:

  1. x从数据库中读取,
  2. 基于x,存储f(x)到数据库.

1.和2.都应该是单个原子事务的一部分.

有一个简单的方法怎么做?

Car*_*auf 11

您的问题有两个很好的解决方案.

选项1:

您需要WATCH在正在阅读的密钥上发布.您的交易看起来像这样:

WATCH x
x = GET x
MULTI
SET y, f(x)
EXEC
Run Code Online (Sandbox Code Playgroud)

在这个例子中,多块内部的写命令将以原子方式执行,但当key的值在调用后x没有改变时才会执行WATCH.这称为乐观锁.如果值x确实改变了你的应用程序将会出错,并需要决定下一步该做什么,这可能会使用新的值再次尝试x.

选项2:

Redis现在支持lua脚本,lua脚本以原子方式执行.如果您可以将逻辑封装到lua脚本中,则可以f(x)原子地读取密钥,运行逻辑并存储结果.根据您正在执行的逻辑,这可能很棘手甚至是非选项.您甚至可能必须通过将它们直接硬编码到您希望redis执行的脚本中来执行丑陋的黑客操作,例如将值传递给lua.也就是说,如果你使用它,这种方法应该是可靠和高效的,而且你不必处理处理EXEC失败.