系统性能调优必知必会
陶辉
智链达 CTO,前阿里云 P8 高级技术专家
36367 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
系统性能调优必知必会
15
15
1.0x
00:00/00:00
登录|注册

25 | 过期缓存:如何防止缓存被流量打穿?

缓存并未提高系统性能的情况
过期缓存功能
合并回源功能
基于过期时间淘汰缓存
缓存淘汰算法
添加或更新缓存数据
缓存的应用场景
缓存提升性能的原因
缓存的存在
思考题
Nginx如何防止流量打穿缓存
缓存数据的更新方式
分布式系统中的缓存
缓存

该思维导图由 AI 生成,仅供参考

你好,我是陶辉。
这一讲我们将对一直零散介绍的缓存做个全面的总结,同时讨论如何解决缓存被流量打穿的场景。
在分布式系统中,缓存无处不在。比如,浏览器会缓存用户 Cookie,CDN 会缓存图片,负载均衡会缓存 TLS 的握手信息,Redis 会缓存用户的 session,MySQL 会缓存 select 查询出的行数据,HTTP/2 会用动态表缓存传输过的 HTTP 头部,TCP Socket Buffer 会缓存 TCP 报文,Page Cache 会缓存磁盘 IO,CPU 会缓存主存上的数据,等等。
只要系统间的访问速度有较大差异,缓存就能提升性能。如果你不清楚缓存的存在,两个组件间重合的缓存就会带来不必要的复杂性,同时还增大了数据不一致引发错误的概率。比如,MySQL 为避免自身缓存与 Page Cache 的重合,就使用直接 IO 绕过了磁盘高速缓存。
缓存提升性能的幅度,不只取决于存储介质的速度,还取决于缓存命中率。为了提高命中率,缓存会基于时间、空间两个维度更新数据。在时间上可以采用 LRU、FIFO 等算法淘汰数据,而在空间上则可以预读、合并连续的数据。如果只是简单地选择最流行的缓存管理算法,就很容易忽略业务特性,从而导致缓存性能的下降。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文全面总结了缓存的应用场景和数据更新策略,以及Nginx如何防止缓存穿透的解决方案。缓存在分布式系统中扮演着重要角色,能够显著提升系统性能。文章首先介绍了硬件访问速度的差异,以及缓存在提升系统性能方面的重要性。随后详细讨论了缓存的应用场景,包括浏览器本地缓存、操作系统内核中的TCP缓冲区、负载均衡中的TLS握手缓存等。此外,还介绍了在不同应用中如何使用缓存,比如在Django中使用视图缓存和中间件缓存SQL查询结果。文章重点讨论了缓存的数据更新原理,包括基于时间和空间两个维度的数据更新策略。此外,还详细介绍了Nginx如何防止流量打穿缓存的解决方案,包括合并回源功能和过期缓存功能。总的来说,本文通过全面总结缓存的应用场景和数据更新策略,为读者提供了深入了解缓存技术的重要知识。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《系统性能调优必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • 唐朝首都
    缓存在总是被修改、失效的情况下,容易造成系统性能不升反降。

    作者回复: 对的!

    2020-07-08
    13
  • test
    老师,问个问题,通常用redis做mysql的缓存,按照这篇文章来说的话,会在mysql上面再加一个nginx再做一层缓存么?

    作者回复: 不会,MySQL本身就有缓存,很高效,所以一般数据库前不加缓存的,如果数据库前有Proxy(例如MyCAT),主要是用来做分库分表的

    2020-07-08
    2
    3
  • rfyiamcool
    通常在cdn场景下建议采用递增文件名,cdn也支持预缓存接口,上线前可以把文件推过去,让cdn预热多级缓存。对于大文件大视频也可做到分片缓存,无需等缓存更新完毕才返回。😄

    作者回复: 很棒的分享!

    2020-08-24
    2
  • Geek_007
    课后题,典型的例子,dns缓存,这玩意总是更新不及时,老讨厌了。非常影响可用性😂

    作者回复: 是的,在网络传输成本不断下降的当下,需要改进

    2020-07-08
    3
    2
  • leslie
    可能有一点不是特别理解:redis+nginx其实这套方案并不好,尤其如果有些非常耗费资源的应用不多且重要的话。 其实是通过追加sftp之类的把这部分资源落地到服务器,从而减少了数据系统查询的资源消耗。

    作者回复: 没太明白你的意思哈。我的理解是,nginx缓存的粒度很大,它的Key是URL,Value是文件或者响应,通常是最外层的缓存,Redis缓存的粒度很小,一般是OO对象。

    2020-07-23
    1
  • 赖阿甘
    陶辉老师,买了您两个课程,还有一个《抓包实战》,并且还关注了您的博客。说实在,被你的专业和对于所讲课程的敬业,能看出来您这是毫无保留的倾囊相授。学生很想认识你,不知可以要一个联系方式吗,我买了30多个课程,这是我唯一一次大胆地找老师要联系方式。不知为啥,有种感觉你在生活中就是个亦师亦友的角色,哈哈哈哈哈哈哈哈哈哈哈哈哈

    编辑回复: 哈哈,陶老师在极客时间啊,你在这里联系他

    2020-07-08
    1
  • J.Smile
    一般的缓存都是为了对付读多写少,但是mysql的ChangeBuffer是读少写多更实用。原因是: Mysql的普通索引场景下,Update更新操作会记录在ChangeBuffer下,等到访问数据时、或者shutdown数据库时会进行merge合并成记录的最新值,后台也会有线程定时执行Merge操作。ChangeBuffer对更新的加速作用,只限于用在普通索引的场景下,只限于写多读少的场景下,因为写完就读取会触发Merge到原始数据的动作,就失去意义了。
    2020-07-09
    5
  • 蚂蚁
    老师有个问题请教下,两种数据淘汰策略,是说数据也要存放在这两类数据结构中吗?这两种数据的查找效率都不高,是我理解错了吗
    2020-07-15
    1
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部