性能优化高手课
尉刚强
资深软件设计咨询顾问
19574 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
性能优化高手课
15
15
1.0x
00:00/00:00
登录|注册

04 | 缓存设计:做好缓存设计的关键是什么?

你好,我是尉刚强,今天我们来聊聊基于性能的缓存设计。
缓存就是一个临时储存数据的地方。当用户查询数据时,首先会在缓存中查找,如果找到了就直接使用;如果找不到,就再到数据的原始位置去寻找。所以,缓存本质上是一种用空间换时间的技术,通过数据在空间上的重复,来提升数据的访问速度。
不过,随着分布式和云计算技术的发展,数据存储技术也发生了翻天覆地的变化,而且不同存储技术在价格和性能上都存在很大的差异,所以在针对性能进行软件设计时,如果我们没有做好多层级的缓存设计,不仅可能浪费钱,而且获取的性能收益可能也不够理想。
所以在今天的课程上,我会结合互联网应用与服务场景,给你讲解如何做好缓存设计,并会剖析典型的缓存使用案例,帮助你建立起缓存技术原理的系统认识,以此指导你在产品的软件设计中,可以正确使用缓存来提升系统的性能。

缓存设计的通关之路

那么首先,我想从两个问题开始,来带你了解下缓存设计要在什么时候做,以及通过不同数据类型的特性对比分析,来跟你一起探讨如何才能做好缓存设计。
好,第一个问题:在互联网应用服务中,使用缓存技术的目的就只是为了提升访问速度吗?
其实我认为,并不是所有的缓存都只是为了提升速度,因为在分布式系统中,缓存机制实际上是系统级性能设计的一个重要权衡手段。比如当某个数据库的负载比较高,接近系统瓶颈时,我们就可以使用缓存技术,把负荷分担到其他数据库中,那么这里使用缓存的目的,主要就是负载均衡,而不是提升访问速度。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了缓存设计在互联网应用与服务场景中的关键要点。作者首先提出了缓存的目的不仅是提升访问速度,还需要识别对性能影响较大的数据类型。随后详细介绍了三种需要缓存机制的数据种类:不变性数据、弱一致性数据和强一致性数据,并提出了相应的缓存设计方法。此外,还介绍了性能评估模型和缓存设计的典型使用场景。针对静态页面的缓存设计,建议将静态缓存放到距离用户近的地方,以减少页面数据在网络上的传输时延。对于数据库的多级缓存机制,建议识别出可以使用缓存机制的数据,并选择并设计缓存实现机制。总结时,读者可以结合学习内容,识别系统中可缓存的数据类型,有针对性地设计缓存方案,并根据评估模型进行性能验证分析。在具体的缓存技术实现中,需要选择合适的配置和策略。思考题则引发读者对一致性要求较高的数据信息在微服务多实例架构中是否可以选择使用内存Cache的思考。

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

全部留言(5)

  • 最新
  • 精选
  • 青山
    可以使用,比如作者所说的静态资源但是这就会引出例外一个问题:内存资源消耗 ,因为需要保证每个微服务中的内存cache必需都有,有点得不偿失.

    作者回复: 所以需要在内存和速度之间权衡,很多时候,当客户对响应速度更关注的时候,就可以使用这种权衡手段。

    2021-06-07
    1
  • 落叶之葉
    我们做一个商品价格展示,影响价格的维度有很多,地区,人员类型,批次,等等,目前数据写入到solr库来,最大的问题就是数据库数据提取到solr中

    作者回复: solr本来就擅长多维度存储数据,你的调整是识别哪些维度需要保存吧?

    2021-06-01
  • Ming☀
    内存cache只在当前进程下可使用,分布式多实例无法共享

    作者回复: 是的!不过有些数据是不需要共享的

    2021-05-27
  • raisecomer
    "在分布式系统中,缓存机制实际上是系统级性能设计的一个重要权衡手段........可以使用缓存技术,把负荷分担到其他数据库中",缓存技术是如何把负荷分担到其它数据库的呢?

    作者回复: 缓存可以讲部分请求负载(吞吐量)从原始数据库中卸载下来,转移到缓存中。

    2021-05-26
    3
  • Joe Black
    一个折中的办法是多个微服务实例基于缓存对象的hash进行缓存,就是一个对象一定只在特定实例上缓存,更新读取都通过它。不过这对服务的水平扩展有一定不便吧。
    2022-09-11归属地:北京
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部