架构师训练营第 5 周总结
现代互联网应用需要频繁读取数据,导致数据库的负荷比较大,可以使用缓存的方法来解决。
缓存:缓存是介于数据访问者和数据源之间的一种高速存储,当数据需要多次读取的时候,用 于加快读取的速度。
缓存采用 hash 表的方式进行存储,因此可以快速查找。
缓存命中率: 缓存是否有效依赖于能多少次重用同一个缓存响应业务请求,这个度量指标被称作缓存命中 率。 如果查询一个缓存,十次查询九次能够得到正确结果,那么它的命中率是 90%。
影响缓存命中率的主要指标
缓存键集合大小 ;
缓存可使用内存空间 ;
缓存对象生存时间;
缓存的存储方式:
通读缓存:
• 代理缓存,反向代理缓存,CDN 缓存都是通读缓存。
• 通读缓存给客户端返回缓存资源,并在请求未命中缓存时获取实际数据。
• 客户端连接的是通读缓存而不是生成响应的原始服务器。
旁路缓存
• 对象缓存是一种旁路缓存,旁路缓存通常是一个独立的键值对(key-value)存储。 • 应用代码通常会询 • 问对象缓存需要的对象是否存在,如果存在,它会获取并使用缓存 的对象,如果不存在或已过期, 应用会连接主数据源来组装对象,并将其保存回对象 缓存中以便将来使用。
解决分布式对象缓存服务器扩容和负载均衡的算法:一致性 hash 算法。
缓存为什么能显著提升性能
• 缓存数据通常来自内存,比磁盘上的数据有更快的访问速度。
• 缓存存储数据的最终结果形态,不需要中间计算,减少 CPU 资源的消耗。
• 缓存降低数据库、磁盘、网络的负载压力,使这些 I/O 设备获得更好的响应特性。
缓存应用注意事项:
数据的读写比在 2:1 以上,缓存才有意义
数据访问有热点,符合二八定律;
数据不一致与脏读:一般会对缓存的数据设置失效时间,一旦超过失效时间,就要从数 据库中重新加载。因此应用要容忍一定时间的数据不一致,如卖家已经编辑了商品属性, 但是需要过一段时间才能被买家看到。在互联网应用中,这种延迟通常是可以接受的, 但是具体应用仍需慎重对待。还有一种策略是数据更新时立即更新缓存,不过也会带来 更多系统开销和事务一致性的问题。因此数据更新时通知缓存失效,删除该缓存数据, 是一种更加稳妥的做法。
缓存雪崩:缓存是为了提高数据读取性能的,缓存数据丢失或者缓存不可用不会影响到 应用程序的处——它可以从数据库直接获取数据。但是随着业务的发展,缓存会承担大 部分的数据访问压力,数据库已经习惯了有缓存的日子,所以当缓存服务崩溃的时候, 数据库会因为完全不能承受如此大的压力而宕机,进而导致整个网站不可用。
缓存预热:缓存中存放的是热点数据,热点数据又是缓存系统利用 LRU(最近最久未用) 算法对不断访问的数据筛选淘汰出来的,这个过程需要花费较长的时间,在这段时间, 系统的性能和数据库负载都不太好,那么最好在缓存系统启动的时候就把热点数据加载 好,这个缓存预加载手段叫做缓存预热(warm up)。
缓存穿透:如果不恰当的业务、或者恶意攻击持续高并发的请求某个不存在的数据,因 为缓存没有保存该数据,所有的请求都会落到数据库上,会对数据库造成很大的压力, 甚至崩溃。一个简单的对策是将不存在的数据也缓存起来(其 value 值为 null),并设 定一个较短的失效时间。
解决系统中写的性能问题-消息队列和异步
同步调用需要在发送消息后进行等待,耗时久。可以采用异步调用的方式,发送消息后无需等待。
消息队列列构建异步调用架构的模型:点对点模型/发布订阅模型
消息队列的好处
实现异步处理,提升处理性能
更好的伸缩性
削峰填谷
失败隔离和自我修复
解耦:发送消息方和读取消息方解耦
评论