CreateArtTechnology
/ Blog
Login
最新文章
Java
语言相关
库相关
虚拟机相关
CreateArtTechnology
项目搭建
使用的工具
自研的工具
开源工具
ELK
ElasticSearch
Jenkins
Markdown
GraphQL
Arthas
生产工具
Linux
Nginx
VersionControl
Subversion
Git
Redis
Archiva
Maven
Zookeeper
Spring
SpringBoot
MySql
HBase
Cassandra
容器化
Docker
Kubernetes
服务容器化从零开始
未分类笔记
算法相关
概念相关
豆知识
机器学习
机器学习从零开始
缓存穿透、缓存雪崩、缓存击穿简介
17
2019-05-21 21:51:43
概念相关
## 背景 当数据计算或数据查询代价较大,或数据可以反复重用时,缓存当前数据通常是一个很好的选择。 缓存系统的设计目标通常为以下几点: - 通过复用数据降低计算或查询的响应时间,提高吞吐量 - 降低后方存储的负载压力 - 在写入操作与实际存储之间增加缓存,使得系统解耦,削峰填谷 - 存在冷热数据区别时,缓存热数据降低整个系统的响应时间 考虑到大多数情况下缓存是用在读远多于写的场景下,那么还需要考虑以下问题: - 一般使用内存作为缓存(也有使用SSD的,如360的 `PIKA`),相较于硬盘读写速度更快,容量更小,成本更高,**无法保存所有数据**(其实也没必要) - 缓存内容需要初始化,一般来说数据从后方存储中读取并设置到缓存中 - 很多数据是会变化的,也就是说**缓存会失效**,**需要定期更新** ## 穿透、雪崩、击穿 由于以上特点,流量大的缓存系统在设计时需要注意缓存失效或更新产生的问题。 ### 缓存穿透 ![](/img/pic/2019052212284016713_jpeg_512_340_116659) 出现恶意攻击(其实也有可能是bug),访问缓存和后方存储中不存在的数据,每次请求都会达到后方存储,导致存储负载增高或挂掉。 #### 解决方案 **使用布隆过滤器(Bloom Filter)** 我们可以保存系统中存在的key,在缓存未命中时先计算元素是否存在。 布隆过滤器简单来说是用于判断元素是否在集合中的哈希函数,特点是可以迅速判断元素一定不在集合中,但存在误差,不能准确判断元素“一定”在集合中。 ![](/img/pic/2019052121501524312_png_952_344_144825) > 布隆过滤器示意,每个元素对应Bit数组中的几个位,有可能部分重合,因此有误差 优点: - 判断速度快 - 可以表示全集 缺点: - 只能添加,不能删除 - 使用位数组保存集合中的元素,但由于使用哈希而不能扩容,容量不合理时很容易映射重合,导致误判 - 需要初始化,也就是得把所有存在的key哈希到位数组中 **缓存空结果** 即使数据不存在,也可以将空结果缓存,保护后方存储。 ### 缓存雪崩 ![](/img/pic/2019052212285947114_jpeg_640_327_19925) 大量key在同一时间失效,导致后方存储负载压力突增。 #### 解决方案 **错开失效时间** 同一批数据设置到缓存中时可以增加随机数错开失效时间。 ### 缓存击穿 ![](/img/pic/2019052212291249815_jpeg_896_273_61228) 热点数据缓存失效,在缓存更新的过程中大量请求直接打到后方存储,导致瞬时负载增高。 #### 解决方案 **提前更新存储** 在检测到缓存即将失效时更新缓存或延长缓存失效时间。可以检查key的TTL,或由异步线程更新。 **限流** 限流可以保护后方存储。 ## 参考资料 [缓存穿透、缓存击穿、缓存雪崩概念及解决方案 - 简书](https://www.jianshu.com/p/b57d0773ee96)
发布文章 101
文章被阅读 1817
最近修改
什么是“丝滑”的曲线
2021-12-08 15:19:20
高效空间数据索引R树及其批量加载方法STR简介
2021-09-29 20:33:37
关于分库分表的一些事儿
2021-06-25 11:51:25
获得诺奖的稳定匹配理论之TTC算法与GS算法
2021-03-14 23:04:48
算法小白的机器学习入门实践,从零到上线
2021-01-13 14:28:27
分站宗旨
一站式资料平台,减少重复检索,减少重复采坑。