2011-09-06 30 views
3

我们当前有一个通读缓存,在缓存缺失时填充缓存时使用乐观并发控制。我们预计不会出现很多冲突,所以我们选择使用乐观并发控制。当我们实际发生冲突时,我有点不确定该怎么做。如何使用乐观并发控制解决读通缓存中的冲突?

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

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

回答

1

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