目录
如何保证缓存和数据库的一致性?
知识点:对缓存的操作一般都是删除而不是更新操作
按照操作顺序可以分为以下几种:
1. 先删除缓存,后更新数据库
1. 存在的问题
A请求删除缓存后,还未更新数据库的时候,突然!B请求来了(一次查询操作),查缓存发现没数据,就去数据库查询,B请求把老的数据查询出来,并放到缓存中,之后A请求将数据库更新
2. 结果
缓存的数据是老的,数据库的是新的
大概率事件,因为B请求的查询速度>A请求的更新速度,很可能存在的
2. 先更新数据库,后删除缓存(感觉用这个方法没啥问题的)
1. 存在的问题
小概率情况下可能会存在脏读:缓存刚好失效,A请求直接查询数据库(旧值),突然!来了个B请求(一次更新操作),一气呵成,更新了数据库,且删除了缓存,之后,A请求将查询到的旧值写入缓存
2. 结果
缓存的数据是老的,数据库的是新的,A请求出现了脏读
总结:缓存刚好失效,A查询到旧值还没来得及操作redis,刚好B请求来一波操作(更新数据库、删除缓存)
小概率事件?因为读速度远大于写速度,B请求很难做到一气呵成,所以一般做到这个情况就可以了
3. 缓存延时双删:实现最终一致性
先删缓存,再更新数据库,延迟1s,再删缓存
1. 问:延迟多久怎么判断
确保确保读请求结束,写请求可以删除读请求造成的缓存脏数据