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

Ama*_*pta 0 race-condition redis

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

  1. 从redis获取此字符串化数组
  2. 在后端解析并在数组中添加用户的用户名
  3. stringify数组并存储回hash

如果两个用户在足够接近的时间注册,则存在潜在的竞争条件.

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

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

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

vau*_*tah 5

解决方案是尽可能使用原子操作.你有几个选择:

  • 使用真正的Redis列表,支持方便的命令,如 LPUSH
  • Lua脚本中做所有事情(根据定义它们是原子的)
  • 使用Redis事务WATCH命令来跟踪更改

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