自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 mybatis-plus踩坑之批量插入单元测试

背景       mybatis-plus作为mybatis的增强工具,在使用过程中简化开发,大大得提高了工作效率。mybatis-plus提供了一套通用的mapper和service操作,对于单表操作很方便,但是在写单元测试的时候还是存在有很多不同于mybatis的地方。本文介绍本人在开发过程当中遇到的一些坑和自己的理解。       Mock是在测试过程中,对于一些不容易构造的对象

2021-12-16 11:03:35 5562 3

原创 Java静态代理与动态代理

代理模式主要是为对象提供一种代理以控制对这个对象的访问,主要解决一些直接访问对象时带来的问题,比如消息的预处理、消息过滤、消息后置处理等。代理类本身不提供具体服务,而是通过调用被代理类中的方法来提供服务静态代理与动态代理的区别:静态代理:由程序员编写源代码,对其进行编译,在程序运行前,代理类的.class文件就已经存在了动态代理:在程序运行时,运用反射机制动态创建而成,无需程序员手工编写它的源代码

2021-07-13 14:45:44 185

原创 Java基于redis实现红包功能

想到之前面试遇到的一个关于Redis解决方案的问题,趁今天有时间来进行一番实践,问题是这样的:Redis的五种数据结构中,使用什么样的数据结构来实现发红包、抢红包以及红包记录?首先回顾一下redis的五种数据结构以及底层实现原理:String:最基本的数据类型,底层主要是int和SDS实现Hash:String元素组成的字典,底层使用ziplist和hashtable,适合用于存储对象List:列表,底层使用链表(大数据量)/压缩列表(小数据量)实现,按照String元素插入顺序排序Set:S

2021-06-24 16:17:44 477

原创 MySql索引建立原则及失效条件

MySql索引建立原则选择唯一性索引唯一性索引的值是唯一的,可以更快的通过该索引来确定某条数据。例如:学生表中学号是唯一的,为该字段建立索引可以很快的确定某个学生的信息;如果使用姓名的话可能存在同名的情况,从而降低查询速度。为经常需要排序、分组和联合操作的字段建立索引经常需要order by、group by、distinct、union等操作的字段,排序会浪费很多时间,如果为其建立索引可以有效避免排序操作为常作为查询条件的字段建立索引如果某个字段经常用来作为查询条件,那么该字段的查

2021-04-14 17:11:03 309 1

原创 Java锁的理解

1.可重入锁可重入的意思是在一个线程中可以多次获取同一把锁而不会出现死锁,ReentrantLock和synchronized都是可重入锁。public class ReentrantTest { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { sync

2021-04-14 14:55:46 165 2

原创 Mysql hint 提示

经常使用Oracle的人都知道Oracle的hint 提示功能特别强大,MySQL也有类似的功能,下面是一些MySQL常用的hint 提示。强制索引 FORCE INDEXselect * from table1 force index (field1) …忽略索引 IGNORE INDEXselect * from table1 ignore index (field1, field2) …关闭查询缓冲 SQL_NO_CACHEselect sql_no_cache field1, field

2021-02-02 10:15:56 218

原创 MySQL执行计划详解

在进行SQL优化的时候我们常常使用explain来查看执行计划,这里来详细解释一下执行计划的字段意义id表示select语句的顺序,id值大的先执行,id相同则从上到下执行select_type这一列显示了 对应行是简单还是复杂SELECT, SIMPLE值意味着查询不包括子查询和UNION。查询有任何复杂的子部分,则最外层标记为PRIMARYtable输出数据行所在的表的名称,table列中经常出现类似或<union M,N>它表示该表为临时表。<>带有数字,它是se

2021-01-29 17:26:02 205

原创 SQL语句定义及执行顺序

SQL定义顺序(1) SELECT (2)DISTINCT<select_list>(3) FROM <left_table>(4) <join_type> JOIN <right_table>(5) ON <join_condition>(6) WHERE <where_condition>(7) GROUP BY <group_by_list>(8) WITH {CUBE|ROLLUP}(9) HAVIN

2021-01-29 17:14:00 141

原创 数据库系统

随着应用系统的规模越来越大,现在的系统开发大部分都是基于数据库的应用,因此,作为一名系统架构设计师,要熟练地掌握数据库系统的设计方法和技术。

2021-01-21 15:11:59 270 1

原创 操作系统基本原理

操作系统是计算机系统中最基本的系统软件,它既管理计算机系统的软、硬件资源,又控制程序的执行。操作系统的基本类型有:批处理操作系统、分时操作系统和实时操作系统。从资源管理的角度看,操作系统主要是对处理器、存储器、文件、设备和作业进行管理。操作系统(Operating System,OS)是计算机系统中的核心系统软件,负责管理和控制计算机系统中的硬件和软件资源,合理地组织计算机工作流程和有效地利用资源,在计算机与用户之间起接口的作用。

2021-01-12 17:38:48 8299

原创 计算机组成与体系结构

计算机系统组成计算机硬件的组成控制器       控制器是分析和执行指令的部件,也是统一指挥并控制计算机各部件协调工作的中心部件,所依据的是机器指令。程序计数器PC:存储下一条要执行指令的地址指令寄存器IR:存储即将执行的指令指令译码器ID:对指令中的操作码字段进行分析解释时序部件:提供时序控制信号运算器       运算器也称为算术逻辑单元(Arithmeti

2021-01-08 17:37:06 236

原创 线程池使用FutureTask时注意事项

线程池使用FutureTask时如果拒绝策略设置为DiscardPolicy和DiscardOldestPolicy,并且调用被拒绝的任务的get()方法,那么调用线程会一直被阻塞。所以当我们在使用Future时最好是使用带超时时间的get方法,这样超时时间到了就会自动返回,也不会使得shutdown失效。当然我们也可以重写DiscardPolicy拒绝策略,在拒绝策略中修改FutureTask的状态值为大于COMPLETING

2021-01-06 11:47:40 815 1

原创 JAVA同时启动多个线程(CyclicBarrier实现及原理分析)

本文讲讲使用CyclicBarrier的实现多个线程同时启动以及CyclicBarrier的复用。CyclicBarrier基于独占锁实现,本质底层还是基于AQS,其内部维护了count和parties两个变量,这也就是为什么CyclicBarrier能复用的原因,一开始的时候count等于parties,每当有线程调用await()方法时,count就减1,当count等于0时所有线程开始执行,同时会将parties的值赋给count,从而进行复用。

2020-12-31 17:02:54 511

原创 spring boot使用redis限制接口访问次数

spring boot使用redis限制接口访问次数

2020-12-31 15:05:43 1123 1

原创 JAVA同时启动多个线程(CountDownLatch实现及原理分析)

日常开发中经常会遇到需要同时启动多个线程去并行执行任务的情况,但如果使用循环启动多个线程,并不是真正意义上的同时启动,JDK提供了CountDownLatch和CyclicBarrier可以很好的处理这个问题。。本文先讲讲CountDownLatch的实现方式和原理。CountDownLatch是使用AQS实现的,其使用AQS的状态值来存储计数器的值,在初始化的时候设置计数器的值,调用await()方法将当前线程放入AQS的阻塞队列等待计数器的值变为0后返回

2020-12-29 14:30:21 1450

原创 JAVA线程池的理解

当我们需要执行异步任务时,可以选择new一个新的线程来运行,但线程的创建和销毁是需要开销的,执行大量异步任务时这样做会对系统性能产生影响。使用线程池可以很好的解决这样的问题,线程池里面的线程是可以复用的,不用每次执行异步任务时都重新创建和销毁线程。线程池还有一个优势就是提供了一种资源限制手段和管理手段,比如可以限制线程的个数。本文主要讲讲对线程池主要参数,线程池流程,线程池配置,Java提供的几种常用线程池等的理解

2020-12-24 14:40:46 179

原创 原子变量操作类AtomicLong详解

JUC并发包中有AtomicInteger、AtomicIntegerArray、AtomicLong、AtomicBoolean等原子变量操作类,他们原理都类似,本文主要分析为什么需要原子操作类以及AtomicLong类的实现原理。

2020-12-18 17:58:35 1155

原创 记一次生产事故及分析MySQL为什么不推荐使用UUID或雪花id作为主键

InnoDB存储引擎下使用B+树的数据结构,每个节点不保存数据,只用来索引,所有数据都保存在叶子节点上。所以每个表都会创建一个主键索引,不管是否指定了主键,B+树节点上保存的是主键索引,并且必定是有序的。由于B+树存储的数据是有序的,当有新的数据插入时,如果数据是有序的(自增ID),那么数据将直接插入到到末尾处;如果数据是无序的(UUID/雪花id等随机生成的id),为了保证数据的有序性,那么数据将有可能插入到已有的数据中间,后面的数据将依次往后移位

2020-12-08 22:45:33 448

原创 ThreadLocal原理分析

ThreadLocal提供了线程本地变量,也就是说如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会为这个变量生成一个本地副本,当多个线程操作这个变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题。InheritableThreadLocal继承自 ThreadLocal 其提供了一个特性,就是让子线程可 以访问在父线程中设置的本变量。

2020-12-01 22:53:56 105

原创 JVM垃圾回收与算法

JVM垃圾回收与算法1 JVM GC要做的三件事哪些内存需要回收?什么时候回收?怎么回收?2 标记算法(哪些对象需要回收)2.1 引用计数法在 Java 中,一个对象如果没有任何与之关联的引用,即他们的引用计数都为 0,则说明对象不太可能再被用到,那么这个对象就是可回收对象。通过判断对象的引用数量来决定对象是否可以被回收,每个对象实例有一个引用计数器,被引用+1,完成引用-1,任何引用计数为0的对象实例都可以被当作垃圾回收。优点:执行效率高,程序执行受影响较小。缺点:无法检测出循环引用

2020-11-18 10:34:09 67

原创 JVM内存模型

JVM内存模型包括:程序计数器虚拟机栈本地方法栈Java堆方法区

2020-11-17 11:42:19 83

原创 数据结构-链表及常见操作

链表相对于数组使用连续的内存空间来存储,链表不需要连续的存储空间,而是使用“指针”将零散的内存块串联起来;链表结点除了要存储数据外,还要记录下一个结点的地址。链表最常见的结构有单链表,双链表和循环链表;...

2020-03-09 22:19:40 151

原创 数据结构-二叉排序树(Java实现)

数据结构-二叉排序树(Java实现)二叉排序树代码实现结点定义合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入二叉排序树二叉排...

2019-08-23 21:23:55 430

空空如也

空空如也

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

TA关注的人

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