第五周总结
缓存Cache
定义
存储在计算机上的一个原始数据集,以便于访问 — 来自维基百科
介于数据访问者和数据源之间的一种高速存储,当数据需要多次读取的时候,用于加快读取的速度;
场
CPU缓存
操作系统缓存
数据库缓存
JVM编译缓存
CDN缓存
代理与反向代理缓存
前端缓存
应用程序缓存
分布式对象缓存
缓存数据存储(Hash表)
缓存的关键指标
缓存命中率
概念:
缓存是否有效依赖于能多少次重用同一个缓存相应业务请求,这个度量指标被称作缓存命中率
影响命中率的主要指标:
缓存键集合大小 — 缓存中的每个对象使用缓存键进行识别,定位一个对象的唯一方式就是对缓存键执行精确匹配,一定要想办法减少可能的缓存键数量;键数量越少,缓存的效率越高
代理缓存 — 代理用户、客户端上网;
反向代理缓存 — 代理服务器对外提供服务;
多层反向代理缓存 — restful风格,这个路径就是天然的缓存,特别适合做反向代理
内容分发网络(CDN) — 视频流量网站 + 静态资源访问的url和动态资源访问的url不一样
CDN同时配置静态文件和动态内容 — 由CDN来决定动态资源访问服务器、静态资源访问云服务器
缓存的大分类
通读缓存(read-through)
代理缓存、反向代理缓存、CDN缓存都是通读缓存
通读缓存给客户返回缓存资源,并在请求未命中缓存时获取实际数据
客户端连接的是通读缓存而不是生成相应的原始服务器
旁路缓存
既要连接原始服务器有要连接缓存,查询数据的时候,先去缓存中查找如果不存在,则直接去服务器中查询,将查询到的数据插入到缓存中;
有分支旁路;
通常是对象缓存(浏览器缓存、本地对象缓存)
本地对象缓存
缓存就应该按照缓存的职责去工作,纯粹的功能和使用
分布式对象缓存的一致性hash算法
一致性Hash环,从0开始到2的32次方-1
每个服务器的节点取hash值,直接方法Hash环上;
从key到服务器的路由算法,根据key计算hash,然后在环上找到顺时针最近的节点;
加新节点对于数据的影响比较少,节点越多影响的数据越少,如下图:
分布式缓存的负载不均衡
解决方案:基于虚拟节点的一致性Hash算法
把服务器一个节点边城一组虚拟节点
各种介质数据访问延迟
缓存访问的粗略时间 0.5毫秒
数据库访问的粗略时间 50毫秒
技术栈各个层次的缓存
缓存提升性能
缓存数据通常来自内存,比磁盘上的数据有更快的访问速度
缓存存储数据的最终形态,不需要中间计算,减少CPU资源的消耗
缓存降低数据、磁盘、网络的负载压力,使系统整体性能变强
缓存的优势
技术简单
性能提升显著
应用场景多
需要读的地方都可以考虑使用缓存
频繁修改的数据不适合缓存:一般说来数据的读写比在2:1以上,缓存才有意义;
没有热点的访问:缓存使用内存作为内存,内存资源宝贵二有限,不能将所有的数据都缓存起来,如果应用系统访问数据没有热点,不遵循二八定律,即大部分数据访问不是集中在小部分数据上,那么缓存就没有意义,因为大部分数据还没有被再次访问就已经被寄出缓存了。
数据不一致与脏读:如卖家已经编辑了商品属性,但是需要过一段时间才能被买家看到。在互联网应用中,这种延迟通常是hi可以接受的,但是具体应用仍需谨慎对待或者在数据更新时通知缓存失效,删除该缓存数据,是一种更加稳妥的做法;
缓存雪崩:缓存正常情况下会承担大部分数据访问压力,数据库已经习惯了有缓存的日子,所以当缓存服务奔溃的时候,数据库会因为完全不能承受如此大的压力而宕机,进而导致整个网站不可用。
缓存预热: 对于一些元数据如城市地名列表、类目信息,可以启动时加载数据库中全部数据到缓存进行预热。缓存中存放的是热点数据,而热点数据是缓存系统利用LRU算法对不断访问的数据筛选淘汰出来的,这个过程需要花费较长的时间,在这段时间内,系统的性能和数据库负载都不太好,那么最好在缓存系统启动的时候就把热点数据加载好,这个过程就叫缓存预热;
缓存穿透(是一种攻击):如果不恰当的业务或者恶意攻击持续高并发的请求某个不存在的数据, 因为缓存没有保存该数据,所有的请求都会落到数据库上,会对数据库造成很大的压力甚至奔溃。一个简单的对策是将不存在的数据也缓存起来,设置一个较短的失效时间;
评论