缓存一致性
大约 1 分钟
缓存一致性
并发如何带来缓存一致性的问题
同时发起A|B两个请求
A更新值为1并记录到缓存
B更新值为2并记录到缓存
正确的情况:数据库和缓存都为2
实际的情况:缓存先被B更新为2,然后又被A更新为1
策略
写:更新数据库后删除缓存 或 先删除缓存再更新数据库
读:未命中缓存就更新缓存
先删除缓存再更新数据库异常情形
A先删除缓存
B读取值为20
B更新缓存为20
A更新数据库为21
先更新数据库再删除缓存异常情形(我以前常用的)
A请求读取数据为20
B请求更新数据库为21
B请求删除缓存
A请求更新缓存为20
由于缓存更新比数据库更新快,所以这种情形概率较低
极限情况
更新完数据库删除缓存的时候,删除失败了,导致缓存不一致
如何保证数据库更新和缓存更新都成功呢
重试:消息队列记录动作,不成功就重试,重试多次还不行就发报错信息
订阅MySQL的binlog:阿里巴巴开源的Canal中间件
延迟双删
先删除缓存,然后更新数据库,延迟N秒之后(3~5),再次删除缓存