自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 九.MySQL是怎么保证主备一致和高可用的

binlog可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢,为什么备库执行了binlog就可以跟主库保持一致了呢?我们今天来探究下这个问题。主备的基本原理搭建两个节点A和B。开始时节点B是节点A的备库,备库节点B只读。A上的更新通过binlog同步到B,这样就可以保持节点A和节点B的数据是相同的。当需要切换的时候,就切成状态二,此时客户端读写访问的都是节点B,而节点A是B的备库。主备同步的具体流程是这样的:备库B跟主库A之间维持了一个长连接,主库执行一个事务后,会写binlog,主库写完

2021-10-24 09:56:48 274

原创 十. MySQL并行复制

并行复制的演进MySQL最早的主备复制只有两个线程,IO 线程负责从主库接收 binlog 日志,并保存在本地的 relaylog 中,SQL线程负责解析和重放 relaylog 中的 event。当主库并行写入压力较大时,备库 IO 线程一般不会产生延迟,因为写 relaylog 是顺序写,但是 SQL线程重放的速度经常跟不上主库写入的速度,会造成主备延迟。如果延迟过大,relaylog 一直在备库堆积,还可能把磁盘占满。在官方的5.6版本之前,MySQL只支持单线程复制,因此在主库并发高,TPS高时

2021-10-24 09:56:39 1110

原创 十三.join语句的使用,join语句的优化

Join语句的使用在分析之间,我们先来建两个表CREATE TABLE `t2` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `a` (`a`)) ENGINE=InnoDB;drop procedure idata;delimiter ;;create procedure idata()begin decla

2021-10-24 09:56:29 562

原创 Spring bean生命周期(上)

Spring Bean元信息配置阶段BeanDefinition配置面向资源XML配置Properties资源配置面向注解面向API// Bean定义阅读器,用于简单的属性格式。// 提供Map / Properties和ResourceBundle的bean定义注册方法。通常应用于DefaultListableBeanFactory。PropertiesBeanDefinitionReader.java user.(class) = org.tyella.User //

2021-10-24 09:56:16 102

原创 Spring bean生命周期(中)

实例化阶段类加载(Bean的ClassLoading):BeanDefinition中的Class信息从过去的一个文本信息变成一个实在的CLass对象,这个过程称为Bean的class Loading,接下来我们继续讨论这个类信息如何变为我们的一个Bean的实例,也就是我们通常讲的Bean的实例化阶段。实例化阶段分为3个阶段,实例化前阶段,实例化中阶段,实例化后阶段。Spring Bean实例化前阶段instantiationAwareBeanPostProcessor#postProcessorB

2021-10-24 09:56:08 89

原创 Spring bean生命周期(下)

Spring Bean初始化前阶段Bean的初始化可以分为前阶段,中阶段和后阶段。在初始化前阶段已经,已经完成的有:已完成:Bean实例化(分为实例化前阶段,实例化阶段,实例化后阶段)Bean属性赋值(赋值前阶段,赋值阶段)Bean Aware接口回调(初始化阶段的前置阶段-在initializingBean方法里面)方法回调BeanPostProcessor#postProcessBeforeInitialization示例public Object postProces

2021-10-24 09:56:00 107

原创 Spring AOP源码解析

创建AOP代理上面讲解了通过自定义配置完成了对AnnotationAwareAspectJAutoProxyCreator类型的自动注册,这个类到底做了什么工作来完成AOP的操作呢,首先我们看看AnnotationAwareAspectJAutoProxyCreator的类层次结构。在类的层级中,我们可以看到AnnotationAwareAspectJAutoProxyCreator实现了BeaPostProcessor接口,而实现BeanPostProcessor接口后,当Spring加载这个Bea

2021-10-24 09:55:51 82

原创 git常用操作

工作区 git add 暂存区暂存区 git commit 提交到仓库撤销git addgit reset HEAD #撤销上一次add的全部内容git reset HEAD xxx.java #撤销指定的文件撤销git commitgit reset commit_id # 回退到上一个commit节点,代码在工作区git reset --hard commit_id # 回退到上一个commit节点,并清除所有代码撤销指定提交(git re.

2021-10-24 09:55:42 56

原创 Redis数据结构及底层实现

Redis底层数据结构1. SDSRedis没有使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS),并将SDS用作Redis的默认字符串表示。struct sdshdr { // 记录SDS所保存字符串的长度 int len; // 记录buf数组中未使用字节的数量 int free; // 字节数组,用于保存字符串 char buf[];}SDS的特点:常数复杂度获取字符串长

2021-10-24 09:55:34 84

原创 JDK性能监控工具

JPS查看Java进程jps// 显示传递给JVM的参数jps -v // 显示传递给main方法的参数jps -m// 显示应用程序主类的完整包名或应用程序 JAR 文件的完整路径名。jps -ljstat用于观察Java应用程序运行时相关信息的工具。// 显示有关垃圾收集堆行为的统计信息。-gc// 显示JVM中各分区的容量和使用情况-gccapacity // 显示有关垃圾收集统计信息的摘要,以及上次和当前垃圾收集事件的原因。-gccause// 显示新

2021-10-24 09:55:24 89

原创 八. Redo log和bin log的写入机制

只要redo log和binlog保证持久化到磁盘,就能确保MySQL异常重启后,数据可以恢复。我们接下来来看看MySQL写入binlog和redo log的流程。binlog的写入机制binlog的写入逻辑比较简单:事务执行过程中,先把日志写到binlog cache,这个操作会调用write方法,并没有把数据持久化到磁盘,速度比较快;事务提交的时候,再把binlog cache写到binlog文件中,这步会调用fsync将数据持久化到磁盘,速度比较慢。write和fsync的时机,是由参数sync

2021-10-23 10:37:16 572

原创 七. 幻读是什么,幻读有什么问题

什么是幻读幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。在可重复读隔离级别下,普通的查询是快照读,是不会看到 别的事务插入的数据的。因此,幻读在“当前读”下才会出现。上面session B的修改结果,被session A之后的select语句用“当前读”看到,不能称为“幻读”。幻读仅专指“新插入的行”。我们新建一张表,插入6条数据:CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DE

2021-10-23 10:36:25 19119 5

原创 六. “order by”是怎么工作的

假设需要查询所在城市是“杭州的所有人名字,并且按照姓名排序返回前1000个人的姓名,年龄。表的定义是这样的:CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`), KEY `cit

2021-10-23 10:27:55 100

原创 五. 普通索引和唯一索引

这篇文章我们来对比普通索引和唯一索引在性能上的差别。查询过程假设执行的语句是select name from User where id_card = '123456';,这个查询语句在索引树上的查找的过程,先是通过B+树从树根开始,按层搜索到叶子节点。对于普通索引来说,找到id_card = '123456'的记录后,需要查找下一个记录,直到碰到第一个不满足id_card = '123456'的记录。对于唯一索引来说,找到第一个满足条件id_card = '123456'的记录后,就会直接返回。

2021-10-23 10:26:02 186

原创 四. 全局锁,表锁和行锁

数据库锁设计的初衷是解决并发问题。作为多用户共享的资源,在出现并发访问的时候,数据库需要合理地控制资源的访问规则。根据加锁的范围,MySQL里面的锁大致可以分成全局锁,表级锁和行锁。全局锁全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是Flush tables with read lock。当你需要让整个库处于只读状态时,可以使用这个命令,之后其他线程的数据更新语句,数据定义语句(修改表结构),和更新类事务的提交语句都会被阻塞。全局锁的典型使用场景是,做全库逻辑备份,也就是

2021-10-23 10:24:34 225

原创 三.MySQL索引

数据库的索引事为了提高数据查询效率。索引的常见模型索引比较常见的模型有:哈希表,有序数组和搜索树。哈希表哈希表是一种以k-v存储数据的结构,我们只要输入待查找的key,就可以找到对应的value。哈希表的实现很简单,用哈希函数把key换算成一个地址,然后把value放在这个地址。如果不同的key经过哈希函数计算后得到一个相同的地址,往后拉一个链表即可。哈希表适用于等值查询的场景,比如Memcached和一些NoSQL。哈希表不适用于区间查询的场景,因为哈希表不是有序的,区间查询时要全部扫描一遍,非

2021-10-23 10:22:37 116

原创 二.事务.

事务就是保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的。MySQL是一个多引擎的系统,并不是所有的引擎都支持事务。事务具有ACID属性(Atomicity,Consistency,Isolation,Durability;原子性,一致性,隔离性,持久性)。当数据库上有多个事务同时执行的时候,就可能出现脏读,不可重复读,幻读的问题。为了解决这些问题,就有了隔离级别的概念。事务隔离级别包括读未提交(read uncommited),读提交(read commited

2021-10-23 10:19:18 184

原创 一. MySQL基础架构:一条SQL查询语句是如何执行的

基础架构:一条SQL查询语句是如何执行的MySQL可以分为Server层和存储引擎层两部分。Server层包括连接器,查询缓存,分析器,优化器,执行器等。涵盖了MySQL的大多数核心服务功能,以及所有的内置函数(如日期,时间,数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程,触发器,视图等。存储引擎层负责数据的存储和提取,其架构模式是插件式的,支持InnoDB,MyISAM,Memoory等多个存储引擎。现在最常用的存储 引擎时InnoDB,它从MySQL5.5起开始成为了默认存

2021-10-23 10:15:58 120

转载 An example of how to use getopts in bash

#!/bin/bashusage() { echo "Usage: $0 [-s <45|90>] [-p <string>]" 1>&2; exit 1; }while getopts ":s:p:" o; do case "${o}" in s) s=${OPTARG} ((s == 45 || s == 90)) || usage ;; p)

2021-10-23 10:13:23 52

转载 SSH远程执行任务

SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作自动化掉!下面就对 SSH 的远程操作功能进行一个小小的总结。远程执行命令如果我们要查看一下某台主机的磁盘使用情况,是不是必须要登录到目标主机上才能执行 df 命令呢?当然不是的,我们可以使用 ssh 命令在远程的主机上执行 df 命令,然后直接把结果显示出来。整个过程就像是在本地执行了一条命令一样:$ ssh [email protected]

2021-10-23 10:12:37 315

原创 Linux shell(06)计划任务

计划任务在工作中,很多脚本是要到凌晨才运行,或者需要反复不断运行,这时就需要程序定时调起执行,这种我们就叫计划任务。一次性计划任务 at周期性计划任务计划任务加锁 flock一次性计划任务计划任务:让计算机在指定的时间运行程序dateat 18.31 // 18.31分执行# 计划任务是没有终端的,不能进行标准输出,输出要加重定向指定对应的文件# 执行的命令很有可能没有命令搜索路径,执行计划任务的时候,如果不是内部命令的话,建议加上命令的完整路径;如果是shell脚本的话,记

2021-10-22 13:51:11 313 1

原创 Linux shell(05)函数

自定义函数自定义函数系统脚本自定义函数// 自定义函数function fname() { 命令}// 函数的执行fname// 函数作用范围的变量local 变量名// 函数的参数$1 $2 $3 ... $n#!/bin/bashfunction cdls() { cd /var ls}cdls// 带参数function cdls() { cd $1 ls}cdls /tmp// 只在函数内部生效的变

2021-10-22 13:51:02 44

原创 Linux shell(04) 循环与判断

测试与判断退出与退出状态测试命令test使用if-then语句使用if-then-else语句嵌套if的使用测试命令的工作原因:根据程序是否正常执行,根据程序的退出状态进行判断。退出与退出状态// 退出程序命令exit // 成功返回0,失败返回非0exit 10 // 返回10 给shell,返回值非0表示不正常退出$? // 判断当前shell前一个进程是否正常退出vim 8.sh#!/bin/bashpwdexitbash 8.shppwdexi

2021-10-22 13:50:45 207

原创 Linux shell(03)数组与运算符

数组// 定义数组IPTS=(10.0.0.1 10.0.0.2 10.0.0.3) // 空格隔开// 显示数组的所有元素echo ${IPTS[@]}// 显示数组元素个数echo ${#IPTS[@]}// 显示数组的第一个元素echo ${IPTS[0]}ipts=(1.1.1.1 2.2.2.2 3.3.3.3)echo $iptsecho ${ipts[@]}echo ${#ipts[@]}echo ${ipts[1]}转义与引用特殊字符转义

2021-10-22 13:50:37 68

原创 Linux shell(02)变量

变量变量的定义变量的赋值变量的引用变量的作用范围系统环境变量环境变量配置文件变量的定义变量名的命令规则字母,数字,下划线不能以数字开头变量的赋值shell是不区分类型的,是弱类型的变量。为变量赋值的过程,称为变量替换变量名=变量值(=左右不能出现空格)a=123使用let为变量赋值let a=10+20将命令赋值给变量l=ls将命令执行结果赋值给变量个,使用$()或者``letc = $(ls -l /etc)变量值有空格等特殊字符可以包含

2021-10-22 13:50:28 61

原创 Linux shell(01)认识shell

什么是shellshell是命令解释器,用于解释用户对操作系统的操作(shell会把用户执行的命令传递给内核,内核再把命令执行的结果返回给用户)Shell有很多(通过cat /etc/shells查看)CentOS7 默认使用的shell是bashLinux的启动过程BIOS-MBR-BootLoader(grub)-kernel-systemd-系统初始化-shellshell脚本Unix的哲学:一条命令只做一件事未来组合命令和多次执行,使用脚本文件来保存需要执行的命令赋予该文件执

2021-10-22 13:50:20 53

原创 Linux服务管理

防火墙防火墙分类iptables的表和链iptables的filter表iptables的nat表iptables配置文件firewallld服务防火墙分类软件防火墙和硬件防火墙包过滤防火墙和应用层防火墙CentOS 6 默认的防火墙是iptablesCentOS 7 默认的防火墙是firewalld(底层使用netfilter)iptables的表和链规则表(iptables的功能)filter nat mangle raw(四个表)规则链INPUT

2021-10-22 13:50:02 61

原创 Linux文本操作-awk

AWKAWK和sed的区别:AWK更像是脚本语言AWK用于“比较规范”的文本处理,用于统计数量并输出指定字段使用sed将不规范的文本,处理为“比较规范”的文本AWK脚本的流程控制输入数据前例程 BEGIN{}主输入循环{} (通常情况下只写主输入循环,少数情况下会写begin,end例程)所有文件读取完成例程 END{}AWK的字段引用和分离记录和字段每行称作AWK的记录使用空格,制表符分隔开的单词称为字段可以自己指定分隔的字段字段的引用awk中使用$1 $2 …

2021-10-22 13:49:52 141

原创 Linux文本操作-sed

sed,awkvim 全文本编辑器sed,awk,行编辑器vim,sed,awk的区别:交互式和非交互式(交互式:vim;非交互式:sed,awk)文本操作编辑模式与行操作模式(文本编辑:vim;行编辑:sed,awk)sed一般用于对文本内容做替换sed 's/user1/u1/' /etc/passwdawk一般用于对文本内容进行统计,按需要的格式进行输出cut -d : -f 1 /etc/passwdawk -F:'/wd$/{print $1}' /etc/passwd

2021-10-22 13:49:42 110

原创 Linux文本操作-grep

元字符介绍正则表达式元字符. 匹配除换行符外的任意单个字符* 匹配任意一个跟在它前面的字符[] 匹配方括号中的字符内中的任意一个^ 匹配开头$ 匹配结尾\ 转义后面的特殊字符grep 查找文本中含有关键字的一行// 查找 anaconda-ks.cfg中的passwordgrep password /root/anaconda-ks.cfggrep pass.... /root/anaconda-ks.cfggrep pass....$ /root/anaconda-ks.c

2021-10-22 13:49:28 98

原创 Linux内存与磁盘管理

内存使用率查看freetop磁盘使用率的查看fdiskdfdudu与ls的区别# 查看内存使用率free# 以MB为单位显示free -m# 以GB为单位显示free -g# 查看磁盘fdisk -l# 查看分区,挂载目录,容量等df -h# 查看大小,中间可能有空洞;所以和du的结果可能不一样ls -lh /etc/passwd# 实际占用的空间du -h /etc/passwddu /etc/passwd常见文件系统Linux支持多种文件系统

2021-10-21 09:45:40 66

原创 Linux系统管理

网络管理网络状态查看网络配置路由命令网络故障排除网络服务管理常用网络配置文件网络状态查看 net-tools vs iproute在centos 7 之前用的工具包叫net-tools。net-tools:ifconfigroutenetstat在centos 7 之后主推iproute工具包。iproute2ipss查看网络情况查看网卡物理连接状态mii-tool eth0查看网关route -n使用-n参数不解析主机名网络配置命令

2021-10-21 09:44:46 112

原创 桥接模式,门面模式,组合模式,享元模式

桥接模式桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。public interface DrawAPI { void drawCircle(int radius, int x, int y);}public class RedCircle implements DrawAPI { @Override public void drawCircle(int radius, int x, int y) { //... }}public

2021-10-21 09:41:12 206

原创 适配器模式

适配器模式(Adapter Design Pattern)是用来做适配的,将不兼容的接口转换为可兼容的接口,让原来不兼容的类转换为可兼容的类。适配器模式有“类适配器”和“对象适配器”两种实现。“类适配器”使用继承关系实现,“对象适配器”使用组合关系实现。具体代码如下:// ITarget表示要转化成的接口定义,Adaptee是一组不兼容ITarget接口定义的接口,Adaptor将Adaptee转化成一组符合ITarget接口定义的接口// 类适配器:基于继承public interface IT

2021-10-21 09:40:01 43

原创 观察者模式

定义:在对象之间定义一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会收到通知。被依赖的对象 被观察者 依赖的对象 观察者subject-observer,publisher-subscriber等不同称呼。public interface Subject { void resigterObserver(Observer observer); Observer removeObserver(Observer observer); void

2021-10-21 09:38:58 50

原创 模版模式。

模板模式模板模式:在一个方法中定义一个骨架,并将这些步骤推迟到子类中实现。模版方式可以在子类不改变整体算法结构的情况下,重新定义算法中的某些步骤。算法:广义的业务逻辑public abstract class AbstractClass { public void templateMethod() { //... method1(); //... method2(); } pr

2021-10-21 09:36:49 55

原创 代理模式。

代理模式代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。代理模式的应用场景:代理模式最常用应用场景是,在业务系统中开发一些非功能性需求,比如:监控、统计、鉴权、限流、事务、幂等、日志。我们将这些附加功能与业务功能解耦,放到代理类中统一处理,让程序员只需要关注业务方面的开发。Spring AOP的底层实现就是基于动态代理。代理模式的实现:一般情况下,我们让代理类和原始类实现同样的接口。但是,如果原始类并没有定义接口,并且原始类代码并不是我们开发维护的。在这种情况下,我们可以通过

2021-10-21 09:35:54 55

原创 迭代器模式

迭代器模式用来遍历集合对象。集合可以是数组,链表,树,图,跳表等。迭代器模式将集合对象的遍历操作从集合中拆分出来,放到迭代器中,让两者的职责更加单一。public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove");

2021-10-21 09:31:33 62

原创 职责链模式

职责链模式:多个处理器依次处理同一个请求,一个请求先经过A处理器处理,然后把请求转给B处理器,B处理器处理完后再传递给C处理器。以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责,所以叫做职责链模式。public interface IHandler { boolean handle();}public class HandlerA implements IHandler { @Override public boolean handle() {

2021-10-21 09:27:56 60

原创 建造者模式

三.建造者模式为什么需要建造者模式建造者模式和工厂模式的区别示例1.为什么需要建造者模式如果一个类中有很多属性,都是必填项。如果使用构造函数,参数列表非常长,影响代码的可读性和易用性。在这种情况下,就要使用builder模式如果类的属性之间有一定的依赖关系和约束条件,使用构造函数或set()方式就比较难处理这种情况,需要使用builder模式我们希望创建不可变对象,对象创建好后,就不能再修改对象内部的属性值。要实现这个功能,我们就不能在类中暴露set()方法,就要使用builder模式。

2021-10-21 09:24:54 65

空空如也

空空如也

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

TA关注的人

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