自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(395)
  • 论坛 (1)
  • 收藏
  • 关注

原创 二叉树、平衡二叉树、B树,B+树

索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。索引最形象的比喻就是图书的目录了。注意这里的大量,数据量大了索引才显得有意义,如果我想要在 [1,2,3,4] 中找到 4 这个数据,直接对全数据检索也很快,没有必要费力气建索引再去查找。索引在 MySQL 数据库中分三类:B+ 树索引 Hash 索引 全文索引我们今天要介绍的是工作开发中最常接触到的 InnoDB 存储引擎中的 B+ 树索引。要介绍 B+ 树索引,就不得不提二叉查找树,平衡二叉树和 B 树这三种数据结

2021-02-05 09:55:53 9

原创 Spring中的Aware(^_^)

简介Spring框架中提供了许多实现了Aware接口的类,这些类主要是为了辅助Spring访问容器中的数据,比如BeanNameAware,这个类能够在Spring容器加载的过程中将Bean的名字(id)赋值给变量。常用的AwareBeanNameAware:能够获取bean的名称,即是id BeanFactoryAware:获取BeanFactory实例 ApplicationContextAware:获取ApplicationContext MessageSourceAwar..

2021-02-01 16:34:24 8

原创 Java中object类finalize()方法

java提供了一个finalize方法,可以帮助我们进行资源释放,类似于C++中的析构函数。但是目前普遍的认识是不要使用,为什么呢?就是因为对java虚拟机的垃圾回收有影响。这篇文章对其进行一个说明。一、为什么有影响我们都知道一个对象如果没有了任何引用,java虚拟机就认为这个对象没什么用了,就会对其进行垃圾回收,但是如果这个对象包含了finalize函数,性质就不一样了。怎么不一样了呢?java虚拟机在进行垃圾回收的时候,一看到这个对象类含有finalize函数,就把这个函数交给Finaliz

2021-01-29 18:30:08 10

原创 mybatis sql注入

2021-01-25 17:23:12 11

原创 JDK8新特性

1.1 函数式编程 1.2 Lambda表达式 1.2.1 语法 1.2.2 函数接口 1.2.3 类型检查、类型推断 1.2.4 局部变量限制 1.2.5 使用示例 2.1 流介绍 2.2 使用流 2.3 并行流 4.1 介绍 4.2 使用说明 4.3 注意事项 6.1 LocalDate/LocalTime/LocalDateTime 6.2 TemporalAdjusters 6.3 DateTimeFormatter下面对几个常用的特性做下重点说明。一

2021-01-15 16:34:01 30

原创 mysql主从复制(读写分离)和mysql和redis数据不一致解决方案(^_^^_^^_^)

mysql引入redis后,暂不考虑主从复制和读写分离,我们的策略是:一、读的时候更新缓存呢(推荐)分析如下:我们在操作数据库写的时候,删除缓存,更新数据库,然后在读的时候,更新缓存(这个操作如果不是强一致性的情况下,我们这4步操作都不需要加锁,可以通过设置key的过期时间来解决数据的最终一致性)二、写的时候更新缓存呢(不推荐)分析如下:我们在操作数据库写的时候,去更新缓存,更新数据库,读的时候直接读缓存即可(这样在高并发的场景下,需要保证这二步操作的原子性,影响性能,不推荐)在读.

2020-12-10 15:30:38 61

原创 在MySQL中重复的插入数据不抛异常(性能待验证)

最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一下,感兴趣的朋友可以尝试一下:这里为了方便演示,我新建了一个user测试表,主要有id,username,sex,address这4个字段,其中主键为id(自增),同时对username字段设置了唯一索引:01 insert ignore into(这个可以使用下)即插入数据时,如果数据存在,则忽略此次插入,前提条件是插入的数

2020-11-12 17:25:10 70

原创 MySQL中,当update修改数据与原数据相同时会再次执行吗?

一、背景本文主要测试MySQL执行update语句时,针对与原数据(即未修改)相同的update语句会在MySQL内部重新执行吗?二、测试环境MySQL5.7.25Centos 7.4三、binlog_format为ROW1、参数image2、测试步骤session1imagesession2imagesession1image3、总结在binlog_format=row和binlog_row_image=FULL时,由于MyS

2020-11-12 17:01:34 27

原创 Git撤销&回滚操作(git reset 和 get revert)(^_^^_^)

git的工作流工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 git add xx 和 git commit xxx 之后的。暂存区:已经 git add xxx 进去,且未 git commit xxx 的。本地分支:已经git commit -m xxx 提交到本地分支的。这里写图片描述代码回滚在上传代码到远程仓库的时候,不免会出现问题,任何过程都有可能要回滚代码:1、在工作区的代码git checkout -- a.txt # 丢弃某个文件,..

2020-11-12 14:57:13 49

原创 git版本回退的最佳操作

使用git开发的过程中,存在误提交的时候怎么办呢?不用慌张,强大的git提供了两种版本回退的方式,可以让你恢复提交之前的内容:方式一:reset(不推荐)通过reset的方式,把head指针指向之前的某次提交,reset之后,后面的版本就找不到了操作步骤如下:1、在gitlab上找到要恢复的版本号,如:139dcfaa558e3276b30b6b2e5cbbb9c00bbdca962、在客户端执行如下命令(执行前,先将本地代码切换到对应分支):gitreset--har...

2020-11-12 11:38:26 29

原创 spring事务提交后一系列相关异步操作(例如MQ或者线程池)(^_^^_^)

1、场景在常见的操作中,我们需要在数据库操作完成(事务提交完成)后进行一系列相关操作,如redis更新操作、发送消息到其他系统等操作。2、方案可以使用spring自带的事务处理机制完成。继承 TransactionSynchronizationAdapter 类执行相关操作。先看一下TransactionSynchronizationAdapter 的源码方法/* * Copyright 2002-2012 the original author or authors. * * Li

2020-10-13 14:36:19 73

原创 @PostConstruct注解

1、从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。写法有如下两种方式:@PostConstruct注解的方法将会在依赖注入完成后被自动调用。@PostConstructpublic void someMethod(){}或者public @PostConstruct void someMethod(){}被@PostConstruct修饰的

2020-10-12 18:37:05 34

原创 Transactional超时时间控制与mysql事务超时时间

项目使用的是spring+mybatis+mysql,今天,我需要把处理一个业务就是,当用户出金失败时,事务能够回滚,同时减少用户的等待时间,因为我发现当处理失败时,用户需要等上1分钟以上的时间,这是不合理的。那么经过一系列的调查发现:spring的事务超时(使用Java注解方式)和mysql InnoDB事务超时是相互关联的。在一个需要进行事务回滚的方法上加入@Transactional的事务注解,timeout超时时间设置为2秒,也就是说发生事务回滚后,2秒钟后对用户响应。 @Trans.

2020-08-31 15:16:16 370

原创 java stream list转map

java 8 使用stream流来对集合进行处理:Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定key-value,value是对象中的某个属性值。Map<Integer,String> userMap1 = userList.stream().collect(Collectors.toMap(User::getId,User.

2020-07-29 10:26:37 223

原创 同步锁可以使用字符串对象做锁需要注意的事项

Java中使用String作同步锁在Java中String是一种特殊的类型存在,在jdk中String在创建后是共享常量池的,即使在jdk1.8之后实现有所不同,但是功能还是差不多的。借助这个特点我们可以使用String来作同步的锁,比如更新用户信息的时候,可以使用用户的名称作为同步锁,这样不同的用户就可以使用不同的锁,提升并发性能。这个特点扩展开来适当的场景就非常之多了。只不过正因为String的特殊性,java还包含了更多的与字符串相关的工具类,如StringBuffer、StringBui

2020-07-05 12:32:12 250

原创 线程池ThreadPoolExecutor的三种队列区别

使用方法:1.SynchronousQueueprivate static ExecutorService cachedThreadPool = new ThreadPoolExecutor(4, Runtime.getRuntime().availableProcessors() * 2, 0, TimeUnit.MILLISECONDS, new SynchronousQueue<>(), r -> new Thread(r, "ThreadTest"));Synchronou

2020-06-29 16:45:52 340

原创 缓存同步、如何保证缓存一致性、缓存误用(^_^)

缓存误用缓存,是互联网分层架构中,非常重要的一个部分,通常用它来降低数据库压力,提升系统整体性能,缩短访问时间。有架构师说“缓存是万金油,哪里有问题,加个缓存,就能优化”,缓存的滥用,可能会导致一些错误用法。缓存,你真的用对了么?误用二:使用缓存未考虑雪崩常规的缓存玩法,如上图:服务先读缓存,缓存命中则返回缓存不命中,再读数据库什么时候会产生雪崩?答:如果缓存挂掉,所有的请求会压到数据库,如果未提前做容量预估,可能会把数据库压垮(在缓存恢复之前,数据库可能一直都起不来),导

2020-06-05 15:17:19 170

原创 锁和事务冲突

单机里面,完美解决了锁与事务一、使用锁的原因分析:1、使用锁的目的------------多个外部线程同时来竞争使用同一资源时,会彼此影响,导致混乱------------锁的目的,将资源的使用做排它性处理,使同一时间,仅一个线程能访问资源2、并不是所有的资源,都无法同时服务多个线程 ------ 比如,无状态的资源3、无成员变量/成员变量不存在变化的类---- 就是无状态类 ----- 这种类是线程安全的4、有状态的对象,也不一定是不安全的---------- 如果状态变化

2020-06-01 17:48:13 541

原创 RabbitMq常见面试题

使用RabbitMQ有什么好处?1.解耦,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!2.异步,将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度3.削峰,并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常如何避免消息重复投递或重复消费?mq在生产者发送消息时,mq内部会对每条消息生成一个唯一id,作为去重和幂等性的依据((消息投递失败并重传))避免重复的消息进入队列;在消息消费时,要求消息体中必须要有一.

2020-05-27 11:09:09 113

原创 双向链表的结构图

2020-05-26 15:03:31 270

原创 实现幂等性的几种方式

1、首先说下什么是幂等性呢对于同一笔业务操作,不管调用多少次,得到的结果都是一样的。2、幂等性设计我们以对接支付宝充值为例,来分析支付回调接口如何设计?如果我们系统中对接过支付宝充值功能的,我们需要给支付宝提供一个回调接口,支付宝回调信息中会携带(out_trade_no【商户订单号】,trade_no【支付宝交易号】),trade_no在支付宝中是唯一的,out_trade_no在商户系统中是唯一的。回调接口实现有以下实现方式。方式1(普通方式)过程如下:1.接收到支付宝支

2020-05-15 10:03:18 225

原创 String类和常量池常见面试题

1、String的两种创建方式的区别String str1 = "abc";String str2 = new String("abc");sout(str1 == str2);//false其中,第一种方式是从常量池中获取对象,第二种方式是直接在堆内存中创建一个新的对象。2、String 类型的常量池它的主要使用方法有两种:  直接使用双引号声明出来的 St...

2020-04-07 11:20:13 137 2

原创 java并发编程原子性类Atomic

1. 原子操作类介绍atomic的实现原理:CAS+volatileCAS是compare and swap的缩写,即比较后(比较内存中的旧值与预期值)交换(将旧值替换成预期值)。它是sun.misc包下Unsafe类提供的功能,需要底层硬件指令集的支撑。volatile变量是为了多个线程间变量的值能及时同步。在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是...

2020-04-03 10:30:42 62

原创 java基础细节汇总(^_^)

1 HashMap里的hashcode方法和equal方法什么时候需要重写?为什么需要重写?java 比较二个对象是否相等的时候,1 首先判断二个对象的hashcode值是否相等,2 如果相等则比较equal值是否相等,当hashcode和equal值都相等时,则二个对象相等2 为什么要重写equal方法?答案:因为Object的equals方法默认是两个对象的引用的比较,意思就是指向同...

2020-03-30 11:56:54 81

原创 mybatis中对于多条件if test传递参数为0

今天工作中发现一个Long类型的参数没有传到sql中去,在sql xml配置文件中是使用if test标签判断:<if test="version != null and version != ''">and version = #{version,jdbcType=BigInt}</if>version我传递的参数是0L但是在sql执行时,总是判断没有传...

2020-03-11 23:31:49 587

原创 select * from for update对于多个事务的隔离情况

事务与锁的关系1、事务与锁是不同的。事务具有ACID(原子性、一致性、隔离性和持久性),锁是用于解决隔离性的一种机制。2、事务的隔离级别通过锁的机制来实现。另外锁有不同的粒度,同时事务也是有不同的隔离级别的。3、开启事务就自动加锁。行级锁:共享锁(s):又称读锁。允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A...

2020-03-09 10:14:47 390

原创 ThreadLocal 内存泄漏问题(^_^)

ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。但是如果滥用ThreadLocal,就可能会导致内存泄漏。下面,我们将围绕三个方面来分析ThreadLocal 内存泄漏的问题:ThreadLocal 实现原理ThreadLocal为什么会内存泄漏ThreadLocal 最佳实践T...

2020-01-15 15:56:20 177

原创 Java 对象动态设置属性值

Maven引用: <!-- https://mvnrepository.com/artifact/cglib/cglib --> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artif...

2019-12-23 10:48:06 271

原创 分布式锁介绍的最清楚(^_^^_^)

为什么用分布式锁?在讨论这个问题之前,我们先来看一个业务场景:系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户下单。由于系统有一定的并发,所以会预先将商品的库存保存在redis中,用户下单的时候会更新redis的库存。此时系统架构如下:但是这样一来会产生一个问题:假如某个时刻,redis...

2019-10-12 15:42:13 219

原创 分布式锁超时问题的处理(只是参考,推荐使用redission框架和ZK做分布式锁)

1、redis分布式锁的基本实现redis加锁命令:SETNX resource_name my_random_value PX 30000 这个命令的作用是在只有这个key不存在的时候才会设置这个key的值(NX选项的作用),超时时间设为30000毫秒(PX选项的作用) 这个key的值设为“my_random_value”。这个值必须在所有获取锁请求的客户端里保持唯一。SET...

2019-10-12 15:31:08 3768 1

原创 JDK1.8引入的stream

为什么需要 StreamStream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合...

2019-10-10 11:15:06 154

原创 jdk1.8后对集合的遍历方法更新

一、首先对Map集合的遍历方法jdk1.7之前的遍历方法如下:for (Map.Entry<String, Integer> entry : ordermap.entrySet()) { System.out.println("key : " + entry.getKey() + " value : " + entry.getValue());}jdk1.8之...

2019-10-08 14:07:16 582

原创 JDK 7中引入的并发框架Fork/Join(^_^)

Fork/Join 框架是 JDK 1.7 提供的并行执行任务框架,这个框架通过(递归)把问题划分为子任务,然后并行的执行这些子任务,等所有的子任务都结束的时候,再合并最终结果的这种方式来支持并行计算编程。 总体的设计参考了为 Cilk 设计的work-stealing 框架。 Fork/Join 并行方式是获取良好的并行计算性能的一种最简单同时也是最有效的设计技术,是分治算法(Divid...

2019-09-27 17:54:24 151

原创 java 序列化的几种方式

什么是序列化?内存中的数据对象只有转换为二进制流才可以进行数据持久化和网络传输。将数据对象转换为二进制流的过程称为对象的序列化(Serialization)。反之,将二进制流恢复为数据对象的过程称为反序列化(Deserialization)。序列化需要保留充分的信息以恢复数据对象,但是为了节约存储空间和网络带宽,序列化后的二进制流又要尽可能小。序列化常见的使用场景是RPC框架的数据传输。常见的...

2019-09-26 17:09:43 153

原创 线程的生命周期(主要为了记忆)

这个也是面试题1.线程创建通过二种方式:1、继承Thread类2、实现Runnable接口,实现run方法,并调用start()方法2.就绪状态创建完线程后处于就绪状态,有执行资格,没有执行权3.运行状态获取cpu的执行权,执行代码4.阻塞状态有执行资格但是没有获取执行权,或者使用wait()等方法,释放锁并处于阻塞状态,需要通过notify激活后才能获取到就绪状态...

2019-09-06 14:51:48 45

原创 JDK1.5中的Callable接口和Futrue接口

我们在创建线程的方式有二种:1.继承Thread类;2.实现Runnable接口,但是在创建线程后,我们无法获取线程执行后的结果,就必须通过共享变量或者使用线程通信的方式来达到效果,比较繁琐,所以JDK1.5就添加了Callable和Futrue接口,通过它们可以在任务执行完毕之后得到任务执行结果,他们是相伴相生的。它们都是java.util.concurrent包下一、Callable接口位...

2019-08-26 17:50:44 142

原创 java多线程向RabbitMQ推送消息

首先我们使用Executor框架来实现多线程。1.向IOC容器中注册一个ThreadPoolTaskExecutor实例@Bean public ThreadPoolTaskExecutor DoneThreadPool(){ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); ...

2019-08-08 14:23:46 460

原创 中文不同的编码占用的字节长度不同

String s = "中国"; 占多少字节?(1)GBK 编码(ide默认)时,每一个汉字占用 2 个字节,那么中国占 4 个字节。(2)UTF-8 编码时,每一个汉字占用 3 个字节,那么中国占用 6 个字节。String s = "China"; 占多少字节?答:占 5 个字节。System.out.println(Charset.defaultCharset());//...

2019-07-31 15:45:27 239

原创 基于redis分布式锁框架redisson(^_^)

什么是RedissonRedisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, S...

2019-07-01 10:20:18 1856

转载 分布式/分布式锁/分布式锁常用方案(^_^^_^^_^)

### 什么是锁?在单进程的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这种变量时能够线性执行消除并发修改变量。 而同步的本质是通过锁来实现的。为了实现多个线程在一个时刻同一个代码块只能有一个线程可执行,那么需要在某个地方做个标记,这个标记必须每个线程都能看到,当标记不存在时可以设置该标记,其余后续线程发现已经有标记了则等待拥有标记的线...

2019-06-26 20:16:04 215

空空如也

jaryle的留言板

发表于 2020-01-02 最后回复 2020-01-02

空空如也

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

TA关注的人 TA的粉丝

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