1.缓存穿透
1.1缓存穿透的场景
*访问数据库原本并不存在的数据,会穿透缓存,直接访问数据库,在一段时间内,如果频繁访问数据库不存在的数据会导致数据库的访问压力变大。
*缓存只是为了缓解数据库的压力而添加的一层保护层,当从缓存中查询不到我们需要的数据就要去数据库中查询,如果被不正当使用,频繁去访问缓存中没有的数据,那么缓存就失去了意义,瞬间所有的请求压力都落在了数据库上,这样会导致数据库连接异常。
1.2解决方案
*1.被动方案:对于返回为NULL的依然缓存,对于抛出异常的返回不进行缓存,一般过期时间会比较短。
*2.主动方案:制定一些规则过滤一些不可能存在的数据
小数据用BitMap,大数据可以用布隆过滤器
2.缓存雪崩
2.1缓存雪崩的场景
如果大量缓存数据都在同一个时间过期,那么很可能出现缓存集体失效,会导致所有的请求都直接访问数据库,导致数据库压力过大,造成缓存雪崩。
2.2 解决方案
*①设置过期时间时,添加随机值,让过期时间进行一定程度分散
给缓存加上一定区间内的随机生效时间,不同的key设置不同的失效时间,避免同一时间集体失效。比如以前是设置10分钟的超时时间,那每个key都可以随机8–13分钟过期,尽量让不同key的过期时间不同。
*②多级缓存的方式来处理
不同级别缓存设置的超时时间不同,及时某个级别缓存都过期,也有其它级别缓存兜。
*3利用锁/队列的形式,串行化处理对数据库的请求
对数据库操作利用加锁或者队列方式避免过多请求同时对数据库服务器进行读写。