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的索引存在位置。
布隆过滤器.png当布隆过滤器中,可以找到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 相关信息
- 博文不易,辛苦各位猿友点个关注和赞,感谢
网友评论