1:先删缓存再更新数据库
情况1:数据库和缓存内容不一致
线程1删除缓存后还没有来得及更新数据库时
线程2读缓存,由于缓存中的数据已经被线程1清空了所以线程2需要去数据库读数据,然后把读到的结果保存到缓存中。
此时线程1更新更新数据库成功。就会出现数据库和缓存内容不一致。
情况2:缓存击穿,数据库卡死
线程1删除缓存后还没有来得及更新数据库时
此时来了大量的读请求,由于缓存中没有数据,导致缓存击穿直接将大量请求访问到数据库,导致数据库崩溃。
2:先更新数据库后清缓存
情况1:缓存击穿,数据库卡死
线程1更新数据库后删除缓存。
此时有大量请求访问。导致缓存击穿,数据库卡死。
单点架构 建议优化如下:
Object value= getCatch(Key);
if(null=value){
sync{
value= getCatch(Key);
if(null=value){
//查询数据库,更新缓存
}
}
}
主从架构情况下:
先更新主数据库后删缓存
由于主从同步需要一段时间,而从数据库中的数据还是老数据,可能会把从库中的数据保存到缓存中。导致缓存和数据库不一致。
解决方案:延时双删
更新数据库的时候删一次缓存,1秒钟之后再次删除缓存。