如何使用乐观并发控制解决直读式缓存中的冲突?

时间:2011-09-06 22:56:07

标签: mysql database caching concurrency redis

我们目前有一个读取缓存,在缓存未命中时填充缓存时使用乐观并发控制。我们预计不会发生很多冲突,因此我们选择使用乐观并发控制。当我们确实遇到冲突时,我有点不确定该怎么做。

如果我们有缓存未命中,我们从数据库中提取相关行,然后将其放入缓存中以供将来参考。在我们将它放入缓存之前,我们确保自从我们的初始数据库读取以来缓存键的值没有改变。如果有,我现在倾向于使缓存条目无效,只是为了安全起见,但这似乎有点低效。有没有更好的选择,哪些仍然安全?

为了记录,我们使用Redis作为缓存层,使用MySQL作为后备存储。

1 个答案:

答案 0 :(得分:2)

如果冲突很少,那么为什么不再只是WATCH密钥,再次生成缓存数据,并尝试再次填充Redis 。只要不断重复这个过程,直到你的EXEC最终恢复干净。您可以将最大重试次数设置为理智,如果超过该次数,则只会使缓存无效并通知您的管理员。通知步骤似乎很重要,因为如果你的乐观锁失败超过5次,那么可能会发生一些奇怪的事情,你应该仔细看看。