缓存穿透:即数据库没有该条数据,Redis也没有,这时候该无效请求就会直接打到数据库上,影响数据库性能,严重情况下会拖垮数据库。如下图所示:
解决方案:
1.null key,把null key也作为一个有效请求,从数据库返回;
2.布隆过滤器
3.给无效,重复的请求增加锁(因为串行化的原因,并发请求会一直争抢锁),抢到锁的请求才能去查询数据库,这样能阻挡大部分请求。
缓存击穿:数据库存在记录,但是Redis没有,如下图
解决方案:
1.setnx;
缓存雪崩:大量key同时失效,会导致请求直接压在数据库上,如下图
解决方案:
1.非时点型——随机设置key时间
2.时点型(比如零点过期)——业务延迟过期时间,或者依赖缓存穿透方案。
缓存预热:
提前加载数据到Redis中,但哪一部分数据是热数据?
需要提前统计哪部分数据是热数据,否则可能会导致缓存穿透,击穿等情况。
同时开发的时候,对没有预热的数据进行加锁处理(参考方案3),避免穿透和击穿等情况。
网友评论