自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 InnoDB 表空间2---系统表空间

了解完了独立表空间的基本结构,系统表空间的结构也就好理解多了,系统表空间的结构和独立表空间基本类似,只不过由于整个MySQL进程只有一个系统表空间,在系统表空间中会额外记录一些有关整个系统信息的页,所以会比独立表空间多出一些记录这些信息的页。因为这个系统表空间最牛逼,相当于是表空间之首,所以它的表空间 ID(Space ID)是0。

2024-06-30 16:52:49 875

原创 InnoDB 表空间1---独立表空间

表空间是一个抽象的概念,对于系统表空间来说,对应着文件系统中一个或多个实际文件;对于每个独立表空间来说,对应着文件系统中一个名为表名.ibd的实际文件。大家可以把表空间想象成被切分为许许多多个页的池子,当我们想为某个表插入一条记录的时候,就从池子中捞出一个对应的页来把数据写进去。

2024-06-30 15:46:58 682

原创 Java builder 和 new 创建对象时默认值处理方式不一样

【代码】Java builder 和 new 创建对象时默认值处理方式不一样。

2024-06-07 18:53:12 132 1

原创 InnoDB B+树索引

在一个页中的查找在很多页中查找大部分情况下我们表中存放的记录都是非常多的,需要好多的数据页来存储这些记录。在没有索引的情况下,不论是根据主键列或者其他列的值进行查找,由于我们并不能快速的定位到记录所在的页,所以只能从第一个页沿着双向链表一直往下找,在每一个页中根据我们刚刚介绍过的查找方式去查找指定的记录。因为要遍历所有的数据页,所以这种方式显然是超级耗时的,如果一个表有一亿条记录,使用这种方式去查找记录那要等到猴年马月才能等到查找结果。

2024-03-17 13:15:42 747

原创 InnoDB数据页结构---页目录 PageDirectory

InnoDB为了不同的目的而设计了许多种不同类型的页,比如存放表空间头部信息的页,存放Insert Buffer信息的页,存放INODE信息的页,存放undo日志信息的页等等等等。本文聚焦的是那些存放我们表中记录的那种类型的页,官方称这种存放记录的页为索引(INDEX)页,鉴于我们还没有了解过索引是个什么东西,而这些表中的记录就是我们日常口中所称的数据,所以目前还是叫这种吧。

2024-03-12 20:27:12 1005

原创 InnoDB记录结构

InnoDB是一个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的。而真正处理数据的过程是发生在内存中的,所以需要把磁盘中的数据加载到内存中,如果是处理写入或修改请求的话,还需要把内存中的内容刷新到磁盘上。而我们知道读写磁盘的速度非常慢,和内存读写差了几个数量级,所以当我们想从表中获取某些记录时,InnoDB存储引擎需要一条一条的把记录从磁盘上读出来么?

2024-03-12 13:58:09 398

原创 mac iterm2 快捷登录服务器

【代码】mac iterm2 快捷登录服务器。

2024-03-05 17:23:21 140

原创 MySQL BufferPool精讲

我们知道,对于使用InnoDB作为存储引擎的表来说,不管是用于存储用户数据的索引(包括聚簇索引和二级索引),还是各种系统数据,都是以页的形式存放在表空间中的,而所谓的表空间只不过是InnoDB对文件系统上一个或几个实际文件的抽象,也就是说我们的数据说到底还是存储在磁盘上的。但是各位也都知道,磁盘的速度慢的跟乌龟一样,怎么能配得上“快如风,疾如电”的CPU呢?所以InnoDB存储引擎在处理客户端的请求时,当需要访问某个页的数据时,就会把完整的页的数据全部加载到内存中,。

2024-01-07 16:25:25 1088

原创 MySQL MVCC精讲

以此类推,如果之后事务id为200的记录也提交了,再此在使用READ COMMITTED隔离级别的事务中查询表hero中number值为1的记录时,得到的结果就是’诸葛亮’了,具体流程我们就不分析了。随着系统的运行,在确定系统中包含最早产生的那个ReadView的事务不会再访问某些update undo日志以及被打了删除标记的记录后,有一个后台运行的purge线程会把它们真正的删除掉。隔离级别的事务来说,由于可以读到未提交事务修改过的记录,所以直接读取记录的最新版本就好了;

2023-12-26 14:34:54 1112

原创 MySQL undo日志精讲3-从回滚段中申请 Undo 页面链表

如果该属性的值为 TRXUNDO ACTIVE,则意味着有一个活跃的事务正在向这个 Undo 页面链表中写入 undo 日志,然后再在 Undo Segment Header 中找到 TRX UNDO LAST LOG 属性,通过该属性可以找到本Undo 页面链表最后一个 Undo Log Header 的位置。我们现在知道一个事务在执行过程中最多可以分配4个 Undo 页面链表,在同一时刻不同事务拥有的 Undo 页面链表是不一样的,所以在同一时刻系统里其实可以有许许多多个 Undo 页面链表存在。

2023-12-24 12:08:23 1028

原创 MySQL undo日志精讲2-undo日志写入

设计InnoDB的大佬认为同一个事务向一个Undo页面链表中写入的undo日志算是一个组,比方说我们上面介绍的trx 1由于会分配3个Undo页面链表,也就会写入3个组的undo日志;但是我们前面又强调过,同一个Undo页面要么只存储TRX_UNDO_INSERT大类的undo日志,要么只存储TRX_UNDO_UPDATE大类的undo日志,反正不能混着存,所以在一个事务执行过程中就可能需要2个Undo页面的链表,一个称之为insert undo链表,另一个称之为update undo链表;

2023-12-22 13:41:30 921

原创 MySQL undo日志精讲1-undo日志类型

我们说过事务需要保证原子性,也就是事务中的操作要么全部完成,要么什么也不做。这两种情况都会导致事务执行到一半就结束,但是事务执行过程中可能已经修改了很多东西,为了保证事务的原子性,我们需要把东西改回原先的样子,这个过程就称之为回滚(英文名:rollback),这样就可以造成一个假象:这个事务看起来什么都没做,所以符合原子性要求。从上面的描述中我们已经能隐约感觉到,每当我们要对一条记录做改动时(这里的改动可以指INSERT、DELETE、UPDATE),都需要留一手 —— 把回滚时所需的东西都给记下来。

2023-12-17 12:46:13 416

原创 NFR 数字权益开发流程

NFR 在技术开发领域通常指的是“非功能性需求”(Non-Functional Requirements),这些是描述系统属性如安全性、性能、可用性、兼容性等方面的需求。

2023-12-11 11:33:29 626 1

原创 MySQL redo 日志精讲

有一个很不幸的事实就是我们的redo日志文件组容量是有限的,我们不得不选择循环使用redo日志文件组中的文件,但是这会造成最后写的redo日志与最开始写的redo日志追尾,这时应该想到:redo日志只是为了系统奔溃后恢复脏页用的,如果对应的脏页已经刷新到了磁盘,也就是说即使现在系统奔溃,那么在重启后也用不着使用redo日志恢复该页面了,所以该redo日志也就没有存在的必要了,那么它占用的磁盘空间就可以被后续的redo日志所重用。自系统开始运行,就不断的在修改页面,也就意味着会不断的生成redo日志。

2023-11-05 16:24:43 164

原创 MySQL Server层的 max_connections 和引擎层的 innodb_thread_concurrency

max_connections 和 innodb_thread_concurrency

2023-09-16 18:52:00 331

原创 docker network

【代码】docker network。

2023-09-12 20:33:30 301

原创 MySQL的 timze_zone 和 SpringBoot 的 serverTimezone 的设置

serverTimeZone的作用就是指定web服务器和mysql服务器的会话期间的mysql服务器时区,就是临时指定mysql服务器的时区。同理 golang 也有类似配置。// 在给创建时间赋值时,会把服务器所在时区的时间转换为 UTC 时间保存;// 而在获取数据时会把数据库里的创建时间当成 UTC 时区的,然后转换为 bean.DbEngine.TZLocation 时区的时间。

2023-06-15 14:43:17 2137 3

原创 mysql 以 localhost 和 127.0.0.1 登陆的区别

以 localhost 登陆,表示用 socket 登陆。

2023-06-06 17:14:40 151

原创 PostgreSQL快速入门

PostgreSQL快速入门 和 基本操作

2023-05-08 12:05:15 195 1

原创 制作 MySQL 镜像的 dockerfile以及 ENTRYPOINT 和 CMD 的区别

【代码】mysql dockerfile。

2023-03-29 18:57:13 136

转载 GPG 使用指南:包括对称加密和非对称加密

加密与签名在传输信息时,会面临两个典型的问题:这两个问题不难理解。例如发送的邮件可能会被监听,诈骗分子可以冒充你老板。不一定是在网络上,在任何非面对面交流的情况下,都可能存在这两个问题。例如打仗时,情报可能被敌方监听窃取,收到的命令可能是被敌人冒充的。对于第一个问题,可以通过加密来解决。就像战争电影中,双方会加密自己的情报和破解对方的情报。那么如何进行加密呢?最容易想到的方法就是双方约定一套规则(加密算法),发送方将原始信息(明文)按照这套规则转换(加密)成别人看不懂的信息(密文)。其他人不知道这套规则,

2023-01-30 14:33:45 1019

原创 MySQL的 SSL

➜ ~ mysql --ssl-mode=REQUIRED -ucpx -p 服务端没有开启 ssl。

2023-01-03 19:17:40 133

转载 @RestControllerAdvice注解;有点架构的感觉了

@RestControllerAdvice注解在做前后端分离的项目时,后端业务通常会使用多个微服务,我们希望在每一个微服务的调用接口返回给前端的结果都是统一的数据结构,如:在上面的结构中,有请求是否成功标识-successful,其值为boolean类型;有服务处理结果编码-code,其值为String,可以封装自定义编码,也可以使用HttpStatus;有服务处理结果文本信息message;还有业务返回数据-data,其值类型为Object,即可以返回String、List、对象信息等等。定义统一的返回

2022-12-07 12:13:59 707

原创 mysql SQL 集锦:join_and 和 多次join同一张表的处理 和 group_concat

【代码】mysql group_concat。

2022-11-02 18:16:30 2052

原创 Python 装饰器精讲

于是调用 businessA() 将执行新函数,即在 my_decorator()函数中返回的wrapper()函数。wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。所以,原来的 businessA()函数仍然存在,只是现在同名的 businessA 变量指向了新的函数,如果函数的参数定义是(*args, **kw),表示该函数可以接受任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。

2022-10-13 17:21:12 308

转载 浅谈select-epoll

综上:一次普通网络IO操作需要4次状态切换以及4次数据拷贝。以上只是操作系统底层流程,至于具体代码(欢迎去看linux源码)。我们编写的应用程序在进行IO的操作时,系统调用read() 和 write()。今天的话题还是得从最开始的IO开始。内核缓冲区和进程缓冲区(用户态缓冲区)。1.阻塞性IO(BIO,NIO).用户态和内核态切换。

2022-09-26 11:44:03 197

转载 select和epoll

之所以能够同时处理多个客户端的请求,原因是可以查询哪个客户端准备好了,对于准备好的客户端(例如客户端已经发了信息过来,本服务器用read读取数据的时候不会阻塞;另外,客户端已经关闭了连接,那么本服务read的时候,返回0,也不会阻塞),则和它进行通信,而未准备好的,就暂时先不理会。select是对加进去的所有fd进行轮询,返回之后也要对整个fd进行一次轮询,才能找到准备好的fd。epoll采用事件触发的方式,当某个fd准备好后会触发事件,这样减少了内核的轮询。现今用的多的是epoll。

2022-09-26 11:39:01 169

原创 4-Linux 进程组的精确理解和 Daemon进程

为了验证 if you log into a machine, your shell starts a session from: https://blog.csdn.net/cpxsxn/article/details/107371177。为了验证 os.setsid();executor.py 主体就是一个真正的 daemon 进程。shell 进程: http://c.biancheng.net/view/739.html。为了验证:父子进程是一个进程组,但是子进程不是进程组组长。

2022-09-23 12:07:29 484

原创 Kafka 和 ZK 基本命令

【代码】Kafka 基本命令。

2022-09-22 16:56:05 520

转载 TCP粘包问题以及解决方法

这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。可以将真实数据,做成一个固定长度的报头,客户端发送给服务端,服务端可以接受报头,然后对报头进行解包,获取真实数据的长度,进行接收即可。TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。

2022-09-19 15:26:27 3626

原创 ES 基本操作

ES 基本操作

2022-09-18 10:22:20 522

转载 解决Django的request.POST获取不到内容的问题

在服务器端我用request.POST期望能获取到,但是我发现获取到的是一个空的,用reqyest.body是能获取到原始的请求内容key2=value2&key1=value1的。

2022-09-11 10:16:07 1650

转载 python setup.py 打包发布

平常我们习惯了使用pip来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而这个过程就是打包。打包,就是将你的源代码进一步封装,并且将所有的项目部署工作都事先安排好,这样使用者拿到后即装即用,不用再操心如何部署的问题(如果你不想对照着一堆部署文档手工操作的话)。不管你是在工作中,还是业余准备自己写一个可以上传到PyPI的项目,你都要学会如何打包你的项目。Python发展了这么些年了,项目打包工具也已经很成熟了。他们都有哪些呢?............

2022-07-31 13:15:09 1053

转载 TCP 为什么是三次握手,而不是两次或四次?

tcp 三次握手,四次挥手, 为什么 A 要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态

2022-07-24 17:52:23 208

原创 Django 登录过程中,浏览器 cookie 的变化

myself_login 函数对应的 URL 是:host:port/myself_login/Django 响应头的Set-Cookie.pngDjango 对 http请求的封装:

2022-06-15 17:24:47 285

转载 Python字符串格式化

字符串格式化是我们在使用Python中经常用到的功能。Python为我们提供了四种格式化字符串的方法,分别是%运算符、字符串format方法、格式化字符串字面值以及模板字符串。

2022-06-07 11:17:48 4607

转载 深度理解同步异步和阻塞非阻塞

同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。本文讨论的背景是Linux环境下的networ

2022-05-04 18:26:04 438

原创 Springboot + mybatis plus 实现物理分页

在实际项目开发中,我们肯定需要对 LIST 接口进行分页和查找分页物理分页实现方式:第一种:在AOP 中利用 com.github.pagehelper 中的类 PageInterceptor第二种:在配置类中实例化 MybatisPlusInterceptor 同时用注解 @Bean 注册到 Spring 容器中import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;@Configurationpubli

2022-04-18 15:21:45 555

翻译 MyBatis Plugin 本质就是实现一个 interceptor,可以参考 com.github.pagehelper 中的类 PageInterceptor 的手法

插件(plugins)MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)ParameterHandler (getParameterObject, setParameters)ResultSetHandler (handleResultSet

2022-04-12 11:54:20 326

原创 DDD浅析项目数据流

DDD(领域驱动设计)总体结构分为四层: Infrastructure(基础实施层),Domain(领域层),Application(应用层),Interfaces(表示层,也叫用户界面层或是接口层),各个层面的作用下面介绍:用户界面(表现层):负责给用户展示信息,并解释用户命令。应用层:该层协调应用程序的活动。不包括任何业务逻辑,不保存业务对象的状态,但能保存应用程序任务过程的状态。3.领域层:这一层包括业务领域的信息。业务对象的状态在这里保存。业务对象的持久化和它们的状态可能会委托给基础设施层

2022-04-11 17:38:31 1307

空空如也

空空如也

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

TA关注的人

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