数据库成为瓶颈后,动态数据的查询要如何加速?

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

使用内存作为缓存的存储介质相比于以磁盘作为主要存储介质的数据库来说,性能上会提高多个数量级,同时也能够支撑更高的并发量。所以,内存是最常见的一种缓存数据的介质。

缓存作为一种常见的空间换时间的性能优化手段,在很多地方都有应用。

缓存的适用场景

======================================================================

Linux内存管理通过MMU(Memory Management Unit)硬件,实现从虚拟地址到物理地址的转换,但如果每次转换都要做这么复杂计算,无疑会造成性能损耗,所以借助TLB(Translation Lookaside Buffer)组件缓存最近转换过的虚拟地址,和物理地址的映射。这就是一种缓存组件,缓存复杂运算的结果

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

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

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

缓存与缓冲区

=====================================================================

缓冲和缓存只有一字之差,它们有什么区别呢?

缓存:

  • 可提高低速设备的访问速度

  • 减少复杂耗时的计算带来的性能问题

理论上可通过缓存解决所有“慢”问题,比如从磁盘随机读取数据慢,从数据库查询数据慢,只是不同场景消耗的存储成本不同。

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

所以TLB的命名是有问题的,它应该是缓存而不是缓冲区。

缓存分类

===================================================================

静态缓存


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

当然,我们也可以把文章录入到数据库里面,然后前端展示的时候穿透查询数据库来获取数据,但是这样会对数据库造成很大的压力。即使我们使用分布式缓存来挡读请求,但是对于像日均PV几十亿的大型门户网站来说,基于成本考虑仍然是不划算的。

所以我们的解决思路是每篇文章在录入的时候渲染成静态页面,放置在所有的前端Nginx或者Squid等Web服务器上,这样用户在访问的时候会优先访问Web服务器上的静态页面,在对旧的文章执行一定的清理策略后,依然可以保证99%以上的缓存命中率。

这种缓存只能针对静态数据来缓存,对于动态请求就无能为力了。那么我们如何针对动态请求做缓存呢?这时你就需要分布式缓存了。

分布式缓存


Memcached、Redis就是分布式缓存的典型例子。它们性能强劲,通过一些分布式的方案组成集群可以突破单机的限制。所以在整体架构中,分布式缓存承担着非常重要的角色(接下来的课程我会专门针对分布式缓存,带你了解分布式缓存的使用技巧以及高可用的方案,让你能在工作中对分布式缓存运用自如)。

对于静态的资源的缓存你可以选择静态缓存,对于动态的请求你可以选择分布式缓存,那么什么时候要考虑热点本地缓存呢?

答案是当我们遇到极端的热点数据查询的时候。热点本地缓存主要部署在应用服务器的代码中,用于阻挡热点查询对于分布式缓存节点或者数据库的压力。

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

本地缓存


如HashMap,Guava Cache或者是Ehcache等,它们和应用程序部署在同一个进程中,优势是不需要跨网络调度,速度极快,所以可以来阻挡短时间内的热点查询。来看个例子。

比方说你的垂直电商系统的首页有一些推荐的商品,这些商品信息是由编辑在后台录入和变更。你分析编辑录入新的商品或者变更某个商品的信息后,在页面的展示是允许有一些延迟的,比如说30秒的延迟,并且首页请求量最大,即使使用分布式缓存也很难抗住,所以你决定使用Guava Cache来将所有的推荐商品的信息缓存起来,并且设置每隔30秒重新从数据库中加载最新的所有商品。

首先,我们初始化Guava 的Loading Cache:

CacheBuilder<String, List> cacheBuilder = CacheBuilder.newBuilder().maximumSize(maxSize).recordStats(); //设置缓存最大值

cacheBuilder = cacheBuilder.refreshAfterWrite(30, TimeUnit.Seconds); //设置刷新间隔

LoadingCache<String, List> cache = cacheBuilder.build(new CacheLoader<String, List>() {

@Override

public List load(String k) throws Exception {

return productService.loadAll(); // 获取所有商品

}

});

获取所有商品信息时,可调用Loading Cache的get,优先从本地缓存获取商品信息,如果不存在,会使用CacheLoader中的逻辑从DB加载所有商品。

由于本地缓存部署在应用服务器,通常集群部署,当数据更新时,不能确定哪台服务器本地中了缓存,更新或删除所有服务器的缓存不是一个好的选择,所以通常会等待缓存过期。因此,这种缓存的有效期很短,通常为分钟或秒级别,以避免返回前端脏数据。

缓存的不足

====================================================================

缓存主要是提升访问速度,从而抗更高并发。那不意味着它就是银弹。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

面试题文档来啦,内容很多,485页!

由于笔记的内容太多,没办法全部展示出来,下面只截取部分内容展示。

1111道Java工程师必问面试题

MyBatis 27题 + ZooKeeper 25题 + Dubbo 30题:

Elasticsearch 24 题 +Memcached + Redis 40题:

Spring 26 题+ 微服务 27题+ Linux 45题:

Java面试题合集:

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
存中…(img-wuC4yvfX-1713711059277)]

Java面试题合集:

[外链图片转存中…(img-kSmWUpcU-1713711059277)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值