什么是缓存穿透?
恶意用户模拟请求很多缓存和数据库中不存在的数据,导致这些请求短时间内直接落在数据库上,导致数据库异常,比如抢购、秒杀活动的接口被用户恶意刷,或者查询id为-1的数据。
缓存穿透解决方案:
1.增加校验,不符合基本查询数据规则的数据直接拦截,eg:id<=0的数据不让查询
2.给该key设置默认值,可以设置为null,有效时间短一点,最多不超过5分钟
什么是缓存击穿:
指缓存中没有,数据库中有的一条数据(一般是缓存时间到期),这时查询这一条数据并发量比较大的话,会直接到数据库中取数据,造成数据库压力过大。
缓存击穿解决方案:
1.设置热数据有效时间加长,或者设置为永不过期
2.加互斥锁,可以利用setnx给key加上锁,如果缓存中没数据,那么先尝试 获取锁(reetranLock.tryLock()),获取到了就从数据库中查询(然后 释放锁reetranLock.unLock()),获取不到就等待100ms,再次查询
什么是缓存雪崩?
指缓存中大量数据到了过期时间,此时查询量过大会落到数据库上,导致数据库压力过大。
缓存雪崩解决方案:
1.缓存数据随机设置过期时间,防止同一时间大量数据过期
2.如果缓存数据库是分布式部署,将热点数据均匀分布在不同缓存数据库中
3.设置热点数据永不过期,或者有效期长点
缓存降级:
就是在高并发高负载情况下,选择动态的关闭一下不重要的服务,拒绝访问,限流等,来为重要的服务节省资源,比如电商平台秒杀当天可以关闭推荐等功能。