MySQL高级篇-18-主从复制
主从复制概述提升数据库并发能力实际工作中常将Redis作为缓存与MysSQL 配合来使用,有请求时首先会从缓存中进行查找,如果存在就直接取出。如果不存在再访问数据库,这样提升读取效率,减少后端数据库访问压力,Redis的缓存架构是高并发架构中非常重要的一环。
一般应用对数据库而言都是读多写少,对数据库读取数据的压力比较大。采用数据库集群的方案,做主从架构 、进行读写分离,同样可以提升数据库的并发处理能力,但并不是所有的应用都需要对数据库进行主从架构设置,毕竟设置架构本身是有成本的
如果目的在于提升数据库高并发访问效率,首先考虑如何优化SQL和索引,其次才是采用缓存的策略,比如使用 Redis将热点数据保存在内存数据库中,从而提升读取的效 率;最后才是对数据库采用主从架构,进行读写分离。
主从复制作用
读写分离
可以通过主从复制的方式来同步数据,然后通过读写分离提高数据库并发处理能力
写库,Master主库:负责写入数据
读库,Slave从库:负责读取数据
当主库进行更新时会自动将数据复制到从库中,而在客户端读取数据时会从从库中进行读取
面对读多写少的需求,采用读写分 ...
MySQL高级篇-17-其他数据库日志
MySQL支持的日志日志类型MySQL有不同类型的日志文件,用来存储不同类型的日志,分为二进制日志、 错误日志 、通用查询日志和慢查询日志。MySQL 8.0 又新增两种支持的日志:中继日志和数据定义语句日志,使 用这些日志文件,可以查看MySQL内部发生的事情。
日志类型
说明
慢查询日志
记录所有执行时间超过long_query_time的所有查询,方便对查询进行优化
通用查询日志
记录所有连接的起始时间和终止时间,以及连接发送给数据库服务器的所有指令, 对复原操作的实际场景、发现问题,甚至是对数据库操作的审计都有很大的帮助。
错误日志
记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便我们了解服务器的 状态,从而对服务器进行维护。
二进制日志
记录所有更改数据的语句,可以用于主从服务器之间的数据同步,以及服务器遇到故 障时数据的无损失恢复
中继日志
用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的一个中间文件。 从服务器通过读取中继日志的内容,来同步主服务器上的操作。
数据定义语句日志
记录数据定义语句执行的元 ...
MySQL高级篇-16-多版本并发控制
MVCCMVCC (Multiversion Concurrency Control,多版本并发控制),通过数据行的多个版本管理来实现数据库的并发控制 ,保证在InnoDB的事务隔离级别下执行一致性读操作。为查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,在做查询时就不用等待另一个事务释放锁。
快照读与当前读 MVCC在MySQL InnoDB中的实现主要是为提高数据库并发性能,用更好的方式去处理读-写冲突,即使有读写冲突时,也能做到不加锁、非阻塞并发读 ,这里的读指的是快照读 , 而非当前读 。当前读实际上是一种加锁的操作,是悲观锁的实现,而MVCC本质是采用乐观锁思想的一种方式。
快照读快照读称一致性读,读取的是快照数据。不加锁的简单的 SELECT 都属于快照读,即不加锁的非阻塞读
1SELECT * FROM player WHERE ...
基于提高并发性能采用快照读,快照读的实现基于MVCC。在很多情况下避免加锁操作、降低开销。 既然是基于多版本,那么快照读可能读到的并不一定是数据的最新版本,有可能是之前的历史版本。
快照读的前提是隔离级别不是串 ...
JVM 字节码与类的加载篇-2-字节码指令集与解析
概述
Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令
Java 虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由于Java虚拟机采用面向操作数栈而不是寄存器的结构,所以大多数的指令都不包含操作数,只有一个操作码。
由于限制Java虚拟机操作码的长度为一个字节(0~255),指令集的操作码总数不可能超过256条。
执行模型如果不考虑异常处理的话,那么Java虚拟机的解释器可以使用下面这个伪代码当做最基本的执行模型来理解:
字节码与数据类型Java虚拟机的指令集中大多数的指令都包含其操作所对应的数据类型信息。例如, iload指令用于从局部变量表中加载int型的数据到操作数栈中,而fload指令加载的则是float类型的数据。
字符
说明
i
对int类型的数据操作
l
对long类型的数据操作
s
对short类型的数据操作
b
对byte类型的数据操作
c
对char类型的数据操作
f
对float类型的数 ...
MySQL高级篇-15-锁
锁:
事务的隔离性由锁实现
概述锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题,当多个线程并发访问某数据时,尤其是针对一些敏感的数据(比如订单、全额等),就需要保证这个数据在任何时刻最多只有一个线程在访问,保证数据的完整性和一致性
为保证数据的一致性,需要对并发操作进行控制,因此出现锁。同时锁机制为实现MySQL的各个隔离级别提供保证。锁冲突是影响数据库并发访问性能的一个重要因素。
MySQL并发事务访问相同记录读-读情况读-读情况,即并发事务相继读取相同的记录。读取操作本身不会对记录有任何影响,并不会引起问题,因此允许这种情况的发生。
写-写情况写-写情况,即并发事务相继对相同的记录做出改动。
这种情况下会发生脏写问题,任何一种隔离级别都不允许该问题发生,在多个未提交事务 相继对一条记录做改动时,需要让它们 “排队执行” ,这个过程其实是通过锁来实现的。锁其实是一个内存中的结构,在事务执行前本来是没有锁的,即一开始是没有锁结构和记录进行关联
当一个事务想对这条记录做改动时,首先会看看内存中有没有与这条记录关联的锁结构,当没有时会在 ...
MySQL高级篇-14-MySQL事务日志
ACID 特性实现
事务的隔离性由锁机制实现
事务的原子性、一致性和持久性由事务的redo日志和undo日志来保证
REDO LOG 称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性
UNDO LOG 称为回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性、一致性
REDO和UNDO都可以视为是一种恢复操作:
redo log:存储引擎层(innodb)生成的日志,记录的是物理级别上的页修改操作,比如页号xx、偏移量yy写入了’zzz’数据,保证数据的可靠性
undo log:存储引擎层(innodb)生成的日志,记录的是逻辑操作日志,比如对某一行数据进行了INSERT语句操作,那么undo log就记录一条与之相反的DELETE操作。主要用于事务回滚(undo log 记录的是每个修改操作的逆操作)和一致性非锁定读(undo log回滚行记录到某种特定的版本—-MVCC,即多版本并发控制)
REDO 日志InnoDB存储引擎是以页为单位来管理存储空间,在真正访问页面之前,需要把在磁盘上的页缓存到内存中的Buffer Pool后才可 ...











