高并发系统设计学习笔记(十) 如何加速缓存数据查询

目录

一、什么是缓存

 二、缓存案例

1.TLB

2.抖音

3.HTTP协议

三、缓存与缓冲区

四、缓存分类

1.静态缓存

2.分布式缓存

3.热点本地缓存

五、缓存的不足

六、课程小结


一、什么是缓存

缓存,是一种存储数据的组件,它的作用是让对数据的请求更快地返回凡是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构,均可称之为缓存

 做一次内存寻址大概需要100ns,而做一次磁盘的查找则需要10ms。


 二、缓存案例

1.TLB

Linux内存管理是通过一个叫做MMU(Memory Management Unit)的硬件,来实现从虚拟地址到物理地址的转换的,但是如果每次转换都要做这么复杂计算的话,无疑会造成性能的损耗,所以我们会借助一个叫做TLB(Translation Lookaside Buffer)的组件来缓存最近转换过的虚拟地址,和物理地址的映射。TLB就是一种缓存组件,缓存复杂运算的结果。大部分的笔记本,桌面电脑和服务器上都会有一个或者多个TLB组件,在不经意间帮助我们加快地址转换的速度。

2.抖音

平台上的短视频实际上是使用内置的网络播放器来完成的。网络播放器接收的是数据流,将数据下载下来之后经过分离音视频流,解码等流程后输出到外设设备上播放

如果我们在打开一个视频的时候才开始下载数据的话,无疑会增加视频的打开速度(我们叫首播时间),并且播放过程中会有卡顿。所以我们的播放器中通常会设计一些缓存的组件,在未打开视频时缓存一部分视频数据,比如我们打开抖音,服务端可能一次会返回三个视频信息,我们在播放第一个视频的时候,播放器已经帮我们缓存了第二、三个视频的部分数据,这样在看第二个视频的时候就可以给用户“秒开”的感觉

3.HTTP协议

当我们第一次请求静态的资源时,比如一张图片,服务端除了返回图片信息,在响应头里面还有一个“Etag”的字段。浏览器会缓存图片信息以及这个字段的值。当下一次再请求这个图片的时候,浏览器发起的请求头里面会有一个“If-None-Match”的字段,并且把缓存的“Etag”的值写进去发给服务端。服务端比对图片信息是否有变化,如果没有,则返回浏览器一个304的状态码,浏览器会继续使用缓存的图片信息。通过这种缓存协商的方式,可以减少网络传输的数据大小,从而提升页面展示的性能


三、缓存与缓冲区

缓冲区则是一块临时存储数据的区域,这些数据后面会被传输到其他设备上 缓冲区更像“消息队列篇”中即将提到的消息队列,用以弥补高速设备和低速设备通信时的速度差。比如,我们将数据写入磁盘时并不是直接刷盘,而是写到一块缓冲区里面,内核会标识这个缓冲区为脏。当经过一定时间或者脏缓冲区比例到达一定阈值时,由单独的线程把脏块刷新到硬盘上。这样避免了每次写数据都要刷盘带来的性能问题

 


 四、缓存分类

常见的缓存主要就是静态缓存、分布式缓存和热点本地缓存 这三种

1.静态缓存

静态缓存在Web 1.0时期是非常著名的,它一般通过生成Velocity模板或者静态HTML文件来实现静态缓存,在Nginx上部署静态缓存可以减少对于后台应用服务器的压力。例如,我们在做一些内容管理系统的时候,后台会录入很多的文章,前台在网站上展示文章内容,就像新浪,网易这种门户网站一样。

2.分布式缓存

MemcachedRedis就是分布式缓存的典型例子。它们性能强劲,通过一些分布式的方案组成集群可以突破单机的限制。所以在整体架构中,分布式缓存承担着非常重要的角色

3.热点本地缓存

热点本地缓存主要部署在应用服务器的代码中,用于阻挡热点查询对于分布式缓存节点或者数据库的压力。

比如某一位明星在微博上有了热点话题,“吃瓜群众”会到他(她)的微博首页围观,这就会引发这个用户信息的热点查询。这些查询通常会命中某一个缓存节点或者某一个数据库分区,短时间内会形成极高的热点查询

那么我们会在代码中使用一些本地缓存方案,如HashMapGuava Cache或者是Ehcache等,它们和应用程序部署在同一个进程中,优势是不需要跨网络调度,速度极快,所以可以用来阻挡短时间内的热点查询。你在获取所有商品信息的时候可以调用Loading Cache的get方法,就可以优先从本地缓存中获取商品信息,如果本地缓存不存在,会使用CacheLoader中的逻辑从数据库中加载所有的商品。


 五、缓存的不足

1. 缓存比较适合于读多写少的业务场景,并且数据最好带有一定的热点属性.当数据有热点属性的时候才能保证一定的缓存命中率。比如说类似微博、朋友圈这种20%的内容会占到80%的流量。所以,一旦当业务场景读少写多时或者没有明显热点时,比如在搜索的场景下,每个人搜索的词都会不同,没有明显的热点,那么这时缓存的作用就不明显了。

2. 缓存会给整体系统带来复杂度,并且会有数据不一致的风险 当更新数据库成功,更新缓存失败的场景下,缓存中就会存在脏数据。对于这种场景,我们可以考虑使用较短的过期时间或者手动清理的方式来解决。

3. 缓存通常使用内存作为存储介质,但是内存并不是无限的。 因此,我们在使用缓存的时候要做数据存储量级的评估,对于可预见的需要消耗极大存储成本的数据,要慎用缓存方案。同时,缓存一定要设置过期时间,这样可以保证缓存中的会是热点数据。

4. 缓存会给运维也带来一定的成本 运维需要对缓存组件有一定的了解,在排查问题的时候也多了一个组件需要考虑在内。


六、课程小结

  • 缓存可以有多层,比如上面提到的静态缓存处在负载均衡层,分布式缓存处在应用层和数据库层之间,本地缓存处在应用层。我们需要将请求尽量挡在上层,因为越往下层,对于并发的承受能力越差;
  • 缓存命中率是我们对于缓存最重要的一个监控项,越是热点的数据,缓存的命中率就越高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值