自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 归档日志-binlog

MySQL 引入了 binlog 组提交(group commit)机制,当有多个事务提交的时候,会将多个 binlog 刷盘操作合并成一个,从而减少磁盘 I/O 的次数,如果说 10 个事务依次排队刷盘的时间成本是 10,那么将这 10 个事务一次性一起刷盘的时间成本则近似于 1。上面的每个阶段都有一个队列,每个阶段有锁进行保护,因此保证了事务写入的顺序,第一个进入队列的事务会成为 leader,leader领导所在队列的所有事务,全权负责整队的操作,完成后通知队内其他事务操作结束。

2025-07-28 20:38:16 794

原创 回滚日志-undo log

undo log也被称为回滚日志,与redo log(物理日志,记录数据页的修改)不同的是,undo log是一种逻辑日志,用于数据修改的回滚,以此保证事务的原子性。这样,在事务回滚时,我们就可以从undo log中反向读取相应的内容,并进行回滚;另外我们也可以根据undo log中的内容读取到一条被修改后数据的原值。该日志中记录的是数据修改的相反记录,比如:当删除一条记录,日志中会记录一条对应的新增记录。redo log 和 undo log 区别在哪?

2025-07-28 20:35:59 136

原创 如何保证数据库和缓存一致性问题讨论

而如果先删除缓存成功,再更新数据库失败,因为此时缓存已经没有数据了,也不会出现数据不一致的问题了。通过上述分析,无论是「先更新数据库,再更新缓存」,还是「先更新缓存,再更新数据库」,都可能会导致数据不一致,因此我们在做数据更新时,对于缓存的处理不应该是更新,而是删除,因为将缓存删除后,大概率就不会出现数据不一致的问题了。因此,无论是「先更新数据库,再更新缓存」,还是「先更新缓存,再更新数据库」,这两个方案都存在并发问题,当多个请求并发更新同一条数据的时候,可能会出现缓存和数据库中的数据不一致的现象。

2025-07-27 17:13:55 592

原创 重做日志-redo log

首先,提出一个问题:redo log是否对其文件大小有限制?若有限制,当超过其限制时,数据库会做出怎样对应的操作?解一:redo log文件的大小InnoDB的redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是 1GB,那么这个日志总共就可以记录4GB的操作。并且写redo log是环状写日志的形式,如下图。write pos是当前记录的位置,一边写一边后移。check point是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。

2025-07-27 17:09:05 367

原创 MySQL中的锁有哪些

导读:在解决读写冲突产生的问题时,不同的数据库厂商使用的方式也不尽相同,但是大致可分为以下两种方案:方案一:读操作利用多版本并发控制(MVCC),写操作进行加锁。对于读操作,一个查询语句会产生一个 Read View(读视图),在不同的隔离级别下,根据 Read View 找到该事务可以访问的历史版本数据;对于写操作,通过对最新版本的数据进行加锁,只有获取到锁的事务才可以对数据进行修改,避免了脏写问题。

2025-07-18 21:05:40 762

原创 搞清MVCC

MVCC,全称 Multi-Version Concurrency Control ,即多版本并发控制,是一种即使不加锁也能够解决并发操作中的读写冲突的并发控制手段,即做到了非阻塞读。其中,不加锁可以大大降低程序开销。补充:读写冲突会造成脏读、幻读、不可重复读。当前读:当前读获取到的记录是最新记录;读取记录时,要对记录进行加锁操作,保证记录不被其他事务所修改。可以看作是悲观锁的一种实现。快照读:快照读可以看作是MVCC的一种实现,主要是为了通过不加锁的方式解决读写冲突。

2025-07-17 21:28:19 1013

原创 并发事务~

READ UNCOMMITTED隔离级别下,可能发生脏读、不可重复读和幻读问题。READ COMMITTED隔离级别下,可能发生不可重复读和幻读问题,但是不可以发生脏读问题。REPEATABLE READ隔离级别下,可能发生幻读问题,但是不可以发生脏读和不可重复读的问题。SERIALIZABLE隔离级别下,各种问题都不可以发生。

2025-07-17 21:25:16 838

原创 事务~~~

从图中大家也可以看出了,只有当事务处于提交的或者中止的状态时,一个事务的生命周期才算是结束了。对于已经提交的事务来说,该事务对数据库所做的修改将永久生效,对于处于中止状态的事务,该事务对数据库所做的所有修改都会被回滚到没执行该事务之前的状态。C 一致性:事务前后的状态要保持一致,可以理解为数据的一致性。只有保证了原子性、隔离性、持久性才能保证事务的一致性。A 原子性:对数据的一组操作,要么执行成功,要么不执行。I 隔离性:多个事务之间是隔离的,互不影响。

2025-07-16 23:19:38 176

原创 Buffer Pool

对于该种场景,InnnDB 设计者们又添加了 innodb_old_blocks_time 这个系统变量,也就是说,从磁盘上被加载到 LRU 链表的 old 区域的某个页来说,如果第一次和最后一次访问该页面的时间间隔小于1s(很明显在一次全表扫描的过程中,多次访问一个页面中的时间不会超过1s),那么该页是不会被加入到young区域的。这样链表尾部的数据就是最近最少使用的数据了,当 Buffer Pool容量不足,或者后台线程主动刷新数据页时,就会优先刷新链表尾部的数据页。

2025-07-16 23:17:34 1004

原创 Explain关键字

- 内层 SELECT 是 DERIVED。SELECT 1 FROM orders WHERE user_id = u.id -- 依赖外层 u.id。查询执行计划的标识符​​,用于表示查询中每个 SELECT 子句的执行顺序和层级关系。-- 内层 SELECT 是 SUBQUERY。​​优化​​:为 ORDER BY/GROUP BY 字段添加联合索引。​​优化​​:为 ORDER BY 字段添加索引。

2025-07-09 23:03:39 917

原创 子查询~~

在一个查询语句里的某个位置也可以有另一个查询语句,这个出现在某个查询语句的某个位置中的查询就被称为子查询。

2025-07-09 22:57:04 282

原创 多表查询~

扫描表的过程就是通过磁盘 I/O 将表的数据加载到内存,然后从内存中比较匹配条件是否满足,因此使用嵌套循环连接算法时,可能需要多次磁盘 I/O 读取被驱动表,势必会造成性能上的损耗。而要想减轻这方面的代价,我们可以通过尽量减少访问被驱动表的次数。在 BNL 中,通过加入一块 join buffer 区域,用于存放若干条驱动表的结果集,然后将 join buffer 区域中的记录与被驱动表记录进行匹配,这样的话,就可以使一条被驱动表的记录一次同时与多条驱动表的记录进行匹配(反入为主)。

2025-07-07 22:27:52 675

原创 单表查询~

导读在熟悉了 MySQL 中数据的存储细节之后,接下来就该了解其数据查询的那些事儿了。作为用户,在查询数据时,我们只需通过一条 SQL 来声明要查询哪些数据,完全不需要注意 MySQL Server 具体是怎样完成查询的,也就是说我们不看重过程,只看重结果;而对于 MySQL Server,执行一条 SQL 的查询逻辑是较为复杂的,首先 Server 端需与 Client 建立连接,然后 Server 端开始语法解析、查询优化,待查询优化模块生成出一个最优执行计划后,再调用存储引擎执行操作并返回结果。

2025-07-07 22:22:59 961

原创 MySQL的数据目录

根据前面的所学知识,我们知道了InnoDB存储引擎存储数据的数据结构、存储过程,而被组织好的数据则被存储在操作系统的磁盘上,当我们在对表数据进行增删改查时,其实就是InnoDB存储引擎与磁盘的交互。此外,操作系统中对磁盘的管理归属于文件系统,所以我们也可将数据增删改查的过程称为是InnoDB存储引擎与文件系统的交互。之前我们只是通过工具对数据库中的数据进行操作,并没有真正看到过数据库、表等存储文件,接下来我们就来了解一下在文件系统中,MySQL是以什么样的形式对数据进行的存储?保存了哪些数据?

2025-07-05 13:51:03 798

原创 最左匹配原则

导读:首先创建一张 test 表,并插入一些数据:`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',其中,test 表中有一个联合索引 idx_abc,其包含索引(a)、索引(ab)、索引(abc)。

2025-07-05 13:45:16 717

原创 InnoDB索引

一条条数据存储到页中后,各个数据页组成了一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表。此时,如果我想根据主键值查询一条记录,只能从第一个数据页开始一个页一个页地去查询,这种全表搜索方式的效率想想也不会很高,因此 MySQL 选择为每一个存储了用户数据的数据页建立目录,通过目录确定目标数据在哪个页,然后再在目标页中根据 Page Directory (页目录) + 二分法查询目标数据。

2025-07-01 23:13:19 1096

原创 InnoDB数据页

首先,在每一个数据页中存在两个虚拟记录,一个代表最小记录,一个代表最大记录,它们被存储在数据页的 Infimum + Supremum 部分。紧接着,当向表中插入一些数据时,这些记录会被存储在数据页中的 User Records 中,这里不仅存储了其真实内容,还有存储了一些额外的数据,比如头信息中的 next_record,通过这个标记加上两个虚拟记录,使得记录形成了一条按照主键值由小到大的顺序的单链表(非插入顺序。

2025-07-01 23:06:09 799

原创 InnoDB行格式

从图中可以看出来,对于 Compact 和 Redundant 行格式来说,如果某一列中的数据非常多的话,在本记录的真实数据处只会存储该列的 前768 个字节的数据和一个指向其他页的地址,然后把剩下的数据存放到其他页中,这个过程也叫做行溢出,存储超出 768 字节的那些页面也被称为溢出页。最后需要注意的是,不只是 VARCHAR(M) 类型的列,其他的 TEXT、BLOB 类型的列在存储数据非常多的时候也会发生行溢出。对于这些类型的列,数据是单独存储的,并且通过行中的指针来访问。

2025-06-29 19:42:55 755

原创 字符集和比较规则

1、字符集是什么?字符集是一个有限的字符集合,其定义了可以表示的字符的范围,这些字符可以是中文、字母、数字、标点符号、控制字符等。有啥用?通过建立字符串与二进制的映射关系,解决了计算机无法存储字符串的问题(计算机只能存储二进制数据上述提到的,将一个字符映射成一个二进制数据的过程也叫做编码,在这里亦称为"字符编码其中,一种字符集可以有不同的编码方案。比如,Unicode 编码方案包括 UTF-8、UTF-16 和 UTF-32 等。但是,MySQL。

2025-06-29 19:39:43 923

原创 MySQL的调控按钮

以本地MySQL服务 MySQL57 为例,通过服务 - MySQL57 - 属性,可看到该服务的可执行文件、配置文件的地址。为了让我们更好的了解服务器程序的运行情况,MySQL服务器程序中维护了好多关于程序运行状态的变量,它们被称为状态变量。因此命令行设置启动选项适合偶尔改动的选项,而对于无需频繁更改的选项配置在文件中将更加方便。),并且同一个启动选项既出现在命令行中,又出现在配置文件中,那么以命令行中的启动选项为准。程序每次启动时都是从配置文件中加载启动选项,而命令行设置启动项只在当次启动有效(

2025-06-29 19:37:24 810

原创 MySQL架构理解

MySQL是一个开源的、轻量级的存储数据工具,因其不错的性能广泛被人们使用。

2025-06-29 19:32:55 308

原创 离奇!Chrome浏览器竟突然无法上网!?

因Charles导致的Chrome浏览器无法上网问题的解决

2024-10-15 14:41:27 1738

原创 npm、nrm、nvm详解与应用

本文全面介绍了 npm、nrm 以及 nvm 这三个与 Node.js 开发密切相关的工具。

2024-03-24 16:34:25 3530

原创 Linux中,配置systemctl操作Nginx

在Linux中,配置systemctl命令操作Nginx,更方便的对Nginx进行相关操作

2024-03-10 23:35:52 3020 1

原创 Linux中防火墙相关操作

Linux中防火墙相关操作

2024-03-10 18:14:32 2146

原创 Docker安装

Docker安装

2024-02-22 16:19:56 397

原创 MySQL模糊查询通配符转义总结

MySQL模糊查询,对%、_的处理

2024-01-26 15:18:32 2465

原创 SpringBoot集成Swagger

1、导包<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version></dependency><dependency> <groupId>io.springfox</groupI

2021-12-22 15:02:45 593

原创 当mybatis where条件中使用in关键字出现的问题

一、出现的问题:1、查询时:Mybatis:Mysql:2、删除时:Mybatis:Mysql:通过分析查询、删除时的两种情况可知,相同的sql语句被执行后,mysql、mybatis的执行结果却不一致。原因: 通过分析可得,Mybatis查询、删除出现不符合预期的问题都是由Mybatis使用#{}替换变量值时导致的。#{}会把传入的数据都当成一个字符串来处理,会在传入的数据上面加一个双引号来处理。比如,select * from s_r.

2021-12-22 10:34:39 2963

原创 Mybatis中#{}和${}的区别

一、作用:替换变量值。二、含义不同:# 会把传入的数据都当成一个字符串来处理,会在传入的数据上面加一个双引号来处理。比如,select * from student where name = #{name},传入周杰伦,经处理,为 select * from student where name = "周杰伦"。而 $ 则是把传入的数据直接拼接在sql语句中,不会添加双引号。比如,select * from student where age= #{age},传入18,经处理,为

2021-12-22 08:51:02 511

原创 MyBatis代码生成器

1、依赖导入依赖<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency>插件<plugin> <!--My...

2021-12-21 17:36:20 827

原创 LC.77 组合

题目描述: 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。示例: 输⼊: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]思路: 对于给出的用例,要选出集合个数为2的所有组合,很容易想到的是双重for循环解决问题,集合个数...

2021-12-19 21:00:07 636

原创 LC.746 使用最小花费爬楼梯

题目描述:解法:classSolution{publicintminCostClimbingStairs(int[]cost){intn=cost.length;int[]dp=newint[n];dp[0]=cost[0];dp[1]=cost[1];for(inti=2;i<n;i++){dp...

2021-12-14 16:55:32 850

原创 为什么Java中只有值传递?

为什么Java中只有值传递?

2021-11-20 20:26:56 5089 2

原创 HTTPS加密原理

HTTP是未经加密的协议,其内容是以明文的方式传输的,也就是说,在传输过程中有可能被劫持、篡改,造成信息泄露等安全问题,所以我们需要安全的请求方式进行请求,也就是我们经常使用的HTTPS。 HTTPS并不是应用层中一个新的协议,仅仅是在 应用层 和 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。通常,HTTP 直接和 TCP 通信。当使用 SSL时,则演变成先和 SSL 通信,再由 SSL和 TCP 通信了。简言之,所谓 HTTPS,其实就是身披 SSL协议这层外壳的 HTTP。.

2021-11-16 15:47:59 2042

原创 微信小程序:动态控制class属性

一、需求: 点击一个选项,让其出现不同于其他选项的样式,比如选项文字的颜色变红。二、初步解决方案: 可以设置一个活跃选项的数据来记录选中选项的下标(默认为0),其次选中其他选项时可以通过点击事件获取到所选选项的下标,并赋值给活跃选项。要点击的选项是 wx:for 循环出来的,所以接下来就是通过一个三元运算来判断每个循环的元素是否被选中,选中则加特殊样式。js:cateActive:'0',//活跃选项下标clickCate(e){console.lo...

2021-11-16 13:46:26 13633

原创 SpringBoot定义统一的返回结果

    前后端分离项目中,后端开发需要写接口来处理请求并返回响应数据,而为响应数据定义统一的返回格式有利于提高开发效率和沟通的成本,比如包括状态码、操作提示信息、数据等。这样前端在拿到状态码、以及提示信息就可以在前端提示用户,并在页面展示响应数据。    返回格式比如:    那么接下来就在SpringBoot项目中定义统一返回结果。    

2021-11-12 19:54:56 1226

原创 SpringBoot实现发送邮件功能

1、导入依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId></dependency>2、application.yml文件中进行配置:spring: mail: default-encoding: utf-8 # 主机地址

2021-11-10 16:33:49 613

原创 SpringBoot配置logback生成日志文件

1、了解logback:    logback是Spring Boot默认的日志系统,在 spring-boot-starter 中已经包含了logback的依赖,所以并不需要再去额外引用依赖。    其次,官网建议使用-spring变种形式来定义配置文件名,如果使用标准的配置路径,Spring可能不能完全控制日志初始化。    日志的存在可以帮助我们定位问题,较我们通常用的Syst

2021-11-10 14:36:12 2215

原创 两种使用流的方式拼接sql中in需要的字段

1、先对集合流中的每个元素进行格式转换,然后将所有元素以“,”进行拼接String str= list.stream().map(m -> "'" + m.getIccid() + "'").collect(Collectors.joining(","));2、先遍历集合流,在遍历的过程中对元素进行格式转换,最后对字符串进行截取StringBuilder sb = new StringBuilder("(");list.stream().forEach(m -> sb.app

2021-11-08 17:27:04 1456

空空如也

空空如也

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

TA关注的人

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