大型互联网项目都是多级缓存思路,尽可能让大多数请求的数据在缓存中获得,即请求优先从一级缓存到二级三级缓存中获取数据,最后才会从数据库层面拿数据,缓存的高并发性能远远高于数据库层面,那么基于上述多级缓存思路,会出现如下几种情况
1.缓存穿透
即网络请求中带有大量缓存中没有的参数进行访问,那么最终我们的请求会走到数据库层面,如果量非常大,将会导致数据库性能急剧下降,即缓存穿透
解决思路
缓存空对象
即查询不到该缓存数据将该Key缓存一个null对象,设置失效时间
2.缓存失效
短时间类加入了大量秒杀商品数据,可能设置的缓存过期时间是一样的,这类数据缓存可能会在同一时间失效,统一时间失效后请求就会到达数据库,导致数据库性能大幅度下降
解决思路
加入数据时缓存时间根据基数设置随机值,减少大量缓存同时失效的几率
3.缓存雪崩
压力太大,即多级缓存中有一级出现问题停止服务,一个缓存服务出现问题似乎问题不大,但是很可能出现级联反应导致其他缓存服务压力过大,导致出现的问题(雪球)越来越大,最后导致数据库奔溃,整个网站无法访问
解决思路:
保证整个缓存架构的高可用
限流:同时有几亿用户下单,限制请求流量的大量同时涌入(消息队列中间件)
熔断
降级
4.热点Key
冷数据不会长时间存储在缓存中,而是存在数据库中,突然有一天收到大量的冷数据Key访问,导致穿透到数据库,数据库并发量大,导致数据库压力过大;
5.缓存与数据库双写不一致
1.读多写少场景 读写锁 读读不互斥 读写互斥
2.延迟双删
网友评论