- 博客(25)
- 资源 (1)
- 收藏
- 关注
原创 Mysql InnoDB 覆盖索引与回表
什么是回表查询?InnoDB使用聚集索引,数据根据主索引存储在叶子节点上,辅助索引的data域存储主键。myisam使用非聚集索引,即主索引(B+树)的叶子节点存储数据的地址(需要回表),myisam可以没有主键,数据也不是存储在B+主索引的叶子节点上的。设有表:t(id PK, name KEY, sex, flag);画外音:id是聚集索引,name是普通索引。表中有四条记录...
2020-07-10 10:13:00 106
原创 什么是2PC 3PC TCC?
2PC(两阶段提交)阶段1在阶段1中,协调者发起一个提议,分别问询各参与者发送事务预处理请求(可不可以执行任务)阶段2在阶段2中,协调者根据参与者的反馈,提交或中止事务,如果参与者全部同意则提交,只要有一个参与者不同意就中止。缺点同步阻塞问题。执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。单点故障。由于协调者的重要...
2020-07-07 16:48:00 171
原创 mybatis-plus 代码生成器
所需jar<!--mybatis-plus 相关依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1</version> </dependency> <!--mybatis-plus代码生成器 相
2020-07-03 12:23:06 273
原创 Arrays.sort底层原理
在数组的数量小于47的情况下使用插入排序,在大于或等于47或少于286会进入快速排序(双轴快排)大于286采用归并排序在判断少于286之前还有一个操作 这里主要作用是看他数组具不具备结构:实际逻辑是分组排序,每降序为一个组,像1,9,8,7,6,8。9到6是降序,为一个组,然后把降序的一组排成升序:1,6,7,8,9,8。然后最后的8后面继续往后面找。每遇到这样一个降序组,++count,当count大于MAX_RUN_COUNT(67),被判断为这个数组不具备结构(也就是这数据时而升时而降),然后
2020-07-03 11:02:17 615
原创 SpringCloud 集成 RabbitMQ死信队列
介绍:生产者将消息发送到Exchange,由Exchange将消息路由到一个或多个Queue中(或者丢弃)这里是通过ROUTING_KEY直接绑定到指定的Queuejar包依赖 <!-- rabbitmq依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId&
2020-07-02 15:04:22 437
原创 Collections.sort排序原理
事实上Collections.sort方法底层就是调用的Arrays.sort方法,而Arrays.sort使用了两种排序方法,快速排序和优化的归并排序。快速排序主要是对那些基本类型数据(int,short,long等)排序, 而归并排序用于对Object类型进行排序。使用不同类型的排序算法主要是由于快速排序是不稳定的,而归并排序是稳定的。这里的稳定是指比较相等的数据在排序之后仍然按照排序之前的前后顺序排列。对于基本数据类型,稳定性没有意义,而对于Object类型,稳定性是比较重要的,因为对象相等的判断
2020-07-02 09:53:37 4229
翻译 Mybatis多数据源配置
pom.xml<!-- Spring Boot Mybatis 依赖 --><dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.2.0</version></dependency> <!-
2020-07-01 16:30:50 179
原创 Spring Security Oauth2实现源码
源码地址代码是自己实际使用中整理出来可直接启动运行,各种方式实现都有,每个类里面都有注释方便理解。数据库sqlCREATE TABLE `clientdetails` ( `appId` varchar(128) NOT NULL, `resourceIds` varchar(256) DEFAULT NULL, `appSecret` varchar(256) DEFAULT NULL, `scope` varchar(256) DEFAULT NULL, `grantTypes
2020-06-30 16:08:05 236
转载 Nginx配置SSL证书
本文主要记录Nginx怎么配置SSL证书,前提是Nginx安装成功和SSL证书已经获取。在我们下载的证书文件中有一个Nginx的文件夹,这里面的两个文件都是需要的。我们需要把这个两个文件上传到 linux 服务器中,推荐放到/etc/ssl/目录下然后我们需要去找到nginx的配置文件。ps -ef | grep nginx可以看到 nginx的目录是 /usr/local/nginx那么我们需要找到 nginx.conf文件并修改cd /usr/local/nginx/confvi
2020-06-29 15:23:47 3917
原创 解决Zuul丢失Cookie
解决方法:#yml添加zuul: sensitive-headers: 原因:zuul 进行转发时RibbonRoutingFilter对请求参数和header重新过滤排列可以看到ZuulFilter实现了IZuulFilterRibbonRoutingFilter继承了ZuulFilter在RibbonRoutingFilter的run方法中重新build了请求的Header和Param里面的isIncludedHeader,其中object instance
2020-06-18 15:27:44 351
原创 docker,erlang,rabbitmq,redis,linux安装步骤
docker 安装1: 安装必要的一些系统工具sudo yum install -y yum-utils device-mapper-persistent-data lvm22: 添加软件源信息sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3: 更新并安装 Docker-CEsudo yum makecache fastsudo yum -y i
2020-06-15 15:02:06 282
转载 @Transactional实现事务管理原理
@Transactional注解事务管理的底层实现脉络,就是使用拦截器。它就是TransactionInterceptor。TransactionInterceptor是继承于TransactionAspectSupport的拦截器,拦截器的原理在这里就不细说了。被@Transactional注解的方法会被TransactionInterceptor拦截,其invoke方法被调用,最终会调用父类TransactionAspectSupport的invokeWithinTransaction方法。 pub
2020-06-15 14:57:16 744
原创 线程池实现以及参数详解代码
/** * * 每一个任务执行时间设计为0.2秒 */public class MyTask implements Runnable{ private int id; //由于run方法是重写接口中的方法,因此id这个属性初始化可以利用构造方法完成 public MyTask(int id) { this.id = id; } @Override public void run() { String name = Thread.currentThread(
2020-06-11 10:38:55 205
转载 SpringSecurity + Oauth2.0搭建授权服务中心集中鉴权
采用oauth2.0 + SpringSecurity 搭建一个oauth2.0授权服务中心和一些资源服务器(密码模式测试可用),实现简单的微服务接口安全和权限控制。 Spring-Security存在于各个微服务系统中实现对url的访问控制,oauth2实现对微服务所有的rest接口的权限控制。 这是一个资源服务器和授权中心分离的demo,token存到表中保存。0 软件环境1、jdk1.82、springboot 2.0.7.release3、spring-security 5
2020-06-01 17:20:35 1142
原创 Jenkins+Svn+Docker搭建持续集成环境 自动部署
首先需要java环境,安装java环境后docker pull jenkins/jenkins修改默认插件源地址 vi ~/jenkins/hudson.model.UpdateCenter.xml1 http://mirror.xmission.com/jenkins/updates/update-center.json # 推荐2 http://mirrors.shu.edu.cn/jenkins/updates/current/update-center.json3 https:
2020-06-01 10:47:08 820
转载 Spring Boot自动配置原理
工作原理剖析Spring Boot关于自动配置的源码在spring-boot-autoconfigure-x.x.x.x.jar中:当然,自动配置原理的相关描述,官方文档貌似是没有提及。不过我们不难猜出,Spring Boot的启动类上有一个@SpringBootApplication注解,这个注解是Spring Boot项目必不可少的注解。那么自动配置原理一定和这个注解有着千丝万缕的联系!@EnableAutoConfiguration@SpringBootApplication是一个复合注解或派
2020-05-29 09:43:10 80
原创 TCP/IP 三次握手四次挥手
第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包;第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B
2020-05-27 11:46:55 96
转载 Volatile能否保证线程安全
可见性:可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果。另一个线程马上就能看到。比如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。但是这里需要注意
2020-05-27 11:26:26 765
原创 Msql 数据库索引为什么用B+树
B-树与B+树相同点:都是多路非二叉树B-树与B+树都是平衡树B-树与B+树不同点:B-树每个节点即保存索引也保存数据B+树只有叶子节点保存数据B+树增加了相邻接点的指向指针,可以大大增加区间访问性可使用在范围查询等B-树每个节点索引和数据 在一起,区间查找代价大。原因:平衡树层数少相对磁盘的I/O次数少。平衡树,每个结点到叶子结点的高度都是相同,这也保证了每个查询是稳定的。B-树每个节点即保存数据又保存索引,所以磁盘IO的次数很少,B+树只有叶子节点保存,磁盘IO多,但是区间
2020-05-27 10:21:09 154
原创 先删数据库还是先删缓存
先删缓存再删数据库:在高并发的情况下会导致缓存击穿(缓存没有线程全部访问数据库造成压力过大)。当第一个线程进来删除缓存,第二个线程进来缓存没有查询数据库然后更新缓存,第一个线程更新数据库,造成脏读。先删数据库再删缓存:当一个线程进来更新数据库,另一个线程进来读取缓存,然后第一个线程更新缓存,造成脏读。异常:以上情况都没有考虑到异常情况,比如缓存更新失败数据库更新失败。可以做补偿机制。re...
2020-04-27 11:13:41 1381
原创 MySql InnoDB 的事务隔离级别
MySql InnoDB 的事务隔离级别未提交读(Read uncommitted)已提交读(Read committed)可重复读(Repeatable read)可串行化(Serializable)
2020-04-27 10:16:38 126
原创 binlog. redo log. undo log
binlog恢复使能够最大可能地更新数据库,因为二进制日志包含备份后进行的所有更新。在主复制服务器上记录所有将发送给从服务器的语句。redolog记录的是新数据的备份。在事务提交前,只要将redolog持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是redolog已经持久化。系统可以根据redolog的内容,将所有数据恢复到最新的状态。undolog实现事...
2020-04-26 18:04:43 114
原创 lock锁的condition原理
首先Condition维护了一个AQS单向链表,当调用await()时将当前线程加入到链表中,然后调用signal()会从链表头部拿出一个节点放到ReenTranLock维护的双向链表中,去抢锁,如果抢锁成功就执行,如果调用signalAll就是把所有的Condition链表节点都加入到ReenTranLock维护的双向链表中去抢锁。...
2020-04-26 17:52:30 302 1
原创 mysql Innodb 三种行锁(记录锁、间隙锁与临键锁)
Record Lock:记录锁,单个行记录上的锁。Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。Next-Key Lock:临键锁,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,可以解决幻读的问题。那么什么是幻读呢?事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交,然后待事务A再次进行查询时发现数据与第一次不匹配...
2020-04-26 17:51:10 3678
docker,erlang,rabbitmq,redis安装.txt
2020-06-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人