Redis学习笔记#9:缓存穿透、缓存击穿、缓存雪崩解决方案

缓存穿透

表示恶意用户模拟请求很多缓存中不存在的数据,由于缓存中都没有,导致这些请求短时间内直接落在了数据库上,导致数据库异常。

解决方案:

1.缓存空值,之所以发生穿透,是因为缓存中没有存储这些数据的key,从而每次都查询数据库 我们可以为这些key在缓存中设置对应的值为null,后面查询这个key的时候就不用查询数据库了 当然为了健壮性,我们要对这些key设置过期时间,以防止真的有数据

2.使用布隆过滤,将所有可能存在的数据缓存放到布隆过滤器中,当访问不存在的缓存时迅速返回避免缓存及DB挂掉。

public String getByKey(String key) {
 // 通过key获取value
 String value = redisService.get(key);
 if (StringUtil.isEmpty(value)) {
 if (bloomFilter.mightContain(key)) {
 value = userService.getById(key);
 redisService.set(key, value);
 return value;
 } else {
 return null;
 }
 }
 return value;
}

 

缓存击穿

在高并发的情况下,大量的请求同时查询同一个key时,此时这个key正好失效了,就会导致同一时间,这些请求都会去查询数据库,这样的现象我们称为缓存击穿

解决方案:

采用分布式锁,只有拿到锁的第一个线程去请求数据库,然后插入缓存,当然每次拿到锁的时候都要去查询一下缓存有没有

 

缓存雪崩

缓存在同一时间内大量键过期(失效),接着来的一大波请求瞬间都落在了数据库中导致连接异常。

事前
①在设置key的过期时间时,在过期时间上加上一个随机值,防止大量key同时过期。
②搭建高可用的缓存架构,比如使用 哨兵+主从 结构或者使用 cluster模式,避免缓存系统出现故障。
③可以在系统中使用ehcache做个小缓存,防止redis崩掉之后,还有一部分缓存。
事中
①对系统请求进行降级和限流,防止数据库之间崩掉。
事后
赶快使用redis持久化的数据,快速恢复缓存数据
 
1.采用集群,降低服务宕机的概率
2.ehcache本地缓存 + Hystrix限流&降级
ehcache 本地缓存的目的也是考虑在 Redis Cluster 完全不可用的时候,ehcache 本地缓存还能够支撑一阵
使用 Hystrix进行限流 & 降级 ,比如一秒来了5000个请求,我们可以设置假设只能有一秒 2000个请求能通过这个组件,那么其他剩余的 3000 请求就会走限流逻辑



猜你喜欢

转载自www.cnblogs.com/sunang/p/11352680.html