自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 《MySQL 实战 45 讲》课程学习笔记(二)

日志系统:一条 SQL 更新语句是如何执行的?与查询流程不一样的是,更新流程还涉及两个重要的日志模块:redo log(重做日志)和 binlog(归档日志)。重要的日志模块:redo logMySQL 的 WAL 技术WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log 里面,并更新内存,这个时候更新就算完成了。InnoDB 引擎会在适当的时候,将这个操作记录更新到

2023-07-30 19:02:42 448

原创 《Redis 核心技术与实战》课程学习笔记(六)

在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制。

2023-07-11 01:22:32 378

原创 《Redis 核心技术与实战》课程学习笔记(五)

因为 repl_backlog_buffer 是一个环形缓冲区,所以在缓冲区写满后,主库会继续写入,此时,就会覆盖掉之前写入的操作。如果从库的读取速度比较慢,就有可能导致从库还未读取的操作被主库新写的操作覆盖了,这会导致主从库间的数据不一致。一旦主从库完成了全量复制,它们之间就会一直维护一个网络连接,主库会通过这个连接将后续陆续收到的命令操作再同步给从库,这个过程也称为基于长连接的命令传播,可以避免频繁建立连接的开销。

2023-07-10 22:51:26 316

原创 《Redis 核心技术与实战》课程学习笔记(三)

高性能 IO 模型:为什么单线程 Redis 能那么快?Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。Redis 为什么用单线程?多线程的开销我们刚开始增加线程数时,系统吞吐率会增加,但是,再进一步增加线程时,系统吞吐率就增长迟缓了,有时甚至还会出现下降的情况。一个关键的瓶颈在于,系统中通常会存在被多线程

2023-07-05 00:43:59 266

原创 《kafka 核心技术与实战》课程学习笔记(八)

无消息丢失配置怎么实现?

2023-06-26 13:48:39 1022

原创 《kafka 核心技术与实战》课程学习笔记(六)

生产者消息分区机制原理剖析为什么分区?Kafka 有主题(Topic)的概念,它是承载真实数据的逻辑容器,而在主题之下还分为若干个分区,也就是说 Kafka 的消息组织方式实际上是三级结构:主题 - 分区 - 消息。主题下的每条消息只会保存在某一个分区中,而不会在多个分区中被保存多份。分区的作用就是提供负载均衡的能力对数据进行分区的主要原因,就是为了实现系统的高伸缩性(Scalability)。不同的分区能够被放置到不同节点的机器上,而数据的读写操作也都是针对分区这个粒度而进行的,这样每个

2023-06-25 22:26:29 1231

原创 《Java并发编程实战》课程学习笔记(十五)

Executor 与线程池:如何创建正确的线程池?线程池是一种生产者-消费者模式线程是一个重量级的对象,应该避免频繁创建和销毁。那如何避免呢?应对方案就是线程池。目前业界线程池的设计,普遍采用的都是生产者-消费者模式。线程池的使用方是生产者,线程池本身是消费者。如何使用 Java 中的线程池Java 并发包里提供的线程池,最核心的是 ThreadPoolExecutor,它强调的是 Executor,而不是一般意义上的池化资源。ThreadPoolExecutor 的构造函数非常复杂,这个

2023-06-06 13:36:11 297

原创 《Java并发编程实战》课程学习笔记(十四)

unsafe.getAndAddLong() 方法首先会在内存中读取共享变量的值,之后循环调用 compareAndSwapLong() 方法来尝试设置共享变量的值,直到成功为止。compareAndSwapLong() 是⼀个 native 方法,只有当内存中共享变量的值等于 expected 时,才会将共享变量的值更新为 x,并且返回 true;否则返回 fasle。compareAndSwapLong 的语义和 CAS 指令的语义的差别仅仅是返回值不同而已。Java 提供的原子类里面 CAS

2023-06-06 02:22:15 288

原创 《Java并发编程实战》课程学习笔记(十三)

Java 并发包里阻塞队列都用 Blocking 关键字标识,单端队列使用 Queue 标识,双端队列使用 Deque 标识。

2023-06-05 20:24:31 609

原创 《Java并发编程实战》课程学习笔记(十)

读写锁,并不是 Java 语言特有的,而是一个广为使用的通用技术

2023-06-05 12:49:33 466

原创 《Java并发编程实战》课程学习笔记(七)

Java 线程的生命周期

2023-06-01 09:52:28 452

原创 《Java并发编程实战》课程学习笔记(四)

Java 编译器会在 synchronized 修饰的方法或代码块前后自动加上加锁 lock() 和解锁 unlock()。

2023-05-31 02:15:18 750

原创 《Java并发编程实战》课程学习笔记(二)

可见性、原子性和有序性问题:并发编程 Bug 的源头

2023-05-26 00:51:00 614

原创 《Java并发编程实战》课程学习笔记(一)

并发领域的全景图并发编程的三个核心问题并发编程可以总结为三个核心问题:分工、同步、互斥。分工指的是如何高效地拆解任务并分配给线程;Java SDK 并发包里的 Executor、Fork/Join、Future 本质上都是⼀种分工方法。除此之外,并发编程领域还总结了一些设计模式,基本上都是和分工方法相关的,例如生产者-消费者、Thread-Per-Message、Worker Thread 模式等都是用来指导你如何分工的。同步指的是线程之间如何协作;本质上就是一个线程执行完了一个任

2023-05-25 13:52:55 820

原创 《kafka 核心技术与实战》课程学习笔记(二)

kafka 的重要概念

2022-01-17 21:03:36 89

原创 《Go 语言第一课》课程学习笔记(十五)

【代码】《Go 语言第一课》课程学习笔记(十五)

2023-09-01 17:09:01 510

原创 《Go 语言第一课》课程学习笔记(十四)

【代码】《Go 语言第一课》课程学习笔记(十四)

2023-08-31 17:04:29 692 1

原创 《Go 语言第一课》课程学习笔记(十三)

类型嵌入指的就是在一个类型的定义中嵌入了其他类型。Go 语言支持两种类型嵌入,分别是接口类型的类型嵌入和结构体类型的类型嵌入。接口类型的类型嵌入接口类型声明了由一个方法集合代表的接口,比如下面接口类型 E:type E interface {M1()M2()这个接口类型 E 的方法集合,包含两个方法,分别是 M1 和 M2,它们组成了 E 这个接口类型所代表的接口。如果某个类型实现了方法 M1 和 M2,我们就说这个类型实现了 E 所代表的接口。

2023-08-30 14:42:42 816

原创 《Go 语言第一课》课程学习笔记(十二)

【代码】《Go 语言第一课》课程学习笔记(十二)

2023-08-29 15:23:53 634 1

原创 《Go 语言第一课》课程学习笔记(十一)

Go 语言的 if 语句还有其他多种形式,比如二分支结构和多(N)分支结构。多分支结构引入了 else if。支持声明 if 语句的自用变量无论是单分支、二分支还是多分支结构,我们都可以在 if 后的布尔表达式前,进行一些变量的声明,在 if 布尔表达式前声明的变量,称为 if 语句的自用变量。顾名思义,这些变量只可以在 if 语句的代码块范围内使用。在 if 语句中声明自用变量是 Go 语言的一个惯用法,这种使用方式直观上可以让开发者有一种代码行数减少的感觉,提高可读性。同时,由于这些变量是 i

2023-08-24 15:19:23 550

原创 《Go 语言第一课》课程学习笔记(十)

map 是 Go 语言提供的一种抽象数据类型,它表示一组无序的键值对。我们会直接使用 key 和 value 分别代表 map 的键和值。而且,map 集合中每个 key 都是唯一的。。key 与 value 的类型可以相同,也可以不同。如果两个 map 类型的 key 元素类型相同,value 元素类型也相同,那么我们可以说它们是同一个 map 类型,否则就是不同的 map 类型。Go 语言中要求,key 的类型必须支持“==”和“!=”两种比较操作符。

2023-08-22 11:28:18 430

原创 《Go 语言第一课》课程学习笔记(九)

常量:Go 在“常量”设计上的创新有哪些?Go 语言在常量方面的创新包括下面这几点:支持无类型常量;支持隐式自动转型;可用于实现枚举。常量Go 语言的常量是一种在源码编译期间被创建的语法元素。这是在说这个元素的值可以像变量那样被初始化,但它的初始化表达式必须是在编译期间可以求出值来的。Go 常量一旦声明并被初始化后,它的值在整个程序的生命周期内便保持不变。我们在并发设计时不用考虑常量访问的同步,并且被创建并初始化后的常量还可以作为其他常量的初始表达式的一部分。Go 是使用

2023-08-21 10:45:38 626

原创 《Go 语言第一课》课程学习笔记(八)

【代码】《Go 语言第一课》课程学习笔记(八)

2023-08-18 14:50:16 840

原创 《Go 语言第一课》课程学习笔记(七)

【代码】《Go 语言第一课》课程学习笔记(七)

2023-08-17 16:23:25 906

原创 《Go 语言第一课》课程学习笔记(六)

【代码】《Go 语言第一课》课程学习笔记(六)

2023-08-17 15:15:23 458

原创 《Go 语言第一课》课程学习笔记(五)

入口函数与包初始化:搞清 Go 程序的执行次序main.main 函数:Go 应用的入口函数Go 语言中有一个特殊的函数:main 包中的 main 函数,也就是 main.main,它是所有 Go 可执行程序的用户层执行逻辑的入口函数。Go 程序在用户层面的执行逻辑,会在这个函数内按照它的调用顺序展开。main 函数的函数原型非常简单,没有参数也没有返回值。Go 语言要求:可执行程序的 main 包必须定义 main 函数,否则 Go 编译器会报错。在启动了多个 Goroutine 的 Go

2023-08-17 11:41:09 607

原创 《Go 语言第一课》课程学习笔记(四)

【代码】《Go 语言第一课》课程学习笔记(四)

2023-08-17 11:01:06 520

原创 《Go 语言第一课》课程学习笔记(三)

构建模式:Go 是怎么解决包依赖管理问题的?Go 项目的布局标准是什么?首先,对于以生产可执行程序为目的的 Go 项目,它的典型项目结构分为五部分:放在项目顶层的 Go Module 相关文件,包括 go.mod 和 go.sum;cmd 目录:存放项目要编译构建的可执行文件所对应的 main 包的源码文件;项目包目录:每个项目下的非 main 包都“平铺”在项目的根目录下,每个目录对应一个 Go 包;internal 目录:存放仅项目内部引用的 Go 包,这些包无法被项目之外引用;ven

2023-08-16 19:51:33 404

原创 《Go 语言第一课》课程学习笔记(二)

【代码】《Go 语言第一课》课程学习笔记(二)

2023-08-16 16:08:21 582

原创 《Go 语言第一课》课程学习笔记(一)

【代码】《Go 语言第一课》课程学习笔记(一)

2023-08-16 14:56:45 933

原创 《MySQL 实战 45 讲》课程学习笔记(五)

数据库锁:全局锁、表锁和行锁根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。全局锁全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。全局锁的典型使用场景是,做全库逻辑备份。也就是把整

2023-07-30 23:36:24 201

原创 《MySQL 实战 45 讲》课程学习笔记(四)

深入浅出索引索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。索引的常见模型哈希表哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表。哈希表这种结构适用于只有等值查询的

2023-07-30 23:24:11 605

原创 《MySQL 实战 45 讲》课程学习笔记(三)

在可重复读隔离级别下,事务在启动的时候就“拍了个快照”。按照可重复读的定义,一个事务启动的时候,能够看到所有已经提交的事务结果。但是之后,这个事务执行期间,其他事务的更新对它不可见。对于当前事务的启动瞬间来说,一个数据版本的 row trx_id,有以下几种可能:一个数据版本,对于一个事务视图来说,除了自己的更新总是可见以外,有三种情况:事务的可重复读的能力是怎么实现的?

2023-07-30 22:56:15 464

原创 《MySQL 实战 45 讲》课程学习笔记(一)

一般语法错误会提示第一个出现错误的位置。

2023-07-30 17:21:44 337

原创 《Java并发编程实战》课程学习笔记(十七)

【代码】《Java并发编程实战》课程学习笔记(十七)

2023-07-22 16:48:20 103

原创 《Java并发编程实战》课程学习笔记(十六)

【代码】《Java并发编程实战》课程学习笔记(十六)

2023-07-22 16:28:43 65

原创 《Kubernetes入门实战课》课程学习笔记(一)

【代码】《Kubernetes入门实战课》课程学习笔记(一)

2023-07-17 18:40:07 1007

原创 《Redis 核心技术与实战》课程学习笔记(八)

Redis 有一种底层数据结构,叫压缩列表(ziplist),这是一种非常节省内存的结构。

2023-07-11 13:53:29 367

原创 《Redis 核心技术与实战》课程学习笔记(七)

切片集群:数据增多了,是该加内存还是加实例?切片集群,也叫分片集群,就是指启动多个 Redis 实例组成一个集群,然后按照一定的规则,把收到的数据划分成多份,每一份用一个实例来保存。如何保存更多数据?Redis 应对数据量增多有两种方案:纵向扩展(scale up)和横向扩展(scale out)。纵向扩展:升级单个 Redis 实例的资源配置,包括增加内存容量、增加磁盘容量、使用更高配置的 CPU。横向扩展:横向增加当前 Redis 实例的个数。在面向百万、千万级别的用户规模时,横向扩

2023-07-11 01:34:37 443

原创 《Redis 核心技术与实战》课程学习笔记(四)

Redis 持久化机制AOF日志:宕机了,Redis 如何避免数据丢失?一旦服务器宕机,内存中的数据将全部丢失。目前,Redis 的持久化主要有两大机制,即 AOF 日志和 RDB 快照。AOF 日志是如何实现的?我们比较熟悉的是数据库的写前日志(Write Ahead Log, WAL),也就是说,在实际写数据前,先把修改的数据记到日志文件中,以便故障时进行恢复。不过,AOF 日志是写后日志,“写后”的意思是 Redis 是先执行命令,把数据写入内存,然后才记录日志。传统数据库的日志,例

2023-07-06 11:15:10 358

空空如也

空空如也

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

TA关注的人

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