- 博客(50)
- 收藏
- 关注
原创 记录一次单表百万慢SQL优化
这是一个电商项目由于双十一来临,项目订单数据量极具上升。一下子就上升到百万级别的数据了,业务就反映后台订单查询加载很慢。然后我就去慢日志文件了查看果然发现这条SQL执行时间已经上升到了5秒多,我记得当时才几十毫秒。于是我就开始把这条SQL复制出来,开始研究怎么优化。我一般优化的思路(1、检查SQL语法是否有问题(比如用了子查询,或者说大表连小表) 2、是否建立了索引 3、是否索引失效导致全表扫描,4、检查mysql服务磁器盘cpu、5、数据量太大是否需要分库分表)首先看SQL语句
2020-11-06 14:53:52 1314
原创 我对未来的思考
有时在忙碌的开发过程之后,我们需要停下脚步去思考自己写的代码是否具有可读性?是否还可以再健壮一些?同时也要去总结业务,回过头来看看自己在业务的需求的基础上去设计的组件代码是否是合理的?是否还可以更好一些?从某个详细的功能点考虑,再到某个模块的实现的考虑,再到整个项目架构的运行设计。也就是从点到线再到面。我想这样的四个问号会一直伴随着我,因为我知道那是成长的必经之路。因为我也有梦想,成为架构师的梦想。...
2020-11-06 15:08:49 283
原创 MVCC是什么?
MVCC,Multi-Version Concurrency Control,多版本并发控制数据库有四种隔离级别,通过MVCC在每种查询下的情况也是不一样的。在每次insert 、update 、delete都会生成一个事物id,事物id 是递增的。聚簇索引记录中都包含两个必要字段 trx_id 、roll_pointer ,每次修改都会生成undo日志(insert没有,因为没历史)。这里有几个主要就是概念就是版本链、readview。版本链:对于使用`InnoDB`存储引擎的..
2020-10-15 13:38:31 295
原创 同步机制与内存屏障
获取屏障(LoadLoad、LoadStore的组合):确保屏障之前的读操作优先于屏障之后的任何读、写操作被提交。释放屏障(LoadStore、StoreStore的组合):确保屏障之前的读、写操作优先于屏障之后的任何写操作被提交。重点:volatile对可见性的保障是通过写线程和读线程配对使用存储屏障和加载屏障实现的synchronized的实现方式与volatile的实现类似。虚拟机在monitorenter指令之后临界区之前插入获取屏障,在monitorexit字节码指令之前临
2020-10-15 13:36:43 312
转载 拜托!面试不要再问我Spring Cloud的底层原理。
目录一、业务场景介绍二、Spring Cloud核心组件:Eureka三、Spring Cloud核心组件:Feign四、Spring Cloud核心组件:Ribbon五、Spring Cloud核心组件:Hystrix六、Spring Cloud核心组件:Zuul七、总结概述毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓。因
2020-08-01 10:10:09 260
原创 并发编程之创建线程的几种方式
创建线程的四种方式继承 Thread 类; 实现 Runnable 接口; 实现 Callable 接口; 使用 Executors 工具类创建线程池1、继承 Thread 类定义一个Thread类的子类,重写run方法,将相关逻辑实现,run()方法就是线程要执行的业务逻辑方法 创建自定义的线程子类对象 调用子类实例的star()方法来启动线程2、实现 Runnable 接口 1、实现Runnable接口,并重写run()方法 2、创建类的实例作为target创...
2020-07-09 16:20:25 245
原创 ConcurrentHashMap的实现原理是什么?
JDK1.7首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。在JDK1.7中,ConcurrentHashMap采用Segment + HashEntry的方式进行实现,结构如下:一个 ConcurrentHashMap 里包含一个 Segment 数组。Segment 的结构和HashMap类似,是一种数组和链表结构,一个 Segment 包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的
2020-07-09 16:01:48 485
原创 HashMap之put原理分析。
JDK1.7 VS JDK1.8 比较JDK1.8主要解决或优化了一下问题:resize 扩容优化 引入了红黑树,目的是避免单条链表过长而影响查询效率。 解决了多线程死循环问题,但仍是非线程安全的,多线程时可能会造成数据丢失问题。首先看一下源码:底层是调用一个putVal的方法: public V put(K key, V value) { return putVal(hash(key), key, value, false, true); }再看一下
2020-07-08 17:17:51 953
原创 HashMap之get原理分析。
1、首先看源码public V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value; }我们可以看到的是HashMap底层是调用一个getNode的方法。用的三目运算符。如果返回的值等于null,就直接返回null,否则就返回value值。接下来我们看getNode方法。以下源码:final No.
2020-07-07 17:38:09 2251
原创 面试日记2020-06-10
北京人股科技有限公司1、JDK1.8的新特性。2、Map和set的区别。3、HsahMap的底层原理。4、简单工厂和抽象工厂的区别。5、Mysql索引的实现。6、Redis的持久化机制。7、创建线程池有哪几种方式。8、线程的几个状态。...
2020-06-10 12:29:25 252
原创 C#对接微信JSAPI支付和支付宝支付
最近维护一个C#开发的H5老系统,是由上届同事留下的系统,我也不知道为啥要用C#开发,Java多香。代码给我后花了一天时间熟悉了一下这套系统的架构以及下订单的逻辑和支付。废话不多说,本文只讲支付相关的内容,不涉及业务,以及其他不相关的内容。我就直接贴代码了...
2020-05-21 16:44:37 1821
原创 Java之垃圾收集GC详解(2)
垃圾收集算法由于垃圾收集算法的实现涉及大量的程序细节,而且每个平台的虚拟机操作内存的方法又各不相同,因此博客中不过多的讨论算法的实现,只是介绍几种算法的思想以及发展。1、分代收集算法分代收集算法将heap区域划分为新生代和老年代,新生代的空间比老年代的空间要小。新生代又分为了Eden和两个survivor空间,它们的比例为8:1:1。对象被创建时,内存的分配是在新生代的Eden区发生的...
2020-02-21 16:02:09 154
原创 Java之垃圾收集GC详解(1)
Java的内存分配与回收全部由JVM垃圾回收进程自动完成也就是GC。与C语言不同,Java开发者不需要自己编写代码实现垃圾回收。这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序。了解Java 垃圾回收(GC)的基础:垃圾回收简介 那些内存需要回收? 什么时候回收 如何回收?Java 垃圾回收是一项自动化的过程,用来管理程序所使用的运行时内存。通过这一自动...
2020-02-21 15:46:31 114
原创 Java的内存区域详解。
1、运行时数据区Java虚拟机在执行java程序的过程中将它所管理的内存划分为以下几个运行时数据区域:1、程序计数器(Program Counter Register)2、虚拟机栈(VM Stack)3、本地方法栈(Native Method Stack)4、堆(Heap)5、方法区(Method Area)线程私有区域(程序计数器、虚拟机栈、本地方法栈),线程共享区域...
2020-02-16 17:36:53 808
原创 Java并发编程基础(1)—线程
1、线程简介1.1 什么是线程?1)、现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process)2)、在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高...
2020-02-16 17:02:03 255
原创 synchronized的实现原理与应用
1、synchronized1.1、synchronized的实现synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性1.2、synchronized实现同步的基础:1、对于普通同步方法,锁是当前实例对象。 2、对于静态同步方法,锁是当前类的Class对象。 3、对于同步方法块,锁是Sy...
2020-02-14 16:58:23 429
原创 Java死锁详解
1、死锁锁是个非常有用的工具,运用场景非常多,因为它使用起来非常简单,而且易于理解。但同时它也会带来一些困扰,那就是可能会引起死锁,一旦产生死锁,就会造成系统功能不可用。如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的。让我们先来看一段代码,这段代码会引起死锁,使线程t1和线程t2互相等待对方释放锁。public class De...
2020-02-14 16:10:02 1565
原创 Java内存模型详解
1、什么是Java内存模型?Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。Java内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的底层细节,此处的变量不包括局部变量和方...
2020-02-13 15:45:57 257
原创 JVM类加载机制详解
一个类从被加载到虚拟机内存中开始到卸载内存为止,它的整个生命周期会经历加载,验证,准备,解析,初始化,使用,卸载七个阶段,其中验证,准备,解析统称为连接。1、类的生命周期2、类的加载过程2.1、加载加载阶段是整个类加载过程中的一个阶段,在加载阶段,Java虚拟机需要完成以下3件事情。1)通过一个类的全限定名来获取定义此类的二进制流。2)将这个字节流所代表的静态存储结构转...
2020-02-12 16:38:52 440
原创 MySQL中的事务和视图
一、事务1.什么是事务事务是一组由DML语句组成,这组语句要么全部成功,要么全部失败,是一个整体。2.为什么需要事务3.事务的基本操作开始一个事务 start transaction;创建一个保存点 savepoint 保存点名;回到保存点 rollback to 保存点名;--创建一张学生数学成绩表mysql> create table score(id int ...
2020-02-11 14:33:08 358
原创 MySQL中的索引
1.什么是索引用来提高数据库查询速度的东西。比如图书馆的检索系统。类似于一种数据结构2.索引的优缺点优点:提高数据库的性能,查询速度提高(查询海量数据时,没有索引的话查询结果会等很久才显示)缺点:查询速度的提高是以插入、更新、删除的速度为代价的。3.索引的常见种类主键索引(primary key)唯一索引(unique key)普通索引(index)全文索引(fullte...
2020-02-11 14:32:14 132
原创 数据库中的内置函数
1.日期函数功能 函数名称显示当前日期 current_date()显示当前时间 current_time()显示当前时间戳 current_timestamp()返回datetime参数的日期部分 date(datetime)在date中添加日期或时间 date_add(date, interval 所添加的日期和时间)在date 中减去日期或...
2020-02-11 14:31:18 542
原创 MySQL6_表的增删改查CURD
1.CREATE,数据的插入创建一张学生表mysql> create table student( -> id int primary key comment '学生id', -> name varchar(32) comment '学生姓名', -> age int comment'学生年龄', -> ...
2020-02-11 14:30:14 160
原创 MySQL5_数据库中表的约束
1.NULL / NOT NULLNULL(表示默认的),数据库默认字段基本都是字段为空。NOT NULL(表示不为空)--NULL和任意数据进行运算操作,结果为NULL2.default(默认值)比如创建女生班级学生表时所有的学生性别都是女,就可以在创建表时给性别列附上默认值'女';在插入数据时,不用给性别赋值,就使用默认值。mysql> create table ...
2020-02-11 14:29:03 176
原创 MySQL4_数据库中表的操作
1.创建表create table 表名( field1 datatype, field2 datatype, field3 datatype)字符集 校验规则 engine 引擎;2.删除表(drop)drop table 表名; --表删除后无法撤销!!!慎重3.修改表(alter)0.添加列alter table 表名 add 增加列名 数据类型 a...
2020-02-11 14:28:10 124
原创 MySQL3_数据库的操作语句
1.创建数据库create database 数据库名;(数据库系统默认使用utf-8字符集--可以使用中文)0.查看系统所支持的字符集show charset;1.查看系统支持的字符集校验规则 show collation;2.查看系统默认字符集以及字符校验规则show variable like 'cha...
2020-02-11 14:27:31 256
原创 MySQL2_MySQL中的数据类型
MySQL中的数据类型可以分为三类:1.数值类型类型(大写)大小范围(有符号) 范围(无符号)用途tinyint1字节(-128,127)(0,255)小整数型smallint2字节(-32768,32767)(0,65535)大整数型mediumint3字节(-8388608,8388607)(0,1677721...
2020-02-11 14:26:48 147
原创 MySQL1_数据库的了解
1.什么是数据库数据库是按照数据结构来组织、存储和管理数据的仓库。2.什么是关系型数据库管理系统(RDBMS)关系型数据库是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。关联数据库管理系统将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。3.关系型数据库管理系统的特点(RDBMS...
2020-02-11 14:25:41 174
转载 Spring AOP 源码分析 看这一篇就够了
Spring AOP 源码解析创建时间:2018-07-24 00:00:00[TOC]之前写过 IOC 的源码分析,那篇文章真的有点长,看完需要点耐心。很多读者希望能写一写 Spring AOP 的源码分析文章,这样读者看完 IOC + AOP 也就对 Spring 会有比较深的理解了。今天终于成文了,可能很多读者早就不再等待了,不过主要为了后来者吧。本文不会像 IOC ...
2019-12-10 10:57:17 158
转载 Spring IOC 源码分析看这一篇就够了
Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器。既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文并不能让你成为 Spring 专家,不过一定有助于大家理解 Spring 的很多概念,帮助大家排查应用中和 Spring 相关的一些问题。本文采用的源码版本是 4.3.11.RELEASE,算是 ...
2019-12-10 10:50:20 188
转载 Kafka入门看这一篇就够了
一、Kafka 简介Kafka 创建背景Kafka是一个消息系统,原本开发自 LinkedIn,用作 LinkedIn 的活动流(Activity Stream)和运营数据处理管道(Pipeline)的基础。现在它已被多家不同类型的公司作为多种类型的数据管道和消息系统使用。活动流数据是几乎所有站点在对其网站使用情况做报表时都要用到的数据中最常规的部分。活动数据包括页面访问量(Pag...
2019-12-09 14:23:06 362
原创 Redis学习总结
Redis 简介redis官网:http://redis.io/1、什么是redis?简单来说 redis 就是一个数据库 全名:Redis:REmote DIctionary Server(远程字典服务器),不过与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis 提供...
2019-12-09 11:30:00 323
原创 算法 查找最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。示例1:输入: ["flower","flow","flight"]输出: "fl"示例2:输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。说明:所有输入只包含小写字母a-z。 public String longestCo...
2019-12-06 18:23:18 249
原创 算法 求最长有效括号
给定一个只包含 '('和 ')'的字符串,找出最长的包含有效括号的子串的长度。示例1:输入: "(()"输出: 2解释: 最长有效括号子串为 "()"示例 2:输入: ")()())"输出: 4解释: 最长有效括号子串为 "()()" public int longestValidParentheses(String s) { int max=0;...
2019-12-06 18:13:47 193
原创 算法判断一个数是否是回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。...
2019-12-06 18:12:00 903
原创 史上最全Nginx学习总结
Nginx之前做项目都是用Nginx做反向代理来发布项目,由于时间问题一直没有好好总结一下,今天就来总结一下Nginx的各种用处!1、什么是nginx?nginx可以做些什么?Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数,中国大陆使用nginx网站用户有:百度、京东、新浪、网易...
2019-12-05 17:46:13 923
原创 Java技术栈最全电子书集合
地址:https://pan.baidu.com/s/1QuG_00_AJbHsnQU-dLMBUQ提取码 :b7l9
2019-12-02 13:47:01 1219 2
转载 HashMap的底层原理及源码分析
1. HashMap概述:HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。2. HashMap的数据结构:在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,H...
2019-11-20 14:35:30 206
转载 ArrayList的底层原理及源码分析
一、ArrayList概述:ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。 ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包...
2019-11-20 14:32:16 344
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人