私信  •  关注

SergGr

SergGr 最近创建的主题
SergGr 最近回复了
5 年前
回复了 SergGr 创建的主题 » redis使用事务获取和设置密钥到期

看一下rediscala的实现,您似乎不能使用我在原始答案中建议的乐观锁(见下文),因为在rediscala中 TransactionBuilder 不会发送 WATCH 命令直到 EXEC 令它变得毫无用处的命令。有一个旧的关闭 bug on GitHub 指的是另一个 SO question 在这种情况下,答案是

在rediscala中,您无法读取事务内部的内容,因为您将阻止客户端执行其他请求。 我建议你试试看你是否能签入lua脚本。(在lua脚本中转换事务)

几个月后

它关闭是因为 不建议实施
你应该用 http://redis.io/commands#scripting

从2014年开始,情况似乎是一样的,我认为不会改变。


原始答案

我没有活生生的redis来测试它,但是看看 Redis transaction docs 看起来redis不像您想象的那样支持sql风格的事务。它支持原子操作,但不能执行“启动事务获取数据检查可能修改提交”循环。所有“获取数据”命令都将在 执行官 命令到了。这意味着您不能在同一事务中的get和set之间进行任何检查。

如果你看 使用检查和设置的乐观锁定 “在文档中,您可以看到实现您的行为的正确方法是:

  1. 创建事务 watch 为了钥匙
  2. 获取值 外部 交易的
  3. 检查该值,如果需要更新,则在事务内部发出更新。(别忘了 UNWATCH 如果不需要更新)
  4. 执行交易
  5. 检查事务是否失败,如果失败,则重复整个周期。如果没有-你是写价值的赢家。