04 2020 档案
摘要:Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让服务器去复制另一台服务器,被复制的为master服务器,复制的被成为slave服务器。 旧版本Redis实现复制 同步:将从服务器的数据库状态更新至主服务器的数据库状态。 命令传播:主服务器的数据库状态被修改,导致主从服务
阅读全文
摘要:RDB 的优点 1.RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份: 比如说,你可以在最近的 24 小时内,每小时备份一次 RDB 文件,并且在每个月的每一天,也备份一个 RDB 文件。 这样的话,即使遇上问题,也可以随时
阅读全文
摘要:AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。 AOF持久化保存数据库状态的方法是将服务器执行的SET、SADD、RPUSH三个命令保存到AOF文件中。服务器在启动的时候,可以通过载入和执行APF文件中保存的命令来还原服务器关闭之前的数据库状态。 实现 AOF持久化功能的实
阅读全文
摘要:RDB持久化功能,可以将Redis在内存中的数据库状态保存到磁盘里面,既可以手动执行,也可以根据配置定期执行,该功能可以将某一个时间点上的数据库状态保存带一个RDB文件上。RDB文件是一个经过压缩的二进制文件 创建和载入 两个Redis命令回生成RDB文件,一个是SAVE,一个是BGSAVE SAV
阅读全文
摘要:Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组中每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库,默认redis服务器会创建16个数据库。 数据库键空间 Redis是一个键值对数据库服务器,服务器中
阅读全文
摘要:前面几篇文章,我们一起学习了redis用到的所有主要数据结构,比如简单动态字符串(sds)、双端链表、字典、压缩列表、整数集合等等。 redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五
阅读全文
摘要:整数集合 整数集合(intset)是集合键的底层实现之一,当一个集合只包含 整数值元素,并且这个集合的元素数量不多时,Redis就会使用郑书记和作为集合键的底层实现。 整数集合的实现 整数集合是redis用于保存整数值的集合抽象数据结构,它可以可以保存类型位int16_t、int32_t、int64
阅读全文
摘要:字典,又称为符号表(symbol table)、关联数组(associative array)或映射(map),是一种用于保存键值对的抽象数据结构。 字典经常作为一种数据结构内置在很多高级编程语言里面,但redis所使用的C语言并没有内置这种数据结构,因此Redis构建了自己的字典实现。 字典在re
阅读全文
摘要:跳跃表(skipList)简介 跳跃表(skipList)是一种有序数据结构,他通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。 跳跃表支持评价O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。 在大部分情况下,跳跃表的效率可以和平衡树相媲美,
阅读全文
摘要:链表简介 链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地跳转链表的长度。 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用C语言并没有内置这种数据结构,所以Redis构建了自己的链表实现。 链表在Redis中的应用非常多,比如列表键的底
阅读全文
摘要:redis的底层数据结构有以下7种,包括简单动态字符串(SDS),链表、字典、跳跃表、整数集合、压缩列表、对象。今天我们一起看下简单动态字符串(simple dynamic string),后面的文章以SDS简称。 SDS简介 Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符串数组,
阅读全文
摘要:持续更新中,MySQL InnoDB存储引擎事务相关内容
阅读全文
摘要:持续更新ing 关于InnoDB存储引擎锁相关的内容整理
阅读全文
摘要:B+树索引的应用 本文主要介绍B+树索引的相关使用内容:联合索引、覆盖索引、MySQL优化器、索引提示、MRR优化、ICP优化等内容。 联合索引 联合索引是值表中多个列进行索引,其创建方式和单列索引创建方式相同。 联合索引也是一颗B+树,不同的是联合索引的键值的数量不是1,而是大于等于2。 图中可以
阅读全文
摘要:B+树索引 B+树索引的本质就是B+树在数据库中的实现。但是B+树索引在数据库中有一个特点就是高扇出性,因此在数据库中,B+树的层高一般都在2~4层,意味着查询某一个键值的行记录最多需要2~4次IO。B+树索引分为聚集索引和辅助索引。 聚集索引 聚集索引就是根据数据表的主键构造一颗B+树,同时叶子节
阅读全文
摘要:数据结构和算法 二分查找法 二分查找法也称为折半查找法。其基本思想是:将记录按照有序排列,在查找过程中采用跳跃式方式查找,即先以有序数列的中点进行大小对比,如果小于中心点元素,那么数据在中心点左侧,每次查询数据都将区间缩小一半,知道查询到对应数据。 二叉查找树和平衡二叉树 二叉树是一个经典的数据结构
阅读全文
摘要:表的分区类型 RANGE分区 CREATE table t ( id int )ENGINE=INNODB PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (10), PARTITION p1 VALUES LESS THAN (20),
阅读全文
摘要:继续上一篇我们继续学习InnoDB的表的相关知识,本章主要内容:InnoDB表约束,视图,分区表。 约束 首先我们搞清楚约束和索引的区别,用户创建了一个唯一索引,意味着用户创建了唯一约束。但是约束和索引的概念是不同的,约束更多是逻辑上的概念,用来保证数据的完整性,而索引是一个数据结构,既有逻辑上的概
阅读全文
摘要:InnoDB存储引擎中,表都是根据主键进行顺序存放的,这种存放方式的表叫做索引组织表。 InnoDB逻辑存储结构 InnoDB从逻辑结构存储角度,从大的维度到小的维度依次为:表空间、段(segment)、区(extent)、页(page)。 表空间 InnoDB最顶层的逻辑结构,所有数据都存放在表空
阅读全文
摘要:InnoDB的关键特性: 插入缓冲(insert buffer) 两次写(double write) 自适应哈希索引(Adaptive Hash Index) 异步IO(AIO) 刷新临接页(Flush Neighbor Page) 插入缓冲 Insert Buffer InnoDB存储引擎中,主键
阅读全文
摘要:CheckPoint技术 数据库每次更新数据的时候都要将脏页刷新会磁盘,同时在事务提交中要先写重做日志,再修改页;在以上过程中发生宕机的,数据如何恢复,脏页刷新到哪里,为了解决这些问题,提出了checkPoint技术。 当数据库宕机的时候,数据库不需要重做左右日志,因为CheckPoint之前的页都
阅读全文
摘要:InnoDB体系架构 这些内存块负责如下工作: 维护所有进程/线程需要访问的多个内存数据结构 缓存磁盘上的数据,方便快速读取,同时在对磁盘文件的数据修改之前在这里缓存。 重做日志缓冲(redo log) 后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外将修改的数
阅读全文
摘要:定义数据库以及实例 数据库:物理操作系统文件或其他形式文件类型的合集。在NDB引擎时候,数据库文件可能不是操作系统上的文件,而是存放在内存之中的文件,但是定义是不变的。 实例:Mysql数据库由一个后台线程以及一个共享内存区组成。共享内存可以被运行的后台线程锁共享。数据库实例才是真正用于操作数据库文
阅读全文
摘要:I/O是机器获取和交换信息的主要渠道,而流是完成I/O操作的主要方式。 流分为输入流(InputStream)和输出流(OutputStream)。 在Java的I/O操作类的包下,InputStream,OutputStream以及Reader和Writer类是I/O包中的4个基本类,分别用来处理
阅读全文
摘要:拆包和组包 TCP协议能够将要传输的数据拆成若干个数据包,并在保证数据包的传输顺序的前提下发送到远程主机,并组装回原来的样子。 例子如下: 当包1.0.0很大,会发现2.0.0数据包发送被延迟了,如果数据包1.0.0发送失败,会导致整个请求发送失败。 为了避免如上情况发生,我们将1.0.0包拆成更小
阅读全文
摘要:网络协议 OSI七层网络模型 TCP/IP四层模型 对应网络协议 应用层(Application) 应用层 HTTP、TFTP、FTP、NFS、WAIS 表示层(Presentation) Telnet、SNMP、Gopher 会话层(Session) SMTP、DNS 传输层(Transport)
阅读全文
摘要:常用的数据结构 数组 采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为 O(1),但在数组中间以及头部插入数据时,需要复制移动后面的元素。 链表 一种在物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表由一系列结点(链表中每一个元素)
阅读全文
摘要:List ArrayList和LinkedList是我们常用的集合数据结构。他们的类结构以及依赖关系如下图。 ArrayList、Vector、LinkedList 集合类继承了 AbstractList 抽象类,而 AbstractList 实现了 List 接口,同时也继承了 AbstractC
阅读全文
摘要:多线程概念 进程与线程 进程是操作系统进行资源分配的最小单位,CPU从一个进程切换到另一个进程叫做进程上下文切换。 线程是CPU调度的最小单位,是进程的一部分,由进程创建,一个进程拥有1~N个线程。线程又分为用户线程和守护线程,两者的区别是,后者会随着主线程结束而结束。 Thread线程类 继承th
阅读全文
摘要:JAVA的锁优化 锁优化包含:自适应性自旋、锁消除、锁膨胀、轻量级锁、偏向锁。以下为锁的升级过程: 自旋锁与自适应自旋 JDK1.6之前自旋默认是关闭的,之后是默认开启的。自旋等待避免了线程状态转换带来的性能开销,但是需要占用处理器的时间,如果占用时间很短,效果很好,如果占用时间很长,会白白消耗处理
阅读全文
摘要:线程安全 Java语言中,不可变的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要在进行任何线程安全的保障措施。 Java语言中,如果多线程共享的数据是一个基本数据类型,那么只要在定义时使用Final关键字修饰它就可以保证它是不可变的。如果共享的数据是一个对象,由于Java语言目
阅读全文
摘要:线程的实现方式 线程主要有三种实现方式:使用内核线程实现(1:1实现),使用用户线程实现(1:N实现),使用用户线程加轻量级进程混合实现(N:M实现) Java线程实现 JDK1.3之后,采用内核线程实现的方式实现JAVA线程。 java线程调度模式 线程调度主要有两种模式:一种是协同式线程调度,另
阅读全文
摘要:硬件的效率和一致性 Java内存模型和硬件的模型类似。我们先看下硬件的模型。首先强调,计算机处理器的处理运算能力是远远高于存储设备的运算能力的,二者相差几个数量级的运算效率。所以现代计算机引入了一层或者多层读写速度尽可能接近处理器速度的高速缓存来作为内存和处理之间的缓冲。 这样做解决了速度与效率问题
阅读全文
摘要:判断对象是否“已死” 引用计数法 在对象中添加一个引用计数器,每当一个地方引用它时,计数器值+1,引用失效的时候,计数器值-1;当计数器值为0的时候说明对象“已死”。 这样做的好处就是简单快捷,且效率也很高,但是无法解决掉循环互相引用的问题。 可达性分析算法 通过一系列被成为“GC Roots”的根
阅读全文
摘要:运行时数据区域 包含:程序计数器,java虚拟机栈,本地方法栈,java堆,方法区,运行时常量池。具体相关结构如下图。 区域 是否公用 相关概念 其他描述 程序计数器 线程私有 当前线程执行的字节码行号指示器 如果当前线程执行的java方法,那么计数器 java虚拟机栈 线程私有 java方法执行的
阅读全文

浙公网安备 33010602011771号