自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL 三大日志篇

1.redo logredo log有两种类型,分别分为物理重做日志和逻辑重做日志,大多数情况下都是物理重做日志,记录的是数据页的物理变化(实际的数据值)。功能保证事务的持久性。用于做崩溃恢复。结构在内存中的redo log buffer,和磁盘中的redo log file。redo log buffer的基本单位log buffer block,512个字节。日志缓冲块的结构如下:1.原理由于在一个事务中,要修改的页可能有多个,所以为了保证事务的原子性,这组被修改的页

2022-06-13 19:56:13 93

原创 学习《Redis设计与实现》Chapter4

复制模式通过SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器,被复制的服务器为主服务器,复制的服务器为从服务器。通过复制模式,能让从服务器保持和主服务器的数据一致。实现redis的复制功能分为同步和命令传播两个操作。同步当客户端向从服务器发送SLAVEOF命令,要求从服务器复制主服务器时,从服务器要先将自己的数据库状态更新至主服务器的数据库状态。这里需要分成两种情况1.初次复制· 从服务器向主服务器发送SYNC命令。· 主服务器收到SYNC命令后执

2022-05-29 16:13:56 102 1

原创 学习《Redis设计与实现》Chapter3

发布与订阅根据频道和模式的数据结构就可以看出,redis只是维护了订阅者和发布者的关系,并没有对消息做持久化操作。频道频道是通过服务器状态的pubsub_channels字典来管理的。字典的键是频道的名称,值是订阅了该频道的客户端链表。所以对于客户端来说,它是否订阅了某个频道本质上就是是否在该频道的客户端链表中。当一个频道没有订阅的客户端时,就会从字典中移除出去。通过subscribe channel [channel...]命令订阅给定的一个或多个频道。通过unsubscribe ch

2022-05-27 17:32:42 94

原创 学习《Redis设计与实现》Chapter2

Redis服务器redis服务器本质是一个事件驱动程序,处理文件事件和时间事件两种事件。从事件处理的角度看,redis服务器的运行流程可以理解为在一个while循环中,等到文件事件产生后先处理已产生的文件事件,然后处理已达到的时间事件,事件的处理都是同步、有序且原子的执行。由于时间事件的处理依赖于文件事件的产生,所以时间事件通常会比设定的到达时间晚一些执行。而且为了尽可能的减少服务器阻塞的时间,降低事件饥饿的可能性,如果文件事件的写操作要写入的字节数大于一个预设值,会先跳出循环将余下的数据留到下次再写;

2022-05-22 01:12:52 375

原创 MySQL innoDB三大特性

1.Insert Buffer/Change BufferinnoDB在1.0.x版本前使用的是insert buffer(只支持插入),之后升级成change buffer(支持增删改)。虽然支持的功能多了,但是本质上做法原理还是一样的。结构Change Buffer虽然叫做buffer,但是它并不是只存在内存中的。在内存中,它占用了Buffer Pool的一定比例的空间;在磁盘上,是系统表空间内的一棵B+树。优化对象只是针对普通二级索引(非聚簇索引,非唯一索引)的数据变更时的IO优化

2022-05-16 17:41:57 324

原创 MySQL Buffer Pool篇

原理对于innoDB引擎来说,页是内存和磁盘交互的最小单位,也就是说,写入和读取都是以页为单位的。如果每次都为了读取或者修改一条数据而以页为单位发生内存和磁盘的交互,这种性能消耗是完全不可取的。那如果把最小单位改成比页小呢?假设找到了一个合适的最小单位来替换页,但在绝大多数时候,要修改的多条数据都是无序的,比如要改张三的年龄和李四的性别,这两条数据大概率不是连续的,也就意味着大量的随机IO,这种执行方法的效率也是极低的。根据计算机的局部性原理,当读取一条数据时,接下来很大概率会读取与它相临的

2022-05-12 22:26:32 261

原创 MySQL表空间篇

Compact行格式数据结构1.变长字段长度列表:用来记录变长字段实际存储数据的长度2.NULL值列表:用来记录允许为null的字段列表,通过0或1来标记某字段是否为null3.记录头信息:5个字节。· 预留位:头两位是两个预留位,保留。· delete mask:1位。标记当前记录是否被删除了。· min rec mask:1位。标记当前记录是否是B+树中非叶子节点的最小记录。· n owned:该记录槽所拥有的记录数量。· heap no:该记录在堆中的位置信息。

2022-05-08 18:08:26 1514

原创 MySQL调优篇

调优金字塔:1.硬件和OS调优:非DBA,只做简述。硬件有CPU、RAID卡,操作系统有IO调度策略、内存、设备轮转模式等。2.MySQL调优:(1)配置优化· 足够大的缓冲池(innodb_buffer_pool_size)将热点数据尽可能多的存放到内存中,读取数据时就会尽可能少的访问磁盘。· 最合适的redo log配置增大redo_log的写入缓冲区大小(innodb_log_file_size)来降低redo log file的循环切换频率,一般是设置为缓

2022-05-04 10:32:02 166

原创 MySQL- explain篇

explain中的列1.id列id列的值是select的序列号,有几个select就有几个id,id大的先执行,id相同则从上往下执行。2.select_type列表示对应行是简单查询还是复杂查询。· simple:简单查询。查询不包含子查询和union。· primary:复杂查询的最外层查询。· subquery:不相关子查询,优化器会采用物化的方式执行。· dependent_subquery:相关子查询。· derived:在from子句中的子查询,把结果放在临时

2022-05-03 15:49:47 580

原创 MySQL索引篇

索引合并:1.intersection(交集索引合并)select * from table where index1_column = 'a' and index2_column='b';这条sql可能的执行方式有三种:· 通过index1_column列查到主键后回表,再通过index2_column='b'的过滤条件筛选· 通过index2_column列查到主键后回表,再通过index1_column='b'的过滤条件筛选· 通过index1_column列和index2_

2022-05-02 17:28:00 989

原创 MySQL基础篇

表结构设计1.范式设计第一范式:字段不可切割第二范式:所有属性都完全依赖于唯一主属性,不然会造成数据冗余,理解为一个实体第三范式:每个属性和主属性都直接相关,不能间接相关,理解为实体不可再拆分2.反范式设计牺牲空间换取时间。通过一定的数据冗余来换取更高的性能和效率。数据类型优化(1)越小越好:占用的磁盘、内存、CPU越小(2)简单就好:比如整型比字符串的操作代价更低(3)尽量使用相同的属性来存相似或相关的值,尤其是关联的列(4)尽量避免使用null具体

2022-05-01 17:50:48 53

原创 学习《Redis设计与实现》Chapter1

简单动态字符串SDSRedis只会使用C字符串作为字面量,大多数情况下都是使用自己构建的一种名为SDS的抽象类型作为默认字符串表示,其结构如下图。struct sdshdr { // 字节数组,用于保存字符串 char buf[]; //记录buf数组中已用字节的数量,等于字符串的长度 int len; //记录buf数组中未使用字节的数量 int free;}buf数组的规则和意义:值得注意的是,SDS...

2022-03-25 20:59:16 436

原创 学习《java并发编程的艺术》Chapter6

ConcurrentHashMap 在《java并发编程的艺术》书中,ConcurrentHashMap是根据JDK1.7来介绍的,但是现在大都在用1.8了。所以对两个版本都稍作笔记。 JDK1.7: ConcurrentHashMap是由Segment数组和HashEntry数组组成的。Segment是ReentranLock的子类,扮演锁的角色;HashEntry用于存储键值对数据。一个ConcurrentHashMap包含一个Segment数组,一个Segment数组包含...

2021-02-18 15:44:46 83

原创 学习《java并发编程的艺术》Chapter5

AbstractQueuedSynchronizer(AQS,抽象队列同步器): 同步队列: 同步器是依赖内部的同步队列(一个FIFO的双向队列)来完成同步状态的管理。在该同步器类的成员变量中,包含了两个节点类型的引用:头节点和尾节点,通过设置各个节点的前后关系形成的双向FIFO队列的数据结构。当线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成为一个节点来将其加入同步队列的尾部,同时会阻塞当前线程,当同步状态释放时,会把首节点的线程唤醒,使其再次尝试获取同步状态...

2021-02-18 09:09:29 99

原创 学习《java并发编程的艺术》Chapter4

线程间的通信机制: 1)volatile和synchronized关键字。保证了所有线程对关键字修饰的共享变量的可见性。 2)等待通知机制。通过wait()/notify()/nodifyAll()方法实现。举个例子,多线程打印十次ABC后退出。public class Test1 { private static volatile int abc = 1; public static void main(String[] args) { Pri...

2021-02-05 19:44:44 68

原创 学习《java并发编程的艺术》Chapter3

volatile内存语义:当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量的值刷新到主内存;当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效,然后线程将从主内存中读取共享变量。volatile内存语义的实现:内存屏障的插入可以禁止编译器的重排序,所以JMM采取保守策略,保证任意处理器平台的任意程序都可以得到正确的volatile语义。策略如下:1)在每个volatile写操作的前后分别加上StoreStore屏障和StoreLoad屏障。StoreSt

2021-02-04 18:16:47 77 2

原创 学习《java并发编程的艺术》Chapter2

Synchronized关键字Synchronized原理: 从JVM规范出发,Synchronized关键字的实现原理是通过控制JVM进入和退出Monitor对象来实现方法和代码块的同步。Java对象头: 以64位系统为例,Java对象头通常是用16个字节存储的,如果该对象是数组的话,那么对象头会增加8个字节用来存储数组长度。如下图Java对象头 长度 内容 说明 8 Byte Mark Word 存储对象的hashCode和锁信息 8 B...

2021-01-27 14:57:33 70

原创 学习《java并发编程的艺术》Chapter1

多线程执行需要考虑到的开销: 1)线程创建开销 2)CPU上下文切换开销引起CPU上下文切换的条件: 1)时间片执行完毕 2)线程在时间片执行完毕前阻塞或结束所以要减少CPU上下文切换的开销,从以上两点考虑,可以有以下做法: 1)无锁并发编程。 2)CAS算法。在juc包下,有很多类是使用了CAS算法来更新数据的。CAS(compare and swap),有兴趣的同学自行查阅。 3)使用最少线程。 4)协程。在单线程里...

2021-01-26 11:21:54 58

空空如也

空空如也

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

TA关注的人

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