不同db写造成的缓存不一致
Cache inconsistency caused by different db writes
如果我有一个对象 "Car" 具有三个属性,
{
year: "2016-12-01",
make: "toyota",
model: "camry"
}
,并且数据库中有三个 table,每个字段作为其主键,
table1:year(key), make, model
table 2: make(key), model, year
table 3: model(key), make, year
,
其中,读写每个table由不同的服务A、B、C处理。
假设A、B、C各读了一次,并将汽车信息放入缓存中,所以
A 有 year => {make, model}
B 有 make => {model, year}
C 有 model => {make, year}
,
然后B将年份更新为"2016-12-25"
,所以B的缓存中的这个元素在数据库写入后会被删除,但是另外两个呢?我们如何确保其他两个缓存也删除相应的元素。
基本上您有两个选择:同步或不同步删除操作。
如果您需要在其他缓存中立即处理删除,您需要通过向缓存发送删除请求来同步操作。
如果您可以忍受一些延迟 deleted/refreshed,也许只更新数据库并等待缓存条目在其他服务上过期就足够了。
如果您的服务正常运行是否能看到幽灵车,这些要求在很大程度上取决于。
一篇相关文章是 '因为我足够坚强:
分布式系统中一致性选择的推理,来自 Alexey Gotsman、Hongseok Yang、Carla Ferreira、Mahsa Najafzadeh 和 Marc Shapiro。
如果我有一个对象 "Car" 具有三个属性,
{
year: "2016-12-01",
make: "toyota",
model: "camry"
}
,并且数据库中有三个 table,每个字段作为其主键,
table1:year(key), make, model
table 2: make(key), model, year
table 3: model(key), make, year
,
其中,读写每个table由不同的服务A、B、C处理。
假设A、B、C各读了一次,并将汽车信息放入缓存中,所以
A 有 year => {make, model}
B 有 make => {model, year}
C 有 model => {make, year}
,
然后B将年份更新为"2016-12-25"
,所以B的缓存中的这个元素在数据库写入后会被删除,但是另外两个呢?我们如何确保其他两个缓存也删除相应的元素。
基本上您有两个选择:同步或不同步删除操作。
如果您需要在其他缓存中立即处理删除,您需要通过向缓存发送删除请求来同步操作。
如果您可以忍受一些延迟 deleted/refreshed,也许只更新数据库并等待缓存条目在其他服务上过期就足够了。
如果您的服务正常运行是否能看到幽灵车,这些要求在很大程度上取决于。
一篇相关文章是 '因为我足够坚强: 分布式系统中一致性选择的推理,来自 Alexey Gotsman、Hongseok Yang、Carla Ferreira、Mahsa Najafzadeh 和 Marc Shapiro。