后端技术面试38讲
李智慧
同程艺龙交通首席架构师,前Intel&阿里架构师,《大型网站技术架构》作者
立即订阅
4026 人已学习
课程目录
已更新 37 讲 / 共 38 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 掌握软件开发技术的第一性原理
免费
软件的基础原理 (8讲)
01丨程序运行原理:程序是如何运行又是如何崩溃的?
02丨数据结构原理:Hash表的时间复杂度为什么是O(1)?
03丨Java虚拟机原理:JVM为什么被称为机器(machine)?
04丨网络编程原理:一个字符的互联网之旅
05丨文件系统原理:如何用1分钟遍历一个100TB的文件?
06丨数据库原理:为什么PrepareStatement性能更好更安全?
07丨编程语言原理:面向对象编程是编程的终极形态吗?
答疑丨Java Web程序的运行时环境到底是怎样的?
软件的设计原理 (14讲)
08丨软件设计的方法论:软件为什么要建模?
09丨软件设计实践:如何使用UML完成一个设计文档?
10 | 软件设计的目的:糟糕的程序员比优秀的程序员差在哪里?
11丨软件设计的开闭原则:如何不修改代码却能实现需求变更?
12 | 软件设计的依赖倒置原则:如何不依赖代码却可以复用它的功能?
13丨软件设计的里氏替换原则:正方形可以继承长方形吗?
14 | 软件设计的单一职责原则:为什么说一个类文件打开最好不要超过一屏?
15丨软件设计的接口隔离原则:如何对类的调用者隐藏类的公有方法?
16 | 设计模式基础:不会灵活应用设计模式,你就没有掌握面向对象编程
17 | 设计模式应用:编程框架中的设计模式
18 | 反应式编程框架设计:如何使程序调用不阻塞等待,立即响应?
19 | 组件设计原则:组件的边界在哪里?
20 | 领域驱动设计:35岁的程序员应该写什么样的代码?
答疑丨对于设计模式而言,场景到底有多重要?
架构的核心原理 (13讲)
21丨分布式架构:如何应对高并发的用户请求
22 | 缓存架构:如何减少不必要的计算?
23 | 异步架构:如何避免互相依赖的系统间耦合?
24 | 负载均衡架构:如何用10行代码实现一个负载均衡服务?
25 | 数据存储架构:如何改善系统的数据存储能力?
26 | 搜索引擎架构:如何瞬间完成海量数据检索?
27 | 微服务架构:微服务究竟是灵丹还是毒药?
28 | 高性能架构:除了代码,你还可以在哪些地方优化性能?
29 | 高可用架构:我们为什么感觉不到淘宝应用升级时的停机?
30 | 安全性架构:为什么说用户密码泄漏是程序员的锅?
31 | 大数据架构:大数据技术架构的思想和原理是什么?
32 | AI与物联网架构:从智能引擎到物联网平台
33 | 区块链技术架构:区块链到底能做什么?
不定期加餐 (1讲)
加餐 | 软件设计文档示例模板
后端技术面试38讲
登录|注册

22 | 缓存架构:如何减少不必要的计算?

李智慧 2020-01-13
上一篇我们讲到,互联网应用的主要挑战就是在高并发情况下,大量的用户请求到达应用系统服务器,造成了巨大的计算压力。互联网应用的核心解决思路就是采用分布式架构,提供更多的服务器,从而提供更多的计算资源,以应对高并发带来的计算压力及资源消耗。
那么有没有办法减少到达服务器的并发请求压力呢?或者请求到达服务器后,有没有办法减少不必要的计算,降低服务器的计算资源消耗,尽快返回计算结果给用户呢?
有,解决的核心就是缓存。
所谓缓存,就是将需要多次读取的数据暂存起来,这样在后面,应用程序需要多次读取的时候,就不必从数据源重复加载数据了,这样就可以降低数据源的计算负载压力,提高数据响应速度。
一般说来,缓存可以分成两种,通读缓存和旁路缓存。
通读(read-through)缓存,应用程序访问通读缓存获取数据的时候,如果通读缓存有应用程序需要的数据,那么就返回这个数据;如果没有,那么通读缓存就自己负责访问数据源,从数据源获取数据返回给应用程序,并将这个数据缓存在自己的缓存中。这样,下次应用程序需要数据的时候,就可以通过通读缓存直接获得数据了。
通读缓存在架构中的位置与作用如下图:
旁路(cache-aside)缓存,应用程序访问旁路缓存获取数据的时候,如果旁路缓存中有应用程序需要的数据,那么就返回这个数据;如果没有,就返回空(null)。应用程序需要自己从数据源读取数据,然后将这个数据写入到旁路缓存中。这样,下次应用程序需要数据的时候,就可以通过旁路缓存直接获得数据了。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《后端技术面试38讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(4)

  • holybell
    关于思考题,使用Memcached服务器数量参与hash余数算法,会导致服务器数量增减的时候,相同的路由被重新计算到不同的机器上,这就会导致每次增删Memcached服务器的时候,会导致大量的缓存失效,针对这个问题可以采用一致性哈希算法,将所有的服务器连接成一个逻辑上的环,采用一个不会改变运算逻辑的hash函数,当一个key计算出hash值的时候落到环上的某一个点,之后顺时针找到最近的一个服务器即可,这样即使删除Memcached服务器,只会导致该服务器的缓存转移到环上下一个点的服务器上,不会导致几乎整个Memcached集群缓存的失效;同时如果是增加Memcached机器,那么相当于从环路上的某个机器匀了一部分数据到新机器上,旧机器的缓存可以配合过期策略自动删除。
    2020-01-13
    2
    9
  • 俊杰
    会导致大量缓存不命中,可以用一致性哈希算法解决
    2020-01-13
    1
  • 旅途
    一致性hash
    2020-01-30
  • 草原上的奔跑
    通读缓存、旁路缓存,第一次对缓存有了明确的认知。hash算法在扩缩容时会导致绝大多数缓存失效,这是它的问题。使用一致性hash算法可以降低失效缓存的数量,改善缓存的效率。但一致性hash也有自己的问题,比如平衡性问题等,又会针对这些问题提出解决方案。

    之前看一些架构性的内容,不知道为何要这样做。听了李老师娓娓道来的讲述,明白了架构的演进,心里有些底,不再是飘在空中的感觉
    2020-01-16
收起评论
4
返回
顶部