我在redis中有一个哈希值,其中一个字段的值为字符串化数组,每当用户注册一个事件时,
如果两个用户在足够接近的时间进行注册,则存在潜在的竞争条件。
竞争条件可能是这样的,两个用户从redis获得相同的字符串化数组,然后他们修改,只有一个更新将发生,因为一个将被其他人覆盖。
有没有办法像SQL中的事务一样阻止这种竞争条件。我已经阅读了multi
,但它不允许在服务器上的命令之间进行计算。
或者存储字符串化数组并存储为哈希字段是一个坏主意,我应该在redis上使用普通列表。
答案 0 :(得分:5)
解决方案是尽可能使用原子操作。您有几种选择:
LPUSH
WATCH
命令跟踪更改典型的WATCH
用法涉及尝试执行事务,直到成功为止。您可以通过一个简单的循环来完成此操作,但是您的连接器可能具有一种特殊的便利方法。