首页 > 编程知识 正文

缓存击穿解决办法,java缓存击穿

时间:2023-05-06 01:05:37 阅读:29750 作者:4861

缓存平衡是指缓存平衡,如果在某个时间点发生了大规模的缓存吊销,那么就会导致大量的请求直接打在数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机此时,如果运维立即重新启动数据库,则新流量会立即杀死数据库这就是现金雪崩。

分析:引起缓存雪崩的关键是同时大规模密钥失效。 为什么会发生这个问题,有几个可能性。 第一个可能是Redis瘫痪。 第二个可能采用了相同的有效期限。 查明原因后,有什么解决办法?

解决方案: 1、原始失效时间加上随机值。 例如,1-5分钟随机。 这样可以避免由于采用相同的过期日期而导致的缓存雪崩。

如果真的发生了缓存雪崩,有什么驱动器对策吗?

2、使用熔断机制。 流量达到一定阈值时,直接返回“系统拥塞”等提示,防止过多的请求命中数据库。 至少一些用户可以正常使用,并确保其他用户多次更新都会得到结果。

3、提高数据库容灾能力,可以使用分库分表进行读写分离策略。

4、为了防止Redis瘫痪带来的缓存雪崩问题,可以构建Redis集群,提高Redis的容错能力。

什么是现金击穿? 其实和现金雪崩有点像。 现金雪崩是大规模key的失效。 另一方面,缓存击穿是一个热点的Key集中进行了大规模的并发访问。 突然,此密钥到期,所有大型并发访问都命中数据库,数据库压力剧增。 这种现象称为缓存击穿。

分析:重要的是,一个热点的密钥被禁用,大规模的并发事件集中在数据库上。 因此,要从两个方面解决问题,第一个问题是热点密钥是否不设置过期时间,第二个问题是是否可以考虑减少命中数据库的请求数。

解决方案: 1、如上所述,只要业务允许,可以对热点密钥设置永不过期的密钥。

2、使用排他锁。 如果缓存被禁用,则只有获取锁定后才能查询数据库,同时命中数据库的请求减少,数据库不会命中。 当然,这将恶化系统的性能。

什么是缓存直通? 我们使用Redis的大多数情况下,都会用Key查找对应的值。 如果收到的请求有大量此类请求(key是不存在Redis中的,那么就查不到缓存,查不到缓存就会去数据库查询),则这些请求会直接命中数据库,就像“穿透”了缓存一样,这种现象称为缓存穿透。

分析:重要的是在Redis中找不到key的值。 这与缓存击穿有根本的区别。 区别在于,对于缓存击穿,输入的密钥在Redis中不存在。 如果向不存在的大量key发送了黑客,那么大量的请求命中数据库是致命的问题,因此在日常开发中必须检查参数。 一些不正确的参数,不存在的密钥直接返回错误消息。 必须对调用方保持这种“不可靠”的心态。

解决方案:

1、将无效的密钥保存在Redis中。 如果Redis无法查询数据,也无法查询数据库,请将此密钥值保存到Redis中,并设置value=“null”,以便下次使用此密钥进行查询时无需查询数据库。 这个处理方法一定有问题。 如果输入的这个不存在的密钥值每次都是随机的,那么保存在Redis中也没有意义。

2、使用布隆过滤器。 布隆过滤器的作用是,如果某个key不存在,则一定不存在,如果某个key存在,则存在的可能性高(存在一定的误判定率)。 然后,可以在缓存之前添加光晕过滤器,以便在查询时前往光晕过滤器查询key是否存在,如果不存在,可以直接返回。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。