# 我们都知道redis是为了给数据库做挡箭牌的,减轻数据库的压力
## 1.缓存击穿
高并发时,当一个key非常热点(类似爆款),在不停的扛着大并发,当这个key在失效的一瞬间,持续的大并发直接请求数据库并且设置到缓存中,导致性能下降
解决办法:加锁《同步锁或者分布式锁》
~~~
public Object index() {
Object obj = redisTemplate.boundValueOps("xxxx").get();
if (obj==null){
synchronized (this){
obj = redisTemplate.boundValueOps("xxxx").get();
if (obj!=null){
return obj;
}
//TODO 查询数据库并添加到缓存中
}
}
return obj;
}
~~~
### 2.缓存雪崩
缓存集中过期,或者缓存服务器宕机,导致大量请求访问数据库,造成数据库压力过大,宕机
解决方案
1.随机失效
2.redis哨兵模式
### 缓存穿透
数据库和缓存不存在数据,导致每次请求都去查数据库,这时的用户可能是攻击者,如用户发起id为-1的数据或者id特别大(不存在的数据)导致数据库压力过大或者宕机
解决方案
1.参数校验
2.缓存空对象(设置过期时间)
3.布隆过滤器(白名单或者黑名单)