(1)缓存穿透:指的是操作直接穿过了缓存层面,直接到达 db 层面,从而称为缓存穿透。直接查询某一条不存在的数据,就会发生这种情况(其实还是要经过缓存层,只不过缓存层没有这条数据,就会发起 db 层面的操作)。
解决方案:
1. Bloom filter 算法(布隆过滤器???)
2. 空值缓存: 一种比较简单的解决办法,在第一次查询完不存在的数据后,将该 key 与对应的空值也放入缓存中,只不过设定为较短的失效时间,例如几分钟,这样则可以应对短时间的大量的该 key 攻击,设置为较短的失效时间是因为该值可能业务无关,存在意义不大,且该次的查询也未必是攻击者发起,无过久存储的必要,故可以早点失效。
(2) 缓存雪崩:多个缓存数据设置的失效时间相同,在同一时间同时失效,大量系统请求从请求缓存变成请求数据库,造成数据库崩溃。
解决方案:
1. 交错失效时间(即更改数据缓存的有效期,建议设置成固定时间的随机时间,例如设置成 3-5 秒钟中间的任意时间)。
2. redis 高可用
这个思想的含义是,既然 redis 有可能挂掉,那我多增设几台 redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群。
3. 限流降级
这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个 key 只允许一个线程查询数据和写缓存,其他线程等待。
4. 数据预热
数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的 key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
(3) 缓存击穿:缓存击穿实际上是缓存雪崩的一个特例,击穿与雪崩的区别即在于击穿是对于特定的热点数据来说,而雪崩是全部数据。(典型例子:微博的热点话题)。
解决方案:1. 二级缓存(参考链接)(阿里双十一流量缓存击穿解决办法)LRU-K 算法
参考:
https://baijiahao.baidu.com/s?id=1619572269435584821&wfr=spider&for=pc
https://baijiahao.baidu.com/s?id=1655304940308056733&wfr=spider&for=pc