自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 InnoDB的数据页到底长什么样?

我们执行crud的时候,都会从磁盘上加载数据页到Buffer Pool的缓存页上去,更新了缓存页后,又会刷新回磁盘上的数据页里去。InnoDB进行数据操作的最小单位,就是数据页,那么我们之前已经给大家分析过了一行一行数据在磁盘和缓存中存储,具体格式是什么样的。每个数据页默认是16K,是不是每个数据页里边就是一行一行的数据呢?没这么简单!数据页会分为很多个部分,大体上来说分为文件头、数据页头、最小记录最大记录、数据行、空闲空间、数据页目录、文件尾部。各部分含义详细介绍:名称..

2021-11-03 18:34:49 176

原创 一文讲清,MySQL数据库一行数据在磁盘上是怎么存储的?

数据库给使用者最直观的感觉,就是库、表、行、字段,这些概念都是逻辑上的。前面我们深入讲解了Buffer Pool的内部原理,它的基本存储单位是默认大小为16K的页。每页都保存了一行一行的数据。我们按照数据页为单位把磁盘上的数据加载到内存的缓存页里来,也是按照页为单位,把缓存页的数据刷入磁盘的数据页中。而我们常常听到数据页、数据区、表空间这些名词,其实这些名词是物理层面上的概念。我们不经要问,库、表、行、字段,这些逻辑上的概念是如何对应到物理层的概念上的呢?我们查询一行数据,是如何找到条数据所在的数据页的

2021-11-03 18:22:12 480

原创 生产环境,如何调优Buffer Pool?

前面笔者花了三讲已经把Buffer Pool的原理讲的比较清楚了,我们操作数据库的第一步,就是利用Buffer Pool的缓存来更新或查询。Buffer Pool本质上就是一大块内存,加上一堆的缓存页和描述数据块,再加上三种链表,free链表,flush链表,lru链表。假设只有一个Buffer Pool,MySQL同时收到多个请求,多线程并发的请求Buffer Pool会怎样?肯定会有并发问题。所以一般生产环境,会配置多个Buffer Pool,以此来优化MySQL的并发能力。一般

2021-10-22 09:52:54 328

原创 一文详解InnoDB最核心组件Buffer Pool(三)

前面笔者用了两篇文章,讲解InnoDB最核心组件Buffer Pool的部分知识点,对Buffer Pool的内部结构有了一定的了解。第一讲主要引入了缓存页的概念。一文详解InnoDB最核心组件Buffer Pool(一)第二讲主要引入了三个链表:free链表、flush链表、lru链表。一文详解InnoDB最核心组件Buffer Pool(二)现在我们明白,当你执行一个CRUD操作时,InnoDB都会数据从磁盘上的数据页加载到缓存页里来。加载的时候,先从free链表找到一个空闲的缓存页

2021-10-21 18:25:06 123

原创 使用注解 + 反射优化冗余代码【附源码】

业务场景假如现在有一个爬虫系统,需要查询航班信息,每次都需要根据参数拼接出请求的url,为了避免反爬,我们需要模拟真实的用户请求,保持请求url后边跟的参数的顺序不变,最简单的做法就是一个参数一个参数的拼接出请求url,就像这样:public String createUrl(FlightInfo flightInfo) { String url = "/flight/query?" + "org=" + flightInfo.getOrg() + "&ds

2021-10-18 17:24:11 66

原创 一文详解InnoDB最核心组件Buffer Pool(二)

前文我们已经讲了Buffer Pool最基础的数据存储单元,缓存页。缓存页里存储的就是一行一行的数据,同时每个缓存页都对应了一个描述数据。那MySQL启动的时候,是如何初始化Buffer Pool的?又是如何从磁盘加载数据文件到缓冲页的呢?MySQL启动的时候,会按照配置在内存中给Buffer Pool分配一块内存,作为Buffer Pool的内存空间。然后会按照默认的16K缓存页大小,在Buffer Pool中划分出一个个的缓存页和与它们一一对应的描述数据块,这些描述数据块比较小。此时这些缓冲

2021-09-30 17:24:37 85

原创 使用注解 + 反射优化冗余代码【附源码】

业务场景假如现在有一个爬虫系统,需要查询航班信息,每次都需要根据参数拼接出请求的url,为了避免反爬,我们需要模拟真实的用户请求,保持请求url后边跟的参数的顺序不变,最简单的做法就是一个参数一个参数的拼接出请求url,就像这样:public String createUrl(FlightInfo flightInfo) { String url = "/flight/query?" + "org=" + flightInfo.getOrg() + "&ds

2021-09-30 17:16:31 85

原创 一文详解InnoDB最核心组件Buffer Pool(一)

前文笔者通过一条语句的执行,从整体上讲解了InnoDB存储引擎的架构,让大家对一条SQL语句的执行过程中,都有哪些操作有了完备的了解。InnoDB存储引擎处理一条数据,无论是查询还是修改,都需要先从磁盘加载到内存中,然后在内存中对这条数据进行相关的操作,这块内存就是Buffer Pool。可以说Buffer Pool是整个InnoDB最重要的组件了。这篇文章笔者就顺着前文的思路,深入剖析下Buffer Pool内部是什么样的结构,又是怎么运转的。由于这个主题内容比较多,为了不让读者感觉枯燥,每篇文章

2021-09-29 06:52:59 107

原创 设计模式之单例模式,看这篇文章就够了

单例模式是23种设计模式中最简单、最常见的设计模式之一,许多人学习设计模式,第一个接触到的就是单例模式。单例模式属于创建型模式,其目的是在当前进程中只创建一个实例,也可能是一个线程中属于单例。想要写出安全又简洁的单例模式,如果不注意细节,很容易有潜在的bug,本文总结了最常见的4种单例模式写法,并分析每种优缺点。懒汉模式懒汉模式,就是在用的时候才会被创建,体现的是一种延迟加载的思想。publicclassSingleton{privatestaticSinglet...

2021-09-27 17:58:06 113

原创 分库分表后,如何不停机迁移数据?

前文我们讲了如何分库分表,现在假设我们已经做好了分库分表,把原来的单库单表的设计改造成了多库多表结构,那么如何进行数据迁移呢?一般会有这几种方案: 停机迁移方案 双写迁移方案 停机迁移方案这种方案最简单也是最low的。数据迁移前,在网站或者app挂个公告,说0点到早上6点系统进行维护,无法访问。接着到0点停机,系统停掉,就没有流量写入了,此时老的单库单表就不会有新数据写入了。然后你用提前写好迁移数据的工具,将单库单表的数据哗哗哗读出来,写到分库分表里面去。迁移完了之后

2021-09-23 13:34:15 730

原创 有关分库分表你想知道的,都在这儿了

原文地址:有关分库分表你想知道的,都在这儿了面试的时候,聊到高并发或者大数据,很多时候会聊到数据库分库分表相关的问题,因为你的数据库单机抗不了多少并发量,而且用户量上来之后,数据库容纳的数据量也是有限的。如果单表数据量过大,SQL稍微复杂点,查询就会很慢。而且,现在稍微大点的互联网公司,分库分表都成为了标配。如果你现在出去面试,面试官问你分库分表相关的问题,你说你没做过,人家立马会觉得你没有高并发的经验,做的都是比较简单的业务系统。MySQL单表通常500w条数据以内比较合适,不建议超过1000

2021-09-22 09:35:31 156

原创 生产环境MySQL,应该选什么样配置的机器?

对于很多Java工程师来说,系统开发好准备上线时,随便找台普通的机器安装下MySQL,让自己的系统连上去,就开始使用了,根本不关心机器的具体配置和性能。如果你的系统没什么并发量,用户量就几百几千个,那就没必要纠结选择什么样配置的机器安装MySQL,选个普通的机器就可以直接使用。但本着专业的精神,希望大家以专业的方式做专业的事。你可以不用,但你最好会用。所以当你有一个生产库后,首先要做的事情就是设计压测方案,以及对数据库的可视化监控。做完了这些之后,才应该是让你的系统连上MySQL数据库,进行

2021-09-20 14:30:44 609

原创 【源码分析】kafka是如何解决粘包拆包的?

kafka版本:0.9.0前面笔者写了一篇文章一文讲清粘包拆包全面的讲解了TCP粘包拆包相关的问题。下面进行一个简单的总结:TCP粘包拆包产生的原因是,应用层有意义的数据包,传输层的协议并不了解其含义,不会去根据你的业务内容去分包和发送,只会按照自己的协议格式传送数据。知道问题的本质后,解决问题就简单了。就需要在应用层收到数据后根据标识判断一下,数据是否完整,如果完整了我们再进行数据包解析,最后交给业务代码处理。解决粘包拆包问题的方法:(1)消息定长;(2)增加特殊字符进行分割,比.

2021-09-19 14:19:33 108

原创 【面试题】如何应对缓存雪崩以及穿透问题?

面试中,只要聊到缓存,基本都会问到缓存雪崩以及缓存穿透怎么解决。其实这两个问题不难,是使用缓存过程中可能会出现的最大的问题。1、缓存雪崩缓存雪崩是指缓存机器故障或宕机,导致全部请求走数据库,引起数据库压力过大甚至宕机。解决方案:缓存雪崩式是解决不了的,只能说降低发生的可能性。应对缓存雪崩,一般分3步走: 事前:redis高可用部署,避免全盘崩溃; 事中:本地缓存 + 限流降级,避免数据库被打死; 事后:redis持久化,快速恢复缓存数据; 缓存使用高可用

2021-09-17 13:29:06 184

原创 深入理解redis cluster原理!

redis在单机模式下,受限于内存容量,无法缓存更多的数据,超过一定量的数据,redis会采取一定策略清理数据。所以,从reids3.0开始提供集群功能,集群中提供多个master,每个master存储一部分数据,这样就能应对海量数据了。redis cluster架构下,会自动进行数据分片,每个master上放一部分数据。每个master下可以挂多个slave,当master故障的时候,可以发生主备切换,使其具备高可用性。图1 redis集群1、分布式系统数据分布方式

2021-09-16 16:50:12 324

原创 通过一条语句的执行,深入理解innoDB的底层架构

通过前文“深入理解MySQL底层架构,看这一篇文章就够了!”,我们知道了MySQL的整体架构,对一条SQL语句的执行流程,也有了整体的了解。MySQL最常用的存储引擎是innodb,我们今天就借助一条更新语句的执行,了解下innodb具体是如何处理的,深入理解下它的架构。假设更新语句是这样的:update user set name ='xxx' where id = 1;这条SQL语句发送到MySQL上后,会经过SQL接口、解析器、优化器、执行器几个阶段,解析SQL、生成执

2021-09-14 13:47:44 132

原创 深入理解MySQL底层架构,看这一篇文章就够了!

前面我们已经讲解了,我们的系统是如何与MySQL打交道的?,我们开发的系统与MySQL本身,都维护的有线程池,管理了所有连接。看下图回顾下:图1 我们的系统是如何与MySQL打交道的?从上图我们可以看到,我们通过数据库连接,把要执行的SQL语句发送给MySQL数据库进行增删改查就可以了。然而MySQL数据库内部到底是怎么运转的呢?1、网络连接让工作线程去具体执行一般,网络服务器会分配一个线程或线程池去处理网络连接,把网络连接中读取出来的数据交给另外的线程或线程池处理。如下图所示:

2021-09-13 09:11:11 149

原创 多线程并发下载文件(附源码)

一、RandomAccessFile简介RandomAccessFile既可以读取文件,也可以写文件。顾名思义,RandomAccessFile支持“随机访问”的方式读写文件,这里的随机访问是指,指定任何一个位置,都能够访问它。由于RandomAccessFile可以自由访问文件的任意位置,所以如果需要读写文件的部分内容,不需要把文件从头读到尾从头写到尾,使用RandomAccessFile极大的方便了文件操作。RandomAccessFile的一个重要使用场景就是网络请求中的多线程下载及断点续

2021-09-09 15:34:19 527

原创 如何设计一个高并发、高性能的写磁盘功能?

场景:单系统每秒有10万的访问量,产生了大量操作日志,需要落地到磁盘文件里,如何设计这个写磁盘的逻辑?为了尽量避免涉及过多的业务逻辑,笔者这里从具体的业务系统中独立出了这个功能。假设每条日志100字节,每秒10w的访问量,那就是10M的日志,对于性能比较高的硬件设备,不存在什么瓶颈。不过,作为软件开发人员,技术开发能力不应停留在适可而止。如果没来一条日志,就写一次磁盘,那性能就太差了,频繁的打开关闭文件,肯定影响性能。那就批量写!于是开辟一块固定大小的内存空间,操作日志先写这块内存,等写满之

2021-08-27 16:55:17 595

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除