- 博客(242)
- 资源 (2)
- 收藏
- 关注
原创 同事面试遇到的奇怪问题
近日同事面试资深Java开发工程师在回到MySql索引的时候,遇到了个奇怪的问题:为什么有最左匹配原则? 其实我理解遇到这个问题有可能是面试官对前面的回答不是很满意,随口问了句这种话,毕竟这种话问出来有点为难的意思。 然后我们拿这个问题来讨论下,真是八仙过海,谁都有谁的答案,谁都不服谁。也许这就是程序员吧。 下面是我的个人理解,如果读者有更好的想法,欢迎回复加入讨论。B+树的结构 从上面可以看出来B+树的索引结构。 其实根节点只存建索引的数据段。真正的da
2020-11-23 14:04:30 382 1
原创 不一样的CAP,拒绝网上抄抄抄
不一样的CAP,拒绝网上抄抄抄接触CAP和BASE理论很久了,也看了很多资料,每次看了之后都觉得不对劲,网上绝大多数资料包括很多书中就会copy来copy去(能有点出息不)。看了之后脑子里面疑问:CAP,BASE和我们平时的应用有什么关系? 倒是落个地呀,举几个例子给我看看呀。哎,还是我自己总结算了。以下内容都是我个人的理解,如果大家有什么不同的意见欢迎一起探讨。开篇复习CAP理论的文字定义CAP英文:帽子,其实和帽子一点关系都没有,是三个单词的首字母和一起得出的CAP。三个字母分别是:C:
2020-11-13 10:46:15 428 1
原创 Swagger为什么不使用注释做接口描述
背景使用Swagger的时候有一种痛苦,侵入性太强了。我个人又喜欢写注释,我理解注释写得越好,越能减少沟通的交流,节省人力,提高工作效率。所以想着使用Controller的注释和实体的注释,就能替换Swagger的***注解***。全网找下来,有实现这个功能的:github,但是我使用之后发现一些bug联系不上作者,而且我不会Kotlin, 所以还是需要自己研究一下。设计pom文件依赖因为考虑想开源给大家使用,这里没有去依赖顶层的pom文件。研究swagger的源码通过研究swagger的源码发
2020-11-10 10:17:46 1639
原创 总结每天之上下文切换
16、什么是上下文切换答:比如人工作的时候,准备好装备好工作需要的工具才能开始正常工作,否则都是工作的准备阶段。而我们的cpu是分片执行的(因为CPU运行速度太快,不想浪费,所以都是分片运行任务),我们一般的操作系统都是多任务系统,需要执行其它任务,那么就需要把当前任务的工作环境也就是运行环境保存到内存里,然后把下一个任务的工作环境/运行环境(其实就是寄存器、程序计数器那些东西就绪)放入CPU中,然后开始执行。这两个任务运行环境切换称为上下文切换。17、上下文切换的过程答:1)挂起一个进程,将这
2020-11-05 10:49:16 632
原创 Java后台线程/守护线程/服务线程
Thread.setDaemon(true)开启守护线程,守护线程就是在后台运行的线程,它会随着父线程结束而结束。 Daemon 线程中产生的新线程也是 Daemon 的。当 JVM 中所有的线程都是守护线程的时候, JVM 就可以退出了;如果还有一个或以上的非守护线程则 JVM 不会退出。可以看下面的代码:public class DaemonThreadTest { public static void main(String[] args) { new Thread(()-
2020-11-04 17:24:09 386
转载 带圆圈的数字和markdown常用表达式记录
上波浪线:$\widetilde{\phi}$ ϕ~~ \widetilde{\phi} ϕ带圆圈的数字:⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ㉑ ㉒ ㉓ ㉔ ㉕ ㉖ ㉗ ㉘ ㉙ ㉚ ㉛ ㉜ ㉝ ㉞ ㉟ ㊱ ㊲ ㊳ ㊴ ㊵ ㊶ ㊷ ㊸ ㊹ ㊺ ㊻ ㊼ ㊽ ㊾ ㊿These are specifically sans-serif:???? ➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉Black Circled Number⓿
2020-11-04 17:04:05 6123 1
原创 有三个线程怎么保证顺序性
保证顺序性其实就是java多线程通信的问题。三个线程协定执行的先后顺序,转换成线程通信的问题,我需要用一个东西来协定执行到哪个线程了,这东西实现方式就有很多了:Java的线程通信都是使用内存共享变量的方式,那么就简单的方式就是:一个共享变量。这个共享变量可以是一个简单的静态变量,可以是一个Semaphore等。其实如果考虑抢锁会消耗性能,如果我不跑的线程进行挂起呢?实现方式22)线程的wait和notify如果对底层了解一点,我个人理解性能最高的方式其实是直接使用LockSupport.pa
2020-11-04 16:07:54 937
原创 因为多线程,我怼了一个同事
背景:今天同事在看我写锁同步的总结,兴致来了想考考我,问我synchronized 保证变量的可见性吗?我回答可以,他的答案是synchronized不保证可见性,volatile才保证可见性。结果两人起来争执,为此他特意写了如下代码来证明他说的是正确的:重点戏/** * 证明,synchronized能不能保重对象可见性。 */public class SynchronizedLock { private static int count = 0; public void
2020-11-04 15:26:25 1395 14
原创 总结每天10问之java多线程1
Java 多线程1、Java中实现多线程有多少种方式:答:继承Thread;2)实现接口Runnable;3)FutureTask4)线程池2、sleep()和wait() 有什么区别?答:sleep不会释放对象锁,wait会释放对象锁。sleep会自我唤醒,wait需要notify/notifyAll。3、volatile是什么?可以保存有序性吗?答:volatile是Java多线程解决可见性的问题提供的一个保留关键字,使用它可以保证多线程访问时该变量的可见性。可以保证部分有
2020-11-04 14:36:03 162
原创 总结每天10问之序列化
1、什么是序列化?答:序列化我的理解是我们看到的数据转化成二进制bytes流向磁盘,网络。并经过磁盘、网络之后另外个时间点/另外一个操作系统进行反序列化,将二进制的bytes流翻译成我们能理解的数据格式;比如:json格式。上面是大白话的回答:下面是官方回答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化不仅仅局限于语言,而是网络、操作系统方面
2020-11-02 17:41:24 133
原创 总结每天10问之Java基础3
Java 基础OOP相关21、讲讲类的实例化顺序?答:执行clinit方法什么是clinit得等到jvm篇讲解的时候讲方便点,这里就记住clinit是class的static 变量,final变量,static代码块这些就好。clinit方法不是每个class都有的,Object就没有。包括两个步骤:1)执行父类的clinit方法。2)执行子类的clinit方法。clinit里面具体的执行逻辑是:① 执行static filed②执行static 代码块执行init方法(构造
2020-11-01 18:02:24 126
原创 总结每天10问之Java基础2
Java 基础OOP相关11、什么是拆装箱?答:在理解拆箱和装箱之前需要理解一个概念:基本类型和封装类型,比如int是基本类型,integer是封装类型(包装器类型)。基本类型其实对应到c++或者直接说内存中的某个数据具体样子。int比integer占的内存小的多,integer的功能比int多得多。这两者之间jdk为我们提供了一些转换的方式:拆装箱。这是jdk5之后提供的,为的就是让基本类型和jdk封装类型之间能自动转换。这种自动转换也叫自动拆装箱。在Java SE5之前,如果要生成一个数
2020-10-29 17:34:53 139 2
原创 总结每天10问之Java基础1
Java 基础OOP相关1、什么是B/S架构?什么是C/S架构答:B/S中B是Brower,浏览器的意思;S是Server,即Brower/Server,用户通过浏览器访问服务。C/S中C是Client,客户端的意思;Client的范围很大,可以包括浏览器,但是一般情况都是桌面定制。2、Java都有那些开发平台?答:1)Java SE:主要用在客户端开发2)Java EE:主要用在Wef服务器开发3)Java ME:主要用在嵌入式开发3、JDK和JRE的区别答:1)JDK:Java
2020-10-29 16:59:35 122
原创 RocketMQ压测报告书
RocketMQ压测报告书公司需要压测RocketMq,这里给出个人的压测结果。因为机器不足的原因,这里只能做基准测试。不能做容量测试、稳定性和异常测试。1. 部署结构1.1 机器组成2台机器 4c16g nameserver4台机器 4c16g broker压力机一台 一个 producer + 一个consumer1.2 OS配置系统:Linux ,CentOs7内核:Linux version 4.4.238-1.el7.elrepo.x86_64,(CentOS7默认使用的是3
2020-10-24 23:26:41 3001
原创 ThreadLocal原理解析
个人理解ThreadLocal的原理得结合Thread和ThradGroup体系才能解释清楚。这是一个自底向上的讲解,所以请各位耐心看到最后,才能明白ThreadLocal的原理。关于ThreadGroup和Thread源码的分析,请看我前面的文章。Thread之中有如下两个属性:public class Thread implements Runnable { /* ThreadLocal values pertainingz(有关) to this thread. This map is
2020-07-19 22:59:04 258
原创 Thread源码解析
多线程编程一直是业界公认比较难也是比较重要,而且是非常基础的一点,掌握它非常重要。Java中多线程编程比较幸福,因为Jdk工程师们考虑了很多东西尽量减少使用Java的难度和复杂度。其实在C++之中是没有内建多线程的,它依赖操作系统提供这个特性,因为C++为了效率,控制C++适用的应用程序的范围。即C++没有内建多线程,它允许你直接使用操作系统提供的多线程。这也意味着你在Linux系统下编写的C++多线程代码很有可能在Windows下不能运行,这也是架构师技术选型的时候一个重要考虑点。这边文章不是针对整.
2020-07-19 22:56:11 1828
原创 ThreadGroup源码解析
ThreadGroup 是对Java对Thread的一种组织方式。每一个ThreadGroup都是Thread的集合。ThreadGroup是一个以树状结构维护的一个数据结构。再我们虚拟机一开始启动的时候就初始化一个Root ThreadGroup给我们,所有的线程都在这Root ThreadGroup下面。ThreadGroup重要的属性如下:public class ThreadGroup implements Thread.UncaughtExceptionHandler { /**
2020-07-19 22:46:56 259
原创 Jdk之中的二分查找法
闲逛看代码,看到了JDK之中实现的二分查找法。这里做一下介绍:直接看源码/** * Searches the specified list for the specified object using the binary * search algorithm. The list must be sorted into ascending order * according to the specified comparator (as by the * {.
2020-07-16 21:43:56 491
原创 Spring扫描Jar包小用
近来被委派了一个改造canal-adapter的工作,如果有机会就给大家介绍一下canal。遇到一个问题:class.getClassLoader.getResource()在打成jar的时候获取不到资源。百度了一下,得到很多结果:Java代码打成jar后 classgetClassLoadergetResource()返回为nullJava读取jar包中的文件(与从工程中拿文件不同,不能用new File形式)各种劝我使用getResourceAsStream来获取文件。其实如果只是单单读一个.
2020-07-16 20:52:02 969
原创 Spring的钩子方法知多少
Spring是我们经常使用的一个框架,它功能之一是提供了我们管理bean对象的手段,而且它提供了很多钩子方法给我们使用。什么是钩子方法呢?钩子方法就是:在bean的生命周期之中,经历了一系列的过程之中,Spring留给我们的一个后门,让我们能在Spring的生命周期之中执行我们想要的方法,从而实现我们想要的功能。接下来我们介绍一下生命周期,然后一个一个介绍我见过的样例或者我自己写的样例。Spring生命周期的各种AwareSpring的生命周期(我们撇开网络上很多资料,因为我觉得网络上很多资料要么不.
2020-07-06 21:47:59 2334 1
原创 6个类告诉你Spring Data Jpa的实现原理
用使用过Spring JPA的同学是不是觉得非常好用呢?还有就是Mybatis 为什么定义了一个接口就可以访问数据库了呢?这里我们实现一个简单版的。Spring JPA是怎么使用的@Repositorypublic interface UserDao extends JpaRepository<User, Long> { // 首先这是一个interface,继承interface JpaRepository ,并且模板声明操作的对象及key是什么类型 /** * 根.
2020-07-01 10:01:22 3686
原创 Spring是如何加载资源的
一直很好奇Spring 是如何读取那么多class文件的。经过一番探索,不卖关子,结果就在 类ClassPathScanningCandidateComponentProvider之中。如果同学们没时间细看,我可以直接告诉大家结论:Spring是通过封装Jvm 的 ClassLoader.getResources(String name)来加载资源的(包括ResourceLoader体系)。其实本人见到的很多框架的主要加载资源的手段也是通过ClassLoader.getResources() 来加载资源
2020-06-29 23:27:23 787
原创 Spring的Environment体系完全讲解(涉及PropertySources,Placeholder,PropertyResolver)
我个人在阅读spring的过程中将spring 分成了几个体系,因为我觉得Spring是要给非常优秀的框架,很多设计是可以给我们复用的。比如这里讲解的Spring中的Environment体系。Environment接口环境主要分类为两大部分:profile,properties继承uml图如下:图片有点大而长。但是这样才详细。profile这个功能比较简单这里不介绍了。Envirnment体系最重要的方法就是org.springframework.core.env.AbstractEnvi.
2020-06-28 22:58:48 3247
原创 Spring boot web环境检测:WebApplicationType分析
SampleWebServicesApplication最近在研究Spring,先看一个简单的例子。@SpringBootApplicationpublic class SampleWebServicesApplication { public static void main(String[] args) { SpringApplication.run(SampleWebServicesApplication.class, args); }}SpringApplication源码
2020-06-27 23:37:56 5542
原创 http 和 https 区别,https 在请求时额外的过程,https 是如何保证数据安全的?
有人问我一道这样的题:http 和 https 区别,https 在请求时额外的过程,https 是如何保证数据安全的? 然后我个人总结一下这里给出回答。这个问题分两部分:1. http 和 https 区别首先我先概述一下http是什么?Http是一个应用层的协议,它只在实在TCP层上做了而外一些约定,符合约定的就是http协议。从变成的角度来看,我们最简单网络编程,建立socket之后,可以互相传递数据。然后传递的这些数据符合一些约定就是http一些了。这传递的主要有两部分:1)请求:请求头
2020-06-26 23:21:10 1362
原创 单例设计模式
单例设计模式开篇一张思维图:单例模式的设计思路是:该类负责创建自己的对象,同时确保这个应用中只有单个对象被创建。个人理解的单例模式分两个大类:饿汉模式和懒汉模式。饿汉模式先介绍饿汉模式,为什么呢?因为这种模式比较简单,并且是线程安全的。代码实现如下:/** * thread safe. * * date: 2020/5/24 * * @author 袁小黑 * @version 1.0.0 */public class IvoryTower { private f
2020-06-21 18:01:43 247
原创 RSA加密算法补充签名验签部分
小编很早之前写过一篇文章:RSA加密算法以前封装的这一套还不错。但是缺少网络中经常要使用到的签名验签部分,所以在这里补充一下。先晒一下总的封装:package com.taldh;/* * Copyright 2013 WeCode authors * * Licensed under the WeCode, Version 1.0 (the "License"); * ...
2020-04-04 12:41:42 7070
原创 LeetCode 1305. 两棵二叉搜索树中的所有元素
标签:排序,二叉搜索树给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表,其中包含 两棵树 中的所有整数并按升序 排序。示例 1:输入:root1 = [2,1,4], root2 = [1,0,3]输出:[0,1,1,2,3,4]示例 2:输入:root1 = [0,-10,10], root2 = [5,1,7,0,2]输出:[-...
2020-01-28 21:44:48 376
转载 Linux服务器的文件上传下载
对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / sz命令很方便的帮我们实现了这个功能,但是很多Linux系统初始并没有这两个命令。今天,我们就简单的讲解一下如何安装和使用rz、sz命令。1.软件安装(1)编译安装root 账号登陆后,依次执行以下命令:1 cd /tmp2 wget http://www.ohse...
2019-07-29 14:03:42 224
原创 Redis Sentinel 模式最少几个Sentinel节点
Redis Sentinel 模式是一个Redis官方提供的高可用解决方案,其主要作用是在众多主从节点之间进行服务治理,比如:master宕机了,Sentinel的职责就是选举一个Slave服务为master,继续提供服务。网络上讲了很多理论,突然有人问我:Redis Sentinel最少可以起多少个Sentinel。我个人理解这个东西可以分为两种情况讨论:实际情况,其实单纯从代码的情况...
2019-07-29 13:59:46 15668
转载 同步、异步、阻塞、非阻塞和IO多路复用是怎么回事?
要想更好了解socket编程,有一个不可绕过的环节就是IO.在Linux中,一切皆文件.实际上要文件干啥?不就是读写么?所以,这句话本质就是”IO才是王道”.用php的fopen打开文件关闭文件读读写写,这叫本地文件IO.在socket编程中,本质就是网络IO.所以,在开始进一步的socket编程前,我们必须先从概念上认识好IO.如果到这里你还对IO没啥概念,那么我就通过几个词来给你一个大概...
2019-07-18 15:02:45 255
原创 平方数之和
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。示例1:输入: 5输出: True解释: 1 * 1 + 2 * 2 = 5示例2:输入: 3输出: False解题思路:这个解题思路可以参考:两数之和 II - 输入有序数组 题目的解法:时间复杂度为o(根号n)空间复杂度为o(1)代码如下:public class Ju...
2019-07-15 23:16:51 807
原创 两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入: numbers = [2, 7, 11, 15], ta...
2019-07-15 22:42:59 153
原创 Spring中的Transactional中为什么会有readOnly=true
Transactional是spring中集成的事务,事务有着ACID的特性。A原子性在update,insert的时候都作用比较明显。为什么Spring在Transactional中会有一个readOnly呢?我们来做一个实验:首先造一些数据: @Test public void testInsertBatch() { //insert 十万的数据 ...
2019-07-14 19:28:35 874
转载 MySQL中的alter table命令的基本使用方法及提速优化
一、基本用法1. 增加列 1 alter table tbl_name add col_name type 例如, 给pet的表增加一列 weight, 1 mysql>alter table pet add weight int; 2. 删除列 1 alter ta...
2019-06-27 12:49:05 2972
转载 使用 Redis的SETNX命令实现分布式锁
SETNX命令简介SETNX key value将key的值设为value,并且仅当key不存在。若给定的key已经存在,则SETNX不做任何操作。SETNX 是SET if Not eXists的简写。返回整数,具体为1,当 key 的值被设置 0,当 key 的值没被设置使用SETNX实现分布式锁多个进程执行以下Redis命令:SETNX lock.foo <...
2019-06-26 15:23:55 1209
转载 分布式系统的的最终一致性解决方案探讨
在分布式系统中,同时满足“一致性”、“可用性”和“分区容错性”三者是不可能的。分布式系统的事务一致性是一个技术难题,各种解决方案孰优孰劣?在OLTP系统领域,我们在很多业务场景下都会面临事务一致性方面的需求,例如最经典的Bob给Smith转账的案例。传统的企业开发,系统往往是以单体应用形式存在的,也没有横跨多个数据库。我们通常只需借助开发平台中特有数据访问技术和框架(例如spring、JDBC...
2019-06-25 17:24:29 2199
原创 Spring的@Lookup
假设一个单例的Bean A需要引用一个非单例模式的Bean B,那么在每次引用B的时候都想拿到一个新的B,该怎么做?要知道,Bean A是单例模式的,只会被创建一次,注入一次属性,也就是说,即使B是property模式,那也是只会一个相同的B,因为A只会被注入一次。解决办法1.让bean A通过实现ApplicationContextAware来感知applicationContext(即...
2019-06-05 11:08:40 4671
原创 Redis 过期键回收的注意点
1. Redis 过期声明有如下4中情况:expire <key> <ttl> 命令用于将键key设置为ttl秒 pexpire <key> <ttl> 命令用于将键key设置为ttl毫秒 expireat <key> <timestamp> 命令用于将键key的过期时间设置为timestamp指定的秒数时间戳 pe...
2019-06-03 22:38:15 982
原创 通用版的权限验证领域模块设计
背景这里是根据我以往的经验,针对一般情况的用户登录的领域设计,理想情况下一个比较简单的领域设计。需求:有多个系统不同的系统都有各自的菜单和按钮不同的按钮可以根据不同的角色绑定或者和不同的用户绑定(这里就忽略了角色)设计本文进行的是最简单的系统声明设计。读者可以根据自己的需要区拓展表的字段。多个系统菜单和按钮角色和按钮角色和用户之间用户属于用户领域,按照界限上下...
2019-05-25 14:57:39 743
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人