缓存一致性设计方案

缓存一致性设计方案
要保证缓存和DB数据一致,即在发生写操作时要清理缓存,这两个操作要是原子性的。
完整的方案一共需要四次删除。
我们的方案是将变更事件消息发送到msgbroker中,然后自己去订阅进行缓存清除。但是msgbroker是异步的,中间存在时间差,用户很容易访问到旧的数据。所以我们的优化方案是对缓存进行二次清理。第一次是在写操作后进行同步删除,同时忽略异常,保证强一致性。第二次则是保证最终一致,通过消息中间件订阅消息异步删除,这里会处理异常,发生异常重试。
注意:不在第一次jvm删除时直接处理异常的原因是为了保证用户操作的体验,防止出现失败或者延迟过大的情况。

在高并发情况下写操作delete,读操作put存在天然的bug,且无法消除。即在A读取旧数据后,put缓存的操作在B更新DB且删除缓存之后才发生,缓存里存放了旧数据。所以我们在msgbroker删除后延迟2秒再次删除,可以很大程度上缓解这种bug造成的并发问题。这种方式降低了缓存的命中率,对于花呗这种业务模式对于缓存脏数据的零容忍,我只有这样牺牲一些可用性来保证一致性。
图片说明
还有花呗大促的时候,流量会在不同的LDC之间互相切换,导致不同的缓存数据这时候就需要借助ADDP进行全zone的删除。

发布过程中也存在缓存一致性问题
图片说明

全部评论

相关推荐

01-24 08:13
已编辑
合肥工业大学 Java
程序员牛肉:没啥问题。标准的流水线简历,但是学历好一点,所以应该是有约面的机会的。 这段时间可以考虑把自己的两个项目彻底的理一理。争取能够讲清楚每一个功能点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务