缓存击穿、穿透、雪崩简单总结

2020-12-02 From 程序之心 By 丁仪

Redis 在互联网应用中被广泛使用,一般用来做缓存。使用缓存能够提升系统性能,优化用户体验。但缓存也存在雪崩、穿透、击穿等异常情况,本文做下简单总结。

缓存应用场景

缓存是分布式系统中非常重要的组成部分,比如分布式 session、热点数据,在高并发、大流量情况下能够提升数据访问性能。缓存的基本思想就是我们非常熟悉的空间换时间。当我们查询一条数据时,先去查询缓存,如果有缓存就直接返回,如果没有就去查询数据库,更新缓存,然后返回。

缓存击穿

缓存击穿一般指大量请求查询同一个数据,数据的缓存缺失,请求都打到数据库。缓存击穿一般是单个热点数据失效,在高并发下持续查询数据库,导致数据库压力增大。

要预防缓存击穿,可以多方面布防:

  • 热点数据不过期:比如双十一,热点畅销商品必须确保缓存一直都在,可以异步刷新但不能失效;
  • 使用互斥锁:在缓存失效的时候,使用互斥锁控制读数据库操作,读到数据后写入缓存,其他线程后续读缓存即可;

缓存穿透

缓存穿透一般是指异常情况下请求不存在的数据,无法从缓存中读取数据,用户请求每次都会到达数据库,导致数据库压力增大。可能是非法请求,比如攻击者故意查询不存在的数据,若攻击者利用穿透进行攻击可能会拖垮数据库。

要预防缓存穿透,可以多方面布防:

  • 参数校验:对提交的参数进行必要的校验,拦截下非法请求,防止走到后面流程;
  • 缓存空值:可以针对攻击者可能提交的非法请求,在缓存中预先加载空值,防止打到数据库;
  • 使用布隆过滤器:可以使用布隆过滤器先行判断数据是否存在,如果不存在不去查询数据库;

缓存雪崩

缓存雪崩发生在缓存大量失效或缓存服务宕机的时候。比如系统 QPS 1000000,有缓存可以抗住 1000000,如果所有缓存都在同一时间失效,或者缓存服务宕机,所有的请求都直接打到 db,db 必然扛不住,有可能当时就挂了,然后整个服务陷入瘫痪。如果 DBA 此时紧急重启数据库,可能数据库刚刚重启完成,又马上被巨量请求打挂,服务仍然瘫痪。

要解决缓存雪崩,可以在多个方面进行布防:

  • 集群部署:redis 采用集群部署,可以使用主从 + 哨兵 ,防止宕机影响。
  • 超时时间:Redis 存储数据时,要充分考虑各种缓存数据的失效时间,尽量避免同时失效,热点数据有效期要足够长;
  • 系统限流:发生缓存雪崩后,要对系统进行限流,为缓存重新加载和数据库重启赢得时间。
  • 本地缓存:系统最好加上本地缓存,对于不常变化的数据,优先使用本地缓存,降低雪崩时的影响;

总结

缓存虽好,也要注意预防问题,一旦出现异常可能就是致命问题。击穿一般指单个热点数据失效而把流量打到数据库,穿透一般指访问不存在的数据而把流量打到数据库,雪崩一般指大量数据失效或缓存服务宕机而把流量打到数据库。

缓存的击穿、穿透、雪崩也是面试经常问到的问题,知识点比较重要,需要在工作中注意理解和总结实践经验。在设计技术方案时,也要充分考虑异常场景。

本文来源:程序之心,转载请注明出处!

君子曰:学不可以已。
《Java编程思想 第4版》

《计算机科学丛书:Java编程思想(第4版)》赢得了全球程序员的广泛赞誉,即使是晦涩的概念,在BruceEckel的文字亲和力和小而直接的编程示例面前也会化解于无形。从Java的基础语法到高级特性(深入的面向对象概念、多线程、自动项目构建、单元测试和调试等),本书都能逐步指导你轻松掌握。

发表感想

© 2016 - 2024 chengxuzhixin.com All Rights Reserved.

浙ICP备2021034854号-1    浙公网安备 33011002016107号