一、数据不一致
定义:主要就是指缓存中的数据和数据库中的数据不一致情况。
产生的原因:
当有数据修改时,无论是先修改数据库的值,还是先修改缓存中的值,都会发生数据不一致的情况,更好的解决方式,就是先更新数据库的值,在进行删除操作,但是这样的操作也会造成数据的不一致问题。主要是在两个方面,一个就是不能保证操作的原则性时,可能出现缓存不一致的情况,另一种就是在并发场景下,出现缓存不一致。
原子性问题:
先删除缓存,再更新数据库:当我们的删除缓存成功后,这时写入数据库失败,当我们再来请求这个数据时,首先从缓存中没有拿到值,去数据库读取,那么读取到的是旧值,存在问题。
先更新数据库,再删除缓存:当更新数据库成功后,删除缓存失败时,应用再去读取数据时,缓存命中,直接读取缓存的值为旧值,数据不一致。
解决思路:
并发下的问题:
解决思路:
终极解决思路:通过mysql的binlog日志,进行异步同步,比如阿里开源的Canal,就是通过binlog去异步更新缓存数据,其流程如下:
二、缓存雪崩
定义:缓存雪崩是指大量的数据在redis缓存中没有数据,导致请求打到数据库层,导致数据库请求压力大增。
产生原因:
解决思路:
三、缓存击穿
定义:缓存击穿是指,某些热点数据,在缓存中无法命中,导致大量请求打到数据库服务器,导致数据库压力大增,影响性能。
产生原因:热点数据过期导致。
解决思路:
四、缓存穿透
定义:应用请求的数据,既不在redis缓存中,也不在数据库中,后续在查询这些数据时,依然无法命中缓存,导致需要运行整个流程,服务器处理无效请求,浪费资源。
产生原因:
解决思路: