【问题标题】:Redis : How to prevent this race conditionRedis:如何防止这种竞争条件
【发布时间】:2016-12-10 03:43:53
【问题描述】:

我在 redis 中有一个哈希值,其中一个字段的值是字符串化数组,每当用户注册一个事件时,

  1. 从 redis 中获取这个字符串化数组
  2. 在后端解析并在数组中添加用户的用户名
  3. 对数组进行字符串化并存储回散列

如果两个用户注册的时间足够近,则可能存在竞争条件。

竞争条件可能是这样的,两个用户都从 redis 获得相同的字符串化数组,然后他们修改,并且只会发生一次更新,因为一个会被另一个覆盖。

有没有办法像 SQL 中的事务一样防止这种竞争条件。我读过multi,但它不允许在服务器上的命令之间进行计算。

或者存储字符串化数组并存储为哈希字段是一个坏主意,我应该在 redis 上使用普通列表。

【问题讨论】:

  • 你的后端语言是什么?

标签: redis race-condition


【解决方案1】:

解决方案是尽可能使用原子操作。您有多种选择:

  • 使用支持方便命令的真实 Redis 列表,例如LPUSH
  • Lua script 中执行所有操作(根据定义,它们是原子的)
  • 使用Redis transactionsWATCH 命令跟踪更改

典型的WATCH 用法涉及尝试执行事务直到它成功。你可以通过一个简单的循环来做到这一点,但是你的连接器可能有一个特殊的方便方法来解决这个问题。

【讨论】:

  • 如果我使用普通列表,不会有任何与竞态条件相关的问题。但是对于问题中的场景,这是可以解决的吗?
  • @AmanGupta:是的,您至少还有两个其他选项,都列在我的答案中。
  • 直到现在才意识到 lua 脚本的威力。为此使用 Lua。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 2019-02-23
  • 1970-01-01
  • 2015-01-30
相关资源
最近更新 更多