Redis 缓存穿透和雪崩

1 缓存穿透

1.1 说明

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时候就会绕过缓存,每次都请求数据库,这样的话,大量的请求都直接到达数据库,这种现象就叫缓存穿透。

1.2 解决方案

1.2.1 代码层面

List<String> list = demoService.getDemoData(demoID);
/*
 * 防止缓存穿透
 * 解决方案: 把空的数据也缓存起来,比如空字符串,空对象,空数组或者list
 */
if(list != null && list.size() > 0) {
    
    
  redisOperator.set("demo:" + demoID, JsonUtils.objectToJson(list));
} else {
    
    
  // 设置过期时间,5分钟
  redisOperator.set("demo:" + demoID, JsonUtils.objectToJson(list),5*60);
}

1.2.2 使用布隆过滤器

布隆过滤器,简单来理解就是,0和1组成的数组,1代表存在,redis中的key会存在布隆过滤器中,如下图所示,1的位置代表key的索引存在位置。

在这里插入图片描述

当布隆过滤器中,可以找到key的索引的时候,就像demo:1一样,数据会从redis中正常返回。
如果索引找不到,就像demo:-1一样的话,就直接返回nil的值。

1.2.3 对比方案

布隆过滤器

  • 布隆过滤器存在误判行为,虽然概率很低,但是也是会发生。
  • 布隆过滤器,会增加代码的复杂性

代码层面

  • 相对来说,缺点不是很明显,实际环境中多采用这种方式

2 缓存雪崩

2.1 说明

缓存雪崩是指,在一个特定的时间,redis中存在的的key,大面积的失效。这时候很大的流量涌入进来,会直接到达数据库服务器,数据库宕机崩溃,反复重启服务,不起作用。

2.2 预防方案

2.2.1 永不过期

一些热点数据,直接设置为永不过期,这样热点数据的访问就始终会走缓存服务。

2.2.2 过期时间错开

缓存数据的key在进行设置的时候,可以对数据分批设置不同的过期时间,也可以随机范围内的过期时间,使其分布在不同的过期时间段。

2.2.3 多级缓存方案

可以使用多级缓存方案,比如 nginx本地缓存+redis分布式缓存+tomcat堆缓存的多级缓存架构。

2.2.4 使用第三方redis服务

可以购买使用第三方的redis服务,第三方的redis服务的性能以及扩展性相对来说,比自行部署的要高。

3 相关信息

  • 博文不易,辛苦各位猿友点个关注和赞,感谢

猜你喜欢

转载自blog.csdn.net/qq_15769939/article/details/113928181