- 博客(104)
- 收藏
- 关注
原创 mysql系列10—mysql锁
mysql中锁机制核心是保证数据的一致性以及并发控制。锁机制的实现与存储引擎有关,本文介绍的是INNODB存储引擎的锁机制;其他存储引擎如myISAM和memory等仅支持表锁不支持行锁,不是本文关注的重点。本文介绍mysql数据库提供的锁机制,包括共享锁和排它锁、表锁和行锁、间隙锁和next_key锁。理解本文后,有助于在不同业务场景设计出合理的索引结构。最后介绍死锁的检测和处理方式。
2025-03-01 13:43:00
746
原创 mysql系列9—mysql的MVCC机制
mysql提供了读未提交、读已提交、可重复读、串行化四种隔离级别,默认的隔离界别为可重复读。其中,不可重复度场景下,每次直接读取最新记录(即使事务未提交);串行化对于所有的读写都加锁,因此,对二者不做过多介绍,MVCC只适用于可重复度和读已提交。mysql的并发事务中存在三种冲突:读-读、读-写、写-写。其中读-读没有冲突,可以同时进行;写-写通过数据库锁实现冲突分离;MVCC解决的是读-写冲突,并尽可能提高数据库性能。
2025-02-23 11:43:48
925
原创 mysql系列8—Innodb的undolog
本文涉及的内容较为底层,做了解即可,是以前学习《高性能mysql》和《mysql是怎样运行的》的笔记整理所得。undolog设计的初始目的是保证事务的原子性。mysql的修改操作发生后,如果所在的事务未被提交,如mysql服务或者操作系统发送了异常或执行了回滚等情况,事务的已修改操作需被还原。而还原需记录必要的数据,这些数据就是undolog。
2025-02-16 10:29:54
1018
原创 mysql系列7—Innodb的redolog
redolog的核心作用是保证数据库的持久性。数据和索引保存在磁盘上,为提高效率读写时需从磁盘将数据加载到内存(Buffer Pool)中,并基于内存进行读写。内存中的数据不稳定,当系统断电或者崩溃时数据会丢失,因此所有修改最终都要刷入磁盘。数据库事务具有持久性,事务提交成功后,无论数据库环境如何(数据库或者操作系统崩溃),已提交事务涉及的修改都会被保存下来。
2024-12-28 16:54:10
1132
原创 mysql系列6—binlog日志介绍
binlog(binary log)是mysql的二进制日志,用于顺序记录数据库的逻辑变更。binlog记录DDL和DML等涉及数据库修改的操作,而不会记录Select和show等查询类操作。由于顺序记录了数据库发生的变化,binlog承载了数据库的变化信息,可用于进行数据库数据复制和数据同步、数据恢复、数据审计等。
2024-12-22 13:30:58
1845
原创 mysql系列5—Innodb的缓存
建议读者站在设计者的角度,思考如何设计InnoDB缓存以中的聚簇索引为例, 查询主键为33的记录:[1] 加载聚簇索引根节点所在的数据页;[2] 使用33与目录(21, 35)依次进行比较,得到子节点信息(地址、表空间、页号);[3] 加载子节点所在的数据页;[4] 使用33与目录(30, 32, 33)依次进行比较,得到叶子节点信息(地址、表空间、页号);[5] 将叶子节点中保存的数据返回;此过程涉及3次IO操作,由于索引和数据存放于磁盘中,3次IO均为磁盘IO,速度较慢;
2024-12-22 10:12:03
959
原创 mysql系列4—mysql数据库设计和查询优化
数据库作为持久层需要从磁盘读写数据,是整个系统的短板,其性能会直接体现在产品性能上。因此数据库的设计和优化再怎么强调也不为过。本文将从数据库设计和查询优化两个角度思考如何提高数据库性能,内容包括数据库范式与表设计、基本字段类型介绍和使用原则、索引设计原则、explain和optimze_trace命令使用介绍、索引失效场景等。本文旨在为读者提供数据库设计指导以及帮助读者提高数据库设计能力。
2024-12-14 16:54:11
1034
原创 mysql系列3—mysql索引图解
索引类似字典的目录,用于提高查询速度。字典目录存放单词与页码的映射关系,在目录中根据单词找到页码,根据页码翻到指定页面,得到单词的详细信息。数据以行为单位存放于磁盘,每条行记录对应一个存储地址,索引可以存放数据和存储地址的映射关系,通过索引可快速得到记录的地址;没有索引,查询将退化为数据库遍历。以上是对索引概念的泛泛理解,mysql索引体系的建立也以此为基础,并进行扩展优化。本文介绍mysql索引为后续介绍mysql索引创建原则、索引失效场景以及explain命令的介绍建立基础。
2024-12-08 11:04:50
1134
原创 mysql系列2—InnoDB数据存储方式
本文将深入探讨InnoDB的底层存储机制,包括行格式、页结构、页目录以及表空间等核心概念。通过全面了解这些基础概念,有助于把握MySQL的存储架构,也为后续深入讨论MySQL的索引原理和查询优化策略奠定了基础。
2024-12-01 13:43:43
929
原创 mysql系列1—mysql架构和协议介绍
理解存储引擎,需要建立在数据存储形式以及底层IO的基础上(在后续文章中介绍)。本章仅从特性的角度进行简要说明。如前文介绍,mysql在数据存储层通过插件机制实现,从而支持多种存储引擎,可以在定义表结构时指定使用的存储引擎。常见的存储引擎包括MyIsam、InnoDB、MEMORY、Archive、CSV、Blackhole,其中InnoDB是Mysql8默认的存储引擎。一般而言,MyIsam和InnoDB已满足大部分的业务场景,其他存储引擎作简单了解即可。
2024-11-24 11:48:20
747
原创 IO系列-3 NIO基本概念:Buffer和Channel和Selector
以下通过建立一个TCP服务端的案例演示NIO的使用方式,案例包含了缓冲区、通道、选择器的使用方式。try {// 调用选择器的select()方法阻塞等待(当有IO事件到达时,从阻塞中唤醒)// 获取所有已就绪事件// 遍历事件// 处理连接事件// 处理可读事件// 移除已处理事件,防止死循环。
2024-10-07 16:00:37
1217
原创 Netty系列-8 Netty处理粘包和半包问题
TCP协议是基于字节流的数据通讯协议,数据被看做是一连串的字节流;不具备边界信息,给接收方带来半包和粘包问题。半包:TCP传输时,将数据切割成一个个数据包进行传输。接收方一次读取操作,如果没有接受完完整的数据包而只能读取部分数据时,出现半包问题。粘包:发送方发送的两个或者多个数据包在接受方接受时被合并成了一个数据包。半包和粘包问题可以通过业务层解决。
2024-10-04 12:09:20
872
原创 Netty系列-7 Netty编解码器
netty框架中,自定义解码器的起点是ByteBuf类型的消息, 自定义编码器的终点是ByteBuf类型。
2024-10-02 13:57:39
876
原创 Netty系列-6 Netty消息处理流程
前文介绍了Netty服务端的启动流程,服务端启动后可以处理客户端发送的请求,包括连接请求和普通消息。当客户端有连接请求到达时,服务器会创建通道并将通道注册到选择器上,处理逻辑与NIO中实现完全一致。详细流程如下所示:本章节将分小节对上图进行详细介绍。在Netty系列-5 Netty启动流程中介绍过,当Netty服务端启动时,将NioServerSocketChannel作为attachment:将this(NioServerSocketChannel对象)作为attachment传递给registe
2024-09-30 23:50:57
1047
原创 Netty系列-5 Netty启动流程
将负责处理连接的和负责业务处理的NioEventLoopGroup线程池对象、通道类型、处理器Handler、子处理器Handler、连接配置等保存至ServerBootstrap对象,然后调用ServerBootstrap对象的bind方法启动Netty程序。可以将ServerBootstrap和Bootstrap理解为启动引导器,将信息告知引导器,然后由引导器负责执行后续的启动流程。因此在介绍启动流程前,有必要简单了解一下ServerBootstrap和Bootstrap。
2024-09-28 23:18:08
1229
原创 Netty系列-4 Pipeline和Handler
Netty将IO事件按照流向划分为两个部分,对应Inbound入站事件和Outbound出站事件:入站事件由外部触发,包括通道注册(register)、通道激活(active)、数据可读(read)、通道异常(exceptionCaught)等;出站事件由程序主动触发,如连接的建立(bind, connect)与关闭(closh),数据的写出(write、flush)等。先整体上看, Netty的每个通道都独有一个Pipeline,通道的出站和入站事件在Pipeline中流动和处理,如下所示:上图包含了
2024-09-22 17:59:13
1118
原创 服务器环境搭建-6 Minio安装与使用介绍
本文介绍Minio的搭建过程和使用方式,之后基于Minio给出一个Java使用案例。后续“基于Minio实现分片上传和断点续传”文章将以本文为基础。
2024-09-08 20:47:59
1658
原创 Netty系列-3 ChannelFuture和ChannelPromise介绍
Netty源码中大量使用了Future和Promise,学习ChannelFuture和ChannelFuture有助于理解Netty的设计思路。本文的重点内容在于梳理清楚这些类的关系以及结合源码实现介绍这些类的作用,其中核心逻辑在于DefaultPromise和DefaultChannelPromise
2024-09-07 13:41:28
1341
原创 Netty系列-2 NioServerSocketChannel和NioSocketChannel介绍
本文介绍Netty的通道组件NioServerSocketChannel和NioSocketChannel,从源码的角度介绍其实现原理。
2024-09-01 15:04:22
1294
原创 Netty系列-1 NioEventLoopGroup和NioEventLoop介绍
本文从源码的角度介绍NioEventLoopGroup和NioEventLoop,包含NioEventLoopGroup和NioEventLoop内部的组件。
2024-08-25 18:26:06
1627
原创 LocalDateTime的序列化和反序列化
最近定位出一个LocalDateTime序列化相关的问题,简单记录一下。本文重点介绍Jackson对LocalDateTime的序列化和反序列化,并结合Spring应用场景进行介绍。
2024-07-30 21:41:18
1298
原创 前端系列-9 Vue3生命周期和computed和watch
本文介绍Vue3的生命周期和钩子函数,鉴于篇幅允许以及防止前端文章过于分散,因此将watch和computed部分之前的学习笔记也整理到本文中。这三部分是三个知识点。watch可以与pinia的$subscribe状态监听进行比较学习。
2024-07-29 21:06:22
1712
原创 Nginx系列-12 Nginx使用Lua脚本进行JWT校验
本文介绍Nginx中Lua模块使用方式,并结合案例进行介绍。案例介绍通过lua脚本提取HTTP请求头中的token字段,经过JWT校验并提取id和name信息,设置到http请求头中发向后段服务器。默认情况下,Nginx自身不携带lua模块,即不支持通过lua脚本进行功能扩展。需要在编译Nginx时手动引入lua模块,或者直接使用openresty,本文结合后者进行介绍。
2024-07-28 16:48:46
1360
原创 Nginx系列-11 HTTP消息处理流程
了解Nginx处理HTTP请求的11个阶段,有助于理解和配置nginx、自定义模块、基于lua模块自定义功能。按如下配置,执行"curl http://localhost:8001/query/test.html",如果读者对结果不是很确定,建议阅读本文。
2024-07-28 10:04:46
924
原创 Nginx系列-10 realIp模块使用
当请求被代理后,真实客户端相对服务器被隐藏,即服务端无法判断HTTP消息来源。可通过将客户端的IP添加入HTTP消息解决上述问题,可在消息头中添加字段。
2024-07-26 23:04:12
1464
原创 Nginx系列-9 Nginx配置HTTPS
消息在公网上传输需要进行加密,以保证信息的安全性。加密有对称加密和非对称加密两种;对称加密使用同一个秘钥进行加密和解密;非对称加密使用一对秘钥进行加解密。对称加密相对于非对称加密速度快、效率高。在HTTPS握手过程,服务端会将证书(公钥和CA信息)发送给客户端;客户端使用CA信息验证证书的合法性,然后随机生成一个秘钥,并使用证书中携带的公钥对该生成的秘钥加密,然后发送给服务端;服务端使用私钥进行解密,得到秘钥;之后,双方使用这个对称加密的秘钥进行信息的加解密。因此,需要服务端需要准备证书和私钥。
2024-07-25 20:53:59
946
原创 前端系列-8 集中式状态管理工具pinia
pina提供了defineStore方法创建store,store作为集中式状态管理的实体,可被任意组件读取/写入数据。定义的store一般放在src/stores目录下。// 定义并暴露一个store// 配置信息})defineStore方法接收两个参数,store的唯一标识符和store的配置对象。其中,store配置对象中可以包含 state函数、actions对象、getters对象。
2024-07-25 20:52:54
626
原创 Nginx系列-8 常见指令收集
一般,可以将allow/deny配置在http块、server块、location块中。请求会按照优先级顺序自上而下进行匹配,匹配一个就中断。server {#第1条#第2条#第3条deny all;#第4条#第5条allow all;#第6条# ...当192.168.0.1访问时,匹配第1条,允许访问,即192.168.0.1可穿过access阶段;当192.168.0.2访问时,匹配第2条,被拦截,返回403;
2024-07-24 21:19:00
1378
原创 前端系列-7 Vue3响应式数据
响应式数据的核心是当数据模型发生变化时,与之相关(使用该数据模型)的视图或组件可以自动更新,以反映最新的数据状态。实现原理是数据劫持、依赖收集和分发更新,数据劫持是一种AOP策略。在vue2中通过Object.defineProperty方法为对象的每个属性设置setter和getter方法,当访问或者修改对象的属性时,进入setter/getter方法,从而实现拦截。getter方法被调用时,可以进行依赖收集,确认属性被哪些组件依赖;
2024-07-24 18:58:22
778
2
原创 前端系列-6 使用Vue3搭建前端工程与setup语法糖介绍
本文介绍如何使用vue3脚手快速搭建一个前端项目,并对生成的项目结构进行简单介绍,然后介绍setup语法糖。前端入门的同学可基于本文内容快速搭建属于自己的项目。vue官网资料显示, vue3开发的项目相对vue2, 具有打包后体积变小,极速启动服务、渲染速度快、内存减少、拥抱ts编程等优点。
2024-07-23 22:43:22
1451
原创 Nginx系列-2 Nginx配置文件介绍
本文用于介绍Nginx配置文件的内容,先从整体结构上进行介绍,再分功能对常见配置指令进行说明,最后对location和server块的配置进行介绍。由于Nginx配置文件内容较多,因此将较为复杂的配置指令单独抽出专题进行介绍,如rewrite、upstream、proxy_pass、root和alias等指令,包括以下文章:Nginx系列-3 servername优先级和location优先级和常用正则表达式Nginx系列-4 proxy_pass使用和路径拼接问题。
2024-07-23 21:55:22
1084
原创 Nginx系列-7 upstream与负载均衡
upstream允许将一组服务器定义为一个服务器组,之后可基于这个组进行请求的分发,从而实现负载均衡、故障转移等功能。每个服务器可以使用ip:端口形式或者域名:端口形式;端口省略时,http使用80端口,https使用443端口。后续可直接使用服务器名,将其作为服务器使用
2024-07-21 08:40:35
5158
1
原创 Nginx系列-6 rewrite使用介绍
rewrite指令可以定义在server块和location块中,用于URL重写。说明:rewrite重写url,一般不重写域名和端口,即正则表达式和修改后的路径只针对url部分;如果重写了域名和端口,就被认为是重定向,返回302重定向到重写路径。regex为正则表达式部分,用于匹配需要重写的url;replacement为替换内容,将匹配正则表达式的url替换为replacement;本条规则匹配完成后,继续向下匹配新的location规则;本条规则匹配完成即终止,不再匹配后面的任何规则;
2024-07-21 08:26:02
4522
原创 Nginx系列-5 root和alias和index和try_files
root和alias用于指定文件系统的路径。root一般定义在server块中,为每个server指定文件系统路径;alias只能定义在location块中,为具体的url指定文件系统。二者的差别还体现在:[1] root只能指定目录,而alias可以指定目录也可以指定文件;[2] root和alias的路径拼接方式不同。本章节在介绍root和alias的使用过程中,会围绕差异点进行细致描述。如果对这两点比较熟悉,请直接跳过本章内容。
2024-07-21 08:25:01
5936
原创 Nginx系列-3 servername优先级和location优先级和常用正则表达式
servername配置在server块中。当客户端向Nginx服务器发送请求时,Nginx会根据请求的Host头字段与server_name进行匹配,以确定将请求转发到哪个server块进行处理。
2024-07-20 19:10:45
5071
1
原创 前端系列-5 SCSS使用介绍
Sass作为一种强化CSS的辅助工具,提供了变量、嵌套、混合、继承、导入等功能,是的CSS代码更具可维护性。文件有两种格式:一种以.scss为文件后缀,语法与css相似,使用分号换行,使用大括号包裹样式;一种以.sass为文件后缀使用缩进代替大括号,使用换行代替分号。
2024-07-14 15:11:10
4651
原创 日志轮转—cron和logrotate
本文介绍如何基于linux系统的cron和logrotate实现日志轮转。cron是一个定时任务管理器,根据配置定时触发任务;logrotate是一个日志轮转工具,根据配置处理日志,logrotate依赖于cron的定时触发。cron是linux系统自带的执行定时任务的工具。cron有3个概念需要区分:cron代表这个软件,crond代表实际运行的进程,crontab用于修改配置文件的客户端工具。cron的核心是配置文件,crond每分钟会读取并比较配置文件时间戳,以确认是否有修改。
2024-06-22 20:47:48
5483
1
空空如也
JVM直接内存释放问题
2023-06-05
TA创建的收藏夹 TA关注的收藏夹
TA关注的人