【发布时间】:2017-02-28 19:14:53
【问题描述】:
只是为了重新定义缓存模式,它在获取和更新数据时定义了以下步骤。
获取项目
- 如果在缓存中找到,则从缓存中返回该项目。
- 如果在缓存中找不到,则从数据存储中读取。
- 将读取的项目放入缓存并返回。
更新项目
- 将项目写入数据存储区。
- 从缓存中删除相应的条目。
这几乎在所有情况下都能完美运行,但在一种理论场景中似乎失败了。
如果更新项目的第 1 步和第 2 步发生在获取项目的第 2 步和第 3 步之间会怎样。换句话说,考虑最初数据存储的值为“A”并且它不在缓存中。因此,在获取项目时,我们从数据存储中读取“A”,但在放入缓存之前,该项目在另一个线程中更新为“B”(因此“B”被写入数据存储并试图从缓存中删除该条目,当时还没有)。现在,当获取线程将它读取的项目(即“A”)放入缓存时。所以现在“A”将保持缓存状态,进一步的提取将返回陈旧的数据,直到项目过期或再次更新。
所以我在这里遗漏了什么,是我对模式的理解是错误的。或者说这种情况几乎是不可能的,不用担心。
我也想知道是否可以对模式进行一些更改以避免这个问题。
【问题讨论】:
标签: caching design-patterns memcached