自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL原理(十):主从架构

上一篇介绍了 MySQL 的表分区和分库分表,这一篇将介绍主从架构相关的内容。本文介绍了 MySQL 的主从架构。至此我的 MySQL 学习笔记就全部更新完毕了。学习和使用 MySQL 陆陆续续也有两三年了,从最开始只关注如何使用,到现在为了应付面试而更多的关注原理和实现,但是很多地方都只是停留在表面,并没有自己深入源码去分析和做实验来验证,只能说希望以后有机会再次学习吧。

2023-05-10 17:58:15 776 1

原创 MySQL原理(九):表分区和分库分表

上一篇介绍了 MySQL 的存储过程和触发器,这一篇将介绍表分区和分库分表相关的内容。本文介绍了 MySQL 的表分区和分库分表。下一节将介绍 MySQL 的主从架构。

2023-05-10 17:55:20 2017

原创 MySQL原理(八):触发器和存储过程

上一篇介绍了 MySQL 的内存管理和磁盘管理,这一篇将介绍存储过程和触发器相关的内容。DELIMITER $ -- 创建的语法:指定名称、入参、出参 CREATE PROCEDURE 存储过程名称(返回类型 参数名 1 参数类型 1 , . . . .) [ . . . 约束条件 . . . ] -- 表示开始编写存储过程体 BEGIN -- 具体组成存储过程的SQL语句.... -- 表示到这里为止,存储过程结束 END $ DELIMITER;表示指定结束标识。在 MySQL 中默认是以分号;

2023-05-10 17:54:15 1279

原创 MySQL原理(七):内存管理和磁盘管理

上一篇介绍了 MySQL 的日志,这一篇将介绍内存管理和磁盘管理相关的内容。本文介绍了 MySQL 内存管理和磁盘管理。(十二)MySQL之内存篇:深入探寻数据库内存与Buffer Pool的奥妙!下一节将介绍 MySQL 存储过程和触发器。

2023-05-10 17:53:02 1196

原创 MySQL原理(六):日志

上一篇介绍了 MySQL 的锁,这一篇将介绍日志相关的内容。undo log(回滚日志):是 Innodb 存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和 MVCC。redo log(重做日志):是 Innodb 存储引擎层生成的日志,实现了事务中的持久性,主要用于故障恢复;binlog (归档日志):是 Server 层生成的日志,主要用于数据备份和主从复制;

2023-05-10 17:51:25 536

原创 MySQL原理(五):锁

上一篇介绍了 MySQL 的事务,这一篇将介绍锁相关的内容。只要存在并发场景,就需要解决并发带来的问题,比如常见的脏写、脏读等等。锁是解决并发问题最常用的手段之一。MySQL 的锁机制是由存储引擎实现的,不同的存储引擎支持的锁页不同,默认的 InnoDB 存储引擎中实现的锁,按照粒度可以划分为全局锁、表级锁、行级锁。本文介绍了 MySQL 锁相关的内容,下一节将介绍 MySQL 的日志。

2023-05-10 17:42:34 821

原创 MySQL原理(四):事务

上一篇介绍了 MySQL 的索引,这一篇将介绍事务相关的内容。在 MySQL 的使用场景中,经常会有一个操作包含多个 SQL 语句,比如转账这个操作,至少包含从甲的账户中扣除金额和给乙的账户中增加金额这两个更新语句。那假如 MySQL 在执行途中发生了崩溃,就可能导致第一个操作成功而第二个操作失败,从而就会导致系统出错。为了解决这一类问题,MySQL 实现了事务,事务通常是由一组 SQL 组成的,这些 SQL 语句要么全部执行成功,要么全部执行失败,不会发生部分成功的情况。原子性(Atomicity)

2023-05-10 17:40:46 790

原创 MySQL原理(三):索引

上一篇介绍了 MySQL 的逻辑架构和执行过程,这一篇将介绍索引相关的内容。索引是用额外的数据结构,来实现快速检索目标数据的。就像字典当中的目录一样,用额外的空间来存储部分内容,从而加快检索速度。MySQL 的逻辑架构分为 Server 层和存储引擎层,其中索引和数据就位于存储引擎中,而不同的存储引擎可能有不同的实现索引的方式,比如常见的 InnoDB 和 MyISAM 使用的都是 B+Tree,但是实现方式不同。按「数据结构」分类:B+ 树索引、B 树索引、Hash 索引等。

2023-05-10 17:37:28 868

原创 MySQL原理(二):逻辑架构和执行流程

上一篇介绍了 MySQL 默认的 InnoDB 存储引擎是如何存储和组织数据的,这一篇将介绍 MySQL 的逻辑架构,以及分析一条 SQL 语句的具体执行过程。本文介绍了 MySQL 的逻辑架构和执行流程。逻辑架构分为 Server 层和存储引擎层。执行流程主要是在 Server 层完成的,主要由连接器、分析器、优化器、执行器完成。下一节将介绍 MySQL 的索引。

2023-05-10 17:31:52 823

原创 MySQL原理(一):逻辑存储结构

从本文开始,我将分享一下近期学习 MySQL 的笔记,其中大部分来源于极客时间的《MySQL实战45讲》、小林coding、以及部分其他博客和书籍。这次系列文章着重讲 MySQL 的原理部分,主要是用于面试,也就是我们常说的八股,至于基础的内容就不再介绍了。我将在后续文章中陆续介绍以下内容:存储结构、逻辑架构和执行流程、索引、事务、锁、日志、内存管理、磁盘空间管理、集群相关等。另外,如果没有额外说明,介绍的主要内容都是关于默认的 InnoDB 引擎。接下来开始正式讲解逻辑存储架构相关内容。

2023-05-10 17:28:59 2035

原创 Redis(十四):性能问题

上一篇介绍了 Redis 作为缓存服务器的问题。这节开始介绍 Redis 性能方面的问题。Redis 的性能主要会受以下几方面的影响。本文介绍了影响 Redis 性能方面相关的几个问题。至此我的 Redis 学习笔记就全部更新完毕了。因为只是为了学习 Redis 和应付面试,并没有涉及到很多应用方面的内容,也没有处处深入到源码分析,而且内容的覆盖面也不够广,希望以后有机会可以继续学习完善吧。最后再扯点废话,我个人的话是在准备 24 秋招,方向是后端开发,语言可能会使用 Java 或者 Go。

2023-03-22 19:38:31 496

原创 Redis(十三):作为缓存服务器时的问题

上一篇介绍了 Redis 的切片集群。这节开始介绍 Redis 作为缓存服务器时的问题。Redis 最常见的应用场景就是作为缓存数据库,以提高数据访问的速度。缓存的一大问题就是一致性问题,即如何尽量与存储数据库的数据保持一致的问题。本文介绍了 Redis 作为缓存服务器时的问题,Redis 作为缓存服务器时,通常会选用旁路缓存策略。这种策略的优点是性能好,非常适合作为读缓存,但是在更新缓存时可能存在数据一致性的问题。缓存本身还会有雪崩、击穿、穿透三个问题,每个问题都有各自的应对方案。

2023-03-22 19:36:17 693

原创 Redis(十二):切片集群

上一篇介绍了 Redis 的哨兵机制。这节开始介绍 Redis 的切片集群。当单个 Redis 实例存储的数据越来越多时,其所需的内存空间大小、磁盘空间大小、CPU 处理能力也会越来越高。纵向扩展:升级单个 Redis 实例的资源配置。优点是简单直接;缺点是会受到硬件成本的限制,且单个实例处理数据的时间会增加。横向扩展:横向增加 Redis 实例的个数。优点是硬件成本低,且每个节点处理的效率都很高;缺点是实现较为困难,需要对数据进行切分和组织。

2023-03-22 19:35:12 402

原创 Redis(十一):哨兵机制

上一篇介绍了 Redis 的主从模式。这节开始介绍 Redis 的哨兵机制。上一节提到的,主从架构可以在主节点发生故障时,将从节点切换为主节点继续使用,从而实现整个集群的高可用性。Redis2.8 以后提供了哨兵(Sentinel)机制,它的作用是自动进行主从节点异常下线和故障转移。它会监测节点是否存活,如果发现节点挂了,就会将节点下线;如果故障的是主节点,还会选举一个从节点切换为主节点,并且把新主节点的相关信息通知给从节点和客户端。哨兵其实是一个运行在特殊模式下的 Redis 进程。

2023-03-21 19:21:21 452

原创 Redis(十):主从模式

上一篇介绍了 Redis 应对并发问题的方案。这节开始介绍 Redis 的主从模式。由于 Redis 是基于内存的,一旦发生崩溃就会导致数据的丢失,所以单个 Redis 实例并不能保证数据的可靠性。为了应对高可靠性要求的场景,可以使用多个 Redis 实例作为某个节点的备份实例,从而实现了主从架构。从节点可以作为主节点的备份节点,当主节点崩溃时,由于各个节点间的数据是相同的,还能够切换节点来保证整个集群的可靠性。

2023-03-21 19:19:36 665

原创 Redis(九):并发问题

上一篇介绍了 Redis 的内存管理。这节开始介绍 Redis 并发方面的问题。Redis 的单个命令是原子的,但是一个业务操作可能包含多条命令,比如以下场景:客户端查询值,并递增,在高并发场景下就可能出现并发问题,导致数据不一致。为了保证并发访问的正确性,Redis 提供了三种方法,原子操作、分布式锁、事务。本文介绍了 Redis 应对并发问题的三种方案,Redis 中的单条命令都是原子操作,而且还有 INCR/DECR 来应对简单的场景。

2023-03-20 21:15:54 1001

原创 Redis(八):内存管理

上一篇介绍了 Redis 的数据持久化。这节开始介绍 Redis 的内存管理相关问题。Redis 是基于内存的,那么必然就会涉及到内存空间的管理,需要采用一定的策略,将过期的数据删除,以及需要淘汰部分内存,来提高内存空间的利用率。先来说说过期数据的问题,Redis 是可以对 key 设置过期时间的,那么当这些数据过期后,就应该采用对应的手段删除数据,来释放内存空间。

2023-03-20 21:13:44 365

原创 Redis(七):持久化:AOF和RDB

上一篇介绍了 Redis 实现消息队列的三种方式。这节开始介绍 Redis 的持久化问题。我们都知道 Redis 是基于内存的数据库,而内存又是易失性的,一旦遇到断电或异常重启等问题时,内存中的数据就会丢失。所以 Redis 为了保证数据的可靠性花了不少功夫。Redis 主要是通过 AOF 日志和 RDB 快照来实现持久化的。AOF 日志:每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里;RDB 快照:将某一时刻的内存数据,以二进制的方式写入磁盘;混合持久化。

2023-03-20 21:13:42 520

原创 Redis(六):消息队列

上一篇介绍了 Redis 是如何进行通信的。这节开始介绍一个常见的具体通信例子:消息队列。消息队列(Message Queue)是一种常见的通信方式,它是一种异步通信模式,主要由发送者(也称生产者)、消息队列、接收者(也称消费者)组成,发送者负责将消息发送到消息队列中,消息队列负责对消息进行存储,接收者负责从消息队列中取出消息并进行处理。消息保序:消费者需要按照生产者发送消息的顺序来处理信息;处理重复消息:如果因为网络堵塞而出现消息重传,对于重复的消息只能处理一次;

2023-03-19 17:59:35 416

原创 Redis(五):Redis是如何进行通信的

上一篇介绍了 Redis 的单线程模型和多线程模型。这节开始介绍 Redis 各个实例之间以及与客户端之间是如何通信的。Redis 与客户端之间,以及每个实例之间都是通过TCP 长连接进行通信的,即使多个实例在同一台服务器上运行也是一样。Redis 通过 TCP 长连接来实现高效的数据传输和低延迟的数据交互,同时也能够避免频繁的建立和关闭网络连接所带来的性能开销。

2023-03-19 17:55:32 885

原创 Redis(四):线程模型

上一篇介绍了 Redis 定义的九大数据类型。这节开始介绍 Redis 中的线程模型:单线程模型和多线程模型。本文介绍了 Redis 的单线程模型和多线程模型,单线程模型是指网络 IO 和读写键值对由主线程这一个线程来完成,而其他操作可以交由子线程完成。多线程则是在单线程的基础上,采用多个线程来处理网络请求。下一节将介绍 Redis 之间是如何进行通信的。

2023-03-19 17:53:37 584 1

原创 Redis(三):数据类型

上一篇介绍了 Redis 定义的八大数据结构:SDS、双向链表、压缩列表、哈希表、整数集合、跳表、quicklist、listpack。这节将开始介绍在这些数据结构的基础上实现的九大数据类型:String、List、Hash、Set、Sorted Set、BitMap、HyperLogLog、GEO、Stream。

2023-03-16 19:33:14 394

原创 Redis(二):自定义数据结构

上一篇介绍了 Redis 是如何存储和索引数据的,这一篇将介绍 Redis 定义的八大数据结构,这些高效的数据结构,不仅帮助 Redis 实现了高性能,更能够应用于各种场景。八大数据结构如下:SDS、双向链表、压缩列表、哈希表、整数集合、跳表、quicklist、listpack。本文介绍了 Redis 的八大数据结构。下一节将介绍在这些数据结构基础上实现的九大数据类型。

2023-03-16 19:30:18 421

原创 Redis(一):数据结构-底层架构

Redis 是一种**基于内存**的键值对数据库,对数据的读写操作都是在内存中完成,因此**读写速度非常快**,常用于缓存,消息队列、分布式锁等场景。Redis 的快,一方面得益于内存的快,另一方面是由于 Redis 的底层架构和许多自定义的高效数据结构。相较于同样基于内存的键值对数据库 Memcache,Redis 有更多的数据类型,能够满足更多的应用场景。

2023-03-16 19:25:20 341

原创 简述操作系统的文件系统

文件系统是操作系统中负责管理持久数据的子系统,将用户的文件保存在硬盘等硬件设备中,即使断电了数据也不会丢失。对于用户而言,文件是存储的最小单位,再少的数据也需要以文件的形式存储在外部存储器中。以硬盘为例,磁盘读写的最小单位是扇区,扇区的大小只有512B大小,文件系统把多个扇区组成了一个逻辑块,每次读写的最小单位就是逻辑块(数据块),Linux 中的逻辑块大小为4KB,也就是一次性读写 8 个扇区,这将大大提高了磁盘的读写效率。

2023-02-21 15:17:25 898

原创 简述操作系统的系统中断

*内中断又称为软件中断、同步中断、异常,内中断的信号来源于 CPU 内部、与当前执行的指令有关。IDT 存在于内核空间,IDT 中的每一个表项叫做中断描述符、中断向量,或门描述符(gate descriptor),”门“的含义是指当中断发生时,必须先通过这些门,然后才能进入相应的处理程序。如果决定响应,就终止当前运行的进程,根据 IDTR 寄存器获取中断描述符表的基地址,然后根据中断号定位具体的中断描述符。**外中断又称为硬件中断、异步中断,外中断的信号来源于 CPU 外部,与当前执行的指令无关。

2023-02-11 16:30:16 1936

原创 进程管理(四)——进程调度

进程调度

2022-08-20 17:09:01 1300

原创 进程管理(三)——进程间通信和多线程问题

进程间通信和多线程问题

2022-08-20 17:06:47 507

原创 进程管理(二)——线程

操作系统线程

2022-08-20 17:04:17 623

原创 进程管理(一)——进程

操作系统进程管理

2022-08-20 17:00:02 562

原创 操作系统的死锁问题

操作系统死锁问题

2022-08-20 16:56:31 694

原创 内存管理(五)——内存回收

内存回收

2022-08-04 17:25:03 2239

原创 内存管理(四)——虚拟内存

虚拟内存

2022-08-04 17:21:32 893

原创 内存管理(三)——内存分页

内存分页

2022-08-04 17:15:31 4002

原创 内存管理(二)——内存分段

内存分段

2022-08-04 17:11:02 2326

原创 内存管理(一)——内存分配

内存分配

2022-08-04 17:07:22 5016

原创 一个程序从编译到运行的全过程

一个程序从编译到运行的全过程

2022-07-29 12:49:47 6837 3

原创 操作系统启动过程

操作系统启动过程

2022-07-28 12:05:21 9094

原创 详解浮点数的精度问题

详解浮点数精度问题

2022-07-20 16:06:25 6861 3

原创 TCP的拥塞控制

TCP的拥塞控制

2022-07-19 11:04:36 7743 2

空空如也

空空如也

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

TA关注的人

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