说明

讲师:李智慧

缓存 Cache

缓存:存储在计算机上的一个原始数据复制集,以便于访问。 – 维基百科

缓存是介于数据访问者和数据源之间的一种高速存储,当数据需要多次读取的时候,用于加快读取的速度。

缓存(Cache) 和 缓冲(Buffer) 的分别?
缓存:一般是为了数据多次读取。

缓冲:比如CPU把数据写到硬盘,因为硬盘比较慢,先到缓冲设备Buffer(比如内存),Buffer读和写都需要。

无处不在的缓存

  • CPU 缓存

  • 操作系统缓存

  • 数据库缓存

  • JVM 编译缓存

  • CDN 缓存

  • 代理与反向代理缓存

  • 前端缓存

  • 应用程序缓存

  • 分布式对象缓存

缓存数据存储(Hash表)


缓存数据存储:一般数据放到内存中。
主要是存储数据结构:Hash表
业界缓存数量:百万级~亿级

缓存的关键指标

缓存命中率

  • 缓存是否有效依赖于能多少次重用同一个缓存响应业务请求,这个度量指标被称作缓存命中率。
  • 如果查询一个缓存,十次查询九次能够得到正确结果,那么它的命中率是 90%.

影响缓存命中率的主要指标

  • 缓存键集合大小
  • 缓存可使用内存空间
  • 缓存对象生存时间

缓存键集合大小

缓存中的每个对象使用缓存键进行识别,定位一个对象的唯一方式就是对缓存键执行精确匹配。例如,如果想为每个商品缓存在线商品信息,你需要使用商品 ID 作为缓存键。换句话说,缓存键空间是你的应用能够生成的所有键的数量。从统计数字上看,应用生成的唯一键越多,重用的机会越小。例如,如果想基于客户 IP 地址缓存天气数据,则可能有多大 40 亿个键(这是所有可能 IP 地址的数量)。如果要基于客户来源国家缓存天气数据,则可能仅需几百个缓存键(世界上所有国家的数量)。一定要想办法减少可能的缓存数量。键数量越少,缓存的效率越高。

缓存可使用内存空间

缓存可使用内存空间直接解决了缓存对象的平均大小和缓存对象数量。因为缓存通常存储在内存中,缓存对象可用空间受到严格限制且相对昂贵。如果想缓存更多的对象,就需要先删除老的对象,再添加新的对象。清除对象会降低缓存命中率,因为缓存对象被删除后,将来的请求就无法命中了。物理上能缓存的对象越多,缓存命中率就越高。

缓存对象生存时间

缓存对象生存时间称为TTL(Time To Live)。在某些场景中,例如,缓存天气预报数据 15 分钟没问题。在这个场景下,你可以设置缓存对象定义 TTL 为 15 分钟。在其它场景中,你可能不能冒险使用过于陈旧的数据。例如,在一个电子商务系统中,店铺管理员可能在任何时刻修改商品价格,如果这些价格需要准确地展示在整个网站中。在这个场景下,你需要在每个商品价格修改是让缓存失效。简单讲,对象缓存的时间越长,缓存对象被重用的可能性就越高。

代理缓存

反向代理缓存

多层反向代理缓存

内容分发网络(CDN - Content Distribution Network)


CDN国内公司:ChinaCache在08年的时候,互联网需求量很大的时候,ChinaCache差点垮掉。ChinaCache提前买了很多CDN服务器放到运营商(中国移动、电信)。但是优酷、土豆等互联网公司快速发展,他们也选择了自建,自己买CDN服务器放到运营商机房。

小网站:云服务提供。
大网站:Alibaba、腾讯等都是自建CDN。

CDN 同时配置静态文件和动态内容

通读缓存(Read-Through)

  • 代理缓存,反向代理缓存,CDN 缓存都是通读缓存。
  • 通读缓存给客户端返回缓存资源,并在请求未命中缓存时获取实际数据。
  • 客户端连接的是通过缓存而不是生成相应的原始服务器。

旁路缓存(Cache-Aside)

  • 对象缓存是一种旁路缓存,旁路缓存通常是一个独立的键值对(Key-Value)存储。
  • 应用代码通常会询问对象缓存需要的对象是否存在,如果存在,它会获取并使用缓存的对象,如果不存在或已过期,应用会连接主数据源来组装对象,并将其保存回对象缓存中以便将来使用。

浏览器对象缓存

// 在 WebStorage 中缓存对象的 JavaScript 代码
var preferences = { /* data object to be stored    */ };
localStorage.setItem('preferences', JSON.stringify(preferences));// 访问缓存对象的 JavaScript 代码
var cachedData = localStorage.getItem('preferences');
var preferences = JSON.parse(cachedData);

本地对象缓存

  • 对象直接缓存在应用程序内存中。
  • 对象存储在共享内存,同一台机器的多个进程可以访问它们。
  • 缓存服务器作为独立应用和应用程序部署在同一个服务器上。

本地对象缓存构建分布式集群


小规模可以满足需求,比如Session数据缓存。
大规模不合适:

  1. 因为是数据都是同步的,那么数据存储的数量比较少。
  2. 数据同步,暂用比较大的网络带宽。

远程分布式对象缓存

Memcached 分布式对象缓存

// PHP 客户端访问 Memcached 集群
$m = new Memcached();
// 添加服务器集群
$cache->addServers(array(array('cache1.example.com', 11211);array('cache2.example.com', 11211);array('cache3.example.com', 11211);
));
// 写缓存,失效时间 5 分钟
$m->set('userCount', 123, 600);

Memcached 分布式缓存访问模型


集群是分布式的子集。
集群,提供相同功能服务器构建了集群,共同对外提供服务。

怎么知道缓存放到集群中哪台服务器呢?

  • 集群路由选择,由路由算法决定。
  • 集群的伸缩性(添加,剔除服务器)

路由算法:

  1. 服务器地址记录到数组列表里面。
  2. 对Key转换为Hash值,Hash值对服务器总数取模,得到的余数,就是存储到数组中指定的服务器。

集群的伸缩性面临的问题:
比如以前只有3台缓存服务器,现在加了一台,变成4台缓存服务器。以前模3,现在模4,那么以前的绝大部分缓存都找不到了。就会导致服务直接访问数据库,就会没法及时反应,当前服务会阻塞,上层的服务也会阻塞。这会导致缓存击穿,增加数据库访问压力,导致整个应用服务瘫痪,也是常说的集群雪崩。

解决方案:一致性 Hash

分布式对象缓存的一致性 Hash 算法


模哈希的最大的值,2^32次方,服务器放到环的节点上,顺时针找到余数距离最近的服务器。比如100台服务器,增加1台大道101台,那么只有1%的数据访问不到。

有个问题:路由选择导致有的服务器命中很高,比如一台服务器的缓存占了70%,其它99台机器才缓存了30%。
解决:基于虚拟节点的一致性 Hash 算法

基于虚拟节点的一致性 Hash 算法


一个实体服务器V0, 那么可以虚拟出5台虚拟节点,比如V0.0, V0.1, V0.2, V0.3, V0.4, V0.5,比较均匀地分布在环上,别的实体服务器也做相同的操作,最终就能平均缓存命中概率。

虚拟节点一致性 Hash 算法,能到到存储负载的均衡性。

各种介质数据访问延迟


缓存比数据库访问速度快100倍。请求1k数据,分布式缓存约需要500微妙,数据库大概需要50毫秒。

技术栈各个层次的缓存

缓存为什么能显著提升性能

  • 缓存数据通常来自内存,比磁盘上的数据有更快的访问速度。
  • 缓存存储数据的最终结果形态,不需要中间计算,减少 CPU 资源的消耗。
  • 缓存降低数据库、磁盘、网络的负载压力,使这些 I/O 设备获得更好的响应特性。

缓存是系统性能优化的大杀器

  • 技术简单
  • 性能提升显著
  • 应用场景多

合理使用缓存

使用缓存对提高系统性能有很多好处,但是不合理的使用缓存可能非但不能提高系统的性能,还会成为系统的累赘,甚至风险。实践中,缓存滥用的情节屡见不鲜 – 过分依赖缓存、不合适的数据访问特性等。

频繁修改的数据:这种数据如果缓存起来,由于频繁修改,应用还来不及读取就已经失效或更新,徒增系统负担。一般说来,数据的读写比在 2:1 以上,缓存才有意义。

LRU(Least Recently Used)最近最少使用到的 算法

没有热点的访问:缓存使用内存作为存储,内存的资源宝贵而有限,不能将所有数据都缓存起来,如果应用系统访问数据没有热点,不遵循二八定律,即大部分数据访问不是集中在小部分数据上,那么缓存就没有意义,因为大部分数据还没有被再次访问就已经被挤出缓存了。

纠错:这里的FIFO队列应该改为FIFO链表。

数据不一致与脏读

一般会对缓存的数据设置失效时间,一旦超过失效时间,就要从数据库重新加载。因此应用要容忍一定时间的数据不一致,如卖家已经编辑了商品属性,但是需要过一段时间才能被买家看到。在互联网应用中,这种延迟通常是可以接受的,但是具体应用仍需慎重对待。还要一种策略是数据更新时立即更新缓存,不过也会带来更多系统开销和事务一致性的问题。因此数据更新时通知缓存失效,删除该缓存数据,是一种更加稳妥的做法。

“计算机科学中只有三件事最困难:缓存失效,命名事物,技术错误。” – Phil Karlton

缓存雪崩

缓存是为了提高数据读取性能的,缓存数据丢失或者缓存不可用不会影响到应用程序的 – 它可以从数据库直接获取数据。但是随着业务的发展,缓存承担大部分的数据访问压力,数据库已经习惯了有缓存的日子,所以当缓存服务崩溃的时候,数据库会因为完全不能承受如此大的压力而宕机,进而导致整个网站不可用。这种情况,被称作缓存雪崩,发生这种故障,甚至不能简单的重启缓存服务和数据库服务器来回复网站访问。

缓存预热

缓存中存放的是热点数据,热点数据又是缓存系统利用 LRU (最近最久未用)算法对不断访问的数据筛选淘汰出来的,这个过程需要花费较长的时间,在这段时间,系统的性能和数据库负载都不太好,那么最好的缓存系统启动的时候就把热点数据加载好,这个缓存预加载叫做缓存预热(Warm up)。对于一些元数据,比如城市地名列表、类目信息,可以启动时加载数据库中全部数据到缓存进行预热。

缓存穿透

如果不恰当的业务、或者恶意攻击持续高并发的请求某个不存在的数据,因为缓存没有保存该数据,所有的请求都会落到数据库上,会对数据库造成很大的压力,甚至崩溃。一个简单的对策是将不存在的数据也缓存起来(其Value值为null),并设定一个较短的失效时间。

Redis

Redis vs Memcached

  • Redis 支持复杂的数据结构
  • Redis 支持多路复用异步 I/O 高性能
  • Redis 支持主从复制高可用
  • Redis 原生集群与 Share Nothing 集群模式

Redis 集群

  • Redis 集群预分好 16384 个桶,当需要在 Redis 集群中放置一个 Key-Value 时,根据 CRC16(key) mode 16384 的值,决定将一个key放到哪个桶中。
  • Redis-Cluster 把所有的物理节点映射到 [0-16383] Slot上(不一定是平均分配),Cluster负责维护 Slot 与服务器的映射关系。
  • 客户端与 Redis 节点直连,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
  • 所有的 Redis 节点彼此互联。

极客大学架构师训练营 系统架构 分布式缓存 一致性哈希 Hash 第9课 听课总结相关推荐

  1. 什么是系统架构师,系统架构师应具备哪些能力?

    目录 什么是系统架构师? 系统架构师应具备哪些能力? 什么是系统架构师? 系统架构师是一个既需要掌控整体,又需要洞悉局部瓶颈,并依据具体的业务场景给出解决方案的团队领导型人物.一个架构师需要有足够的想 ...

  2. 极客大学产品经理训练营 产品文档和原型 作业4

    作业 [本周作业]写一个用例,挑一个:你自己的产品 / 你喜欢的产品 / [拍东西]发起拍卖/ [知识星球]加入星球/ [极客时间]购买课程: 1. 标题作者修改历史 标题:[极客时间]购买课程 作者 ...

  3. 极客大学产品经理训练营:业务流程与产品文档 第11课总结

    讲师:邱岳 1. 原型图 1.1 手绘图 + Scanner Pro 1.2 线框图 1.3 高保真产品图 1.4 做原型图的目的 坍缩:规划时梦到自己成了乔布斯,赶紧画个图让自己冷静冷静: 具体:具 ...

  4. 极客大学产品经理训练营:产品文档和原型咋弄 - 流程图 第9课总结

    讲师:邱岳 1. 图的意义 流程图.活动图.时序图.状态图,本次聚焦于过程和行为描述. 提效.宏观.点睛. 梳理思路 用例:做什么? 流程图:怎么做? 2. 流程图.活动图.时序图 3. 动手画 – ...

  5. 极客大学产品经理训练营 极客时间购买课程-大作业

    1. 标题作者修改历史 标题:[极客时间]购买课程 作者 历史 时间 易筋 创建 2021-01-09 易筋 添加购买流程图6 2021-03-02 易筋 添加购买时序图7 2021-03-16 2. ...

  6. 极客大学产品经理训练营:数据分析与商业分析,商业分析到业务分析 第18课总结

    讲师:邱岳 1. 产品经理眼中的利润.成本.收入 利润 = 收入 - 成本 奶茶利润率极高,达到60%左右.但是奶茶盈利比较难. 所有买水的产品利润率都极高,比如可口可乐,咖啡,奶茶等. 案例:有个面 ...

  7. 京东架构师最新出品《分布式缓存原理到实战剖析手册》,限时开源

    分布式缓存所带来的诸多问题 当下互联网领域的软件系统,毫不夸张地说已经成为分布式系统的天下. 随着现代应用对速度的要求越来越高,对缓存机制的使用也越来越常见.越来越频繁.分布式的语境给系统的开发与设计 ...

  8. 极客大学产品经理训练营:业务架构与概念模型 第10课总结

    讲师:邱岳 1. 什么是状态图 系统中的概念或对象随着一些事件的发生,改变了状态,通常这个状态比较多.比较复杂时,我们需要用状态图来表示他们的边界,以及触发状态转换的活动. 2. 动手画 – 员工状态 ...

  9. 极客大学产品经理训练营 解决方案的设计与积累 第6课总结

    说明 讲师:邱岳(二爷) 1. 解决方案 解决方案的前提是明确了 利益相关者 和 待解决的问题 出解决方案是产品经理的天职,不要直接转发 注意 X-Y Problem,核心关注 X 大量的练习/模仿/ ...

  10. 极客大学产品经理训练营 认识产品经理下 第2课总结

    说明 讲师:邱岳(二爷) 分享提纲 互联网产品经理的能力模型 互联网产品经理的个人素质 产品经理的特质与气场 互联网产品经理的职业发展阶段与晋级之路 互联网产品经理的若干真相 1. 产品经理的能力模型 ...

最新文章

  1. 计算机网络谢希仁第七版课后答案第五章 传输层
  2. php cgi windows7安装,PHP For Windows64位
  3. 除了数据属性,Vue 实例还提供了一些有用的实例属性与方法。它们都有前缀 $,以便与用户定义的属性区分开来。
  4. 20181009-9 每周例行报告
  5. 三个箭头循环标志_沧州交通标志杆直销
  6. spring----注解
  7. 2021年中国家装行业数字化转型研究报告
  8. redhat9.0配置apache 出现乱码
  9. Hadoop MapReduce编程 API入门系列之压缩和计数器(三十)
  10. 领域驱动 开源项目_在开源领域建立职业的建议
  11. python分词训练_python练习17:用jieba分词做关键词提取,用matplotlib做可视化
  12. mysql新浪微盘_Android62期视频教程全集下载
  13. freeswitch php esl,FreeSWITCH增加PHP ESL模块支持
  14. 【建议收藏】产品经理面试题合集
  15. 小米手机扩容教程_手机内部存储空间扩容方法
  16. ARD智能电动机控制器在苯乙烯生产过程中的应用
  17. 苹果电脑(mac)的快捷键大全
  18. Python for 循环遍历字符串
  19. orcale 基本語法
  20. Trimble Yuma超级掌上计算机实机感受

热门文章

  1. 计算机制作培训通知知识点,计算机学习计划(通用3篇)
  2. inline-block从入门到精通
  3. 新的文档类型定义模型带来的问题--javascirpt/CSS
  4. 如何添加、管理和删除PDF高亮文本?
  5. HTTP 连接管理进化论
  6. 如何关闭135、137、138、139、445端口方法
  7. 第十章 Scala 容器基础(二十二):合并有序集合
  8. 南洋理工 OJ 115 城市平乱 dijstra算法
  9. eNSP 华为模拟器更新说明
  10. 动态添加gridview行【转:http://www.cnblogs.com/oec2003/articles/1069796.html】