Redis:如何防止这种竞争状况

时间:2016-08-04 06:42:39

标签: redis race-condition

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

  1. 从redis
  2. 获取此字符串化数组
  3. 在后端解析并在数组中添加用户的用户名
  4. 将数组字符串化并存储回哈希
  5. 如果两个用户在足够接近的时间进行注册,则存在潜在的竞争条件。

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

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

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

1 个答案:

答案 0 :(得分:5)

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

  • 使用支持LPUSH
  • 等便捷命令的真实Redis列表
  • Lua script内做所有事情(根据定义,它们是原子的)
  • 使用Redis transactionsWATCH命令跟踪更改

典型的WATCH用法涉及尝试执行事务,直到成功为止。您可以通过一个简单的循环来完成此操作,但是您的连接器可能具有一种特殊的便利方法。