首先,这里不讨论 Binlog 方案。
其次,基于我对该问题的理解,准备用以下实现:
1 )先更新数据库,再删除缓存。
2 )通过延时双删解决不一致问题,这里借助消息队列实现了异步的延时双删,以加快吞吐量。
3 )通过消息队列实现重试,以解决第二步 删除缓存失败 的问题。
最后,我有两个想问的问题:
1 )除了侵入了业务代码和引入消息队列会引发的问题以外,上面的方案有啥问题么?
2 )下列两种伪代码实现,哪种是对的?错在哪里?
// 伪代码 1
// 更新数据库
updateDB();
// 第一次删除缓存,同步
result = deleteCache(key);
if (false == result) {
// 失败
sendMessageToMQToDeleteCacheWithoutDelay(key);
}
// 第二次删除缓存,异步且延迟
sendMessageToMQToDeleteKeyWithDelay(key, delay);
// 伪代码 2
// 更新数据库
updateDB();
// 第一次删除缓存,同步
deleteCache(key);
// 即使上面的第一次删除缓存操作失败了,也什么都不做,继续向下执行
// 第二次删除缓存,异步且延迟
sendMessageToMQToDeleteCacheWithDelay(key, delay);
其次,基于我对该问题的理解,准备用以下实现:
1 )先更新数据库,再删除缓存。
2 )通过延时双删解决不一致问题,这里借助消息队列实现了异步的延时双删,以加快吞吐量。
3 )通过消息队列实现重试,以解决第二步 删除缓存失败 的问题。
最后,我有两个想问的问题:
1 )除了侵入了业务代码和引入消息队列会引发的问题以外,上面的方案有啥问题么?
2 )下列两种伪代码实现,哪种是对的?错在哪里?
// 伪代码 1
// 更新数据库
updateDB();
// 第一次删除缓存,同步
result = deleteCache(key);
if (false == result) {
// 失败
sendMessageToMQToDeleteCacheWithoutDelay(key);
}
// 第二次删除缓存,异步且延迟
sendMessageToMQToDeleteKeyWithDelay(key, delay);
// 伪代码 2
// 更新数据库
updateDB();
// 第一次删除缓存,同步
deleteCache(key);
// 即使上面的第一次删除缓存操作失败了,也什么都不做,继续向下执行
// 第二次删除缓存,异步且延迟
sendMessageToMQToDeleteCacheWithDelay(key, delay);
