- 博客(136)
- 收藏
- 关注
原创 DDD基础概念总结
这是一个范围概念,而且是面向业务的(注意这里不是面向技术的,更不是面向数据库的持久化的),每个组织都有自己的人员、规则和流程,当你为该组织开发软件的时候,你面对的就是这个组织的领域。团队(业务方、产品、设计、技术等)在一个限定的上下文中有意识地形成对事物统一的描述,从而形成统一的概念(模型),这些统一的描述和统一的概念就是统一语言,统一语言主要源自于领域模型的概念与逻辑,作为对业务维度的补充和展开,也会将限界上下文、系统隐喻等纳入到统一语言中。例如,在“智慧课堂”中,权限域、登录域就是通用域。
2024-05-12 20:42:09
488
原创 UDP如何实现可靠传输
概述UDP不属于连接协议,具有资源消耗少,处理速度快的优点,所以通常音频,视频和普通数据在传送时,使用UDP较多,因为即使丢失少量的包,也不会对接受结果产生较大的影响。传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。最简单的方式是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,可靠UDP的简单设计。1、添加seq/ack机制,确保数据发送到对端2、添加发送和接收缓冲区,主要是用户超时重传。3、添加超
2020-11-27 10:00:28
669
原创 JDBC原理
JDBC相关简介1.什么是 JDBC ?JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API(Application Programming Interface),可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。简单说:它就是Java与数据库的连接的桥梁或者插件,用Java代码就能操作数据库的增删改查、存储过程、事务等。在这里插入图片描述2.JDBC 有什么用 ?我们用JAVA就能连接到数据库
2020-10-17 18:17:18
770
原创 Redis总结
redis 简介简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同的业务场景。除此之外,redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。为什么要用 redis/为什么要用缓存主要从...
2020-04-30 23:47:24
276
原创 一条sql语句在mysql中如何执行的
一 MySQL 基础架构分析1.1 MySQL 基本架构概览下图是 MySQL 的一个简要架构图,从下图你可以很清晰的看到用户的 SQL 语句在 MySQL 内部是如何执行的。先简单介绍一下下图涉及的一些组件的基本作用帮助大家理解这幅图,在 1.2 节中会详细介绍到这些组件的作用。连接器: 身份认证和权限相关(登录 MySQL 的时候)。查询缓存: 执行查询语句的时候,会先查询缓存(M...
2020-04-30 23:23:09
311
转载 一条SQL语句执行得很慢的原因有哪些?
本文转载自公众号:苦逼的码农 作者:帅地一、开始装逼:分类讨论一条 SQL 语句执行的很慢,那是每次执行都很慢呢?还是大多数情况下是正常的,偶尔出现很慢呢?所以我觉得,我们还得分以下两种情况来讨论。1、大多数情况是正常的,只是偶尔会出现很慢的情况。2、在数据量不变的情况下,这条SQL语句一直以来都执行的很慢。针对这两种情况,我们来分析下可能是哪些原因导致的。二、针对偶尔很慢的情况...
2020-04-30 23:11:20
172
原创 索引总结
为什么要使用索引?通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。可以大大加快 数据的检索速度(大大减少的检索的数据量), 这也是创建索引的最主要的原因。帮助服务器避免排序和临时表。将随机IO变为顺序IO可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。索引这么多优点,为什么不对表中的每一个列创建一个索引呢?当对表中的数据进行增加、删除和修改的时候...
2020-04-30 23:04:09
167
原创 MySQL总结
什么是MySQL?MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的。MySQL是开放源代码的,因此任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL的默认端口号是3306。存储引擎MyIS...
2020-04-29 00:58:50
356
原创 select、poll、epoll详解
一 概念说明在进行解释之前,首先要说明几个概念:用户空间和内核空间进程切换进程的阻塞文件描述符缓存 I/O用户空间与内核空间现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kerne...
2020-04-27 22:36:52
183
原创 Linux的五种IO模型
在Linux(UNIX)操作系统中,共有五种IO模型,分别是:阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动IO模型以及异步IO模型。到底什么是IO我们常说的IO,指的是文件的输入和输出,但是在操作系统层面是如何定义IO的呢?到底什么样的过程可以叫做是一次IO呢?拿一次磁盘文件读取为例,我们要读取的文件是存储在磁盘上的,我们的目的是把它读取到内存中。可以把这个步骤简化成把数据从硬件(硬...
2020-04-27 22:09:09
149
原创 BIO,NIO,AIO 总结
同步和异步同步 : 两个同步任务相互依赖,并且一个任务必须以依赖于另一任务的某种方式执行。 比如在A->B事件模型中,你需要先完成 A 才能执行B。 再换句话说,同步调用种被调用者未处理完请求之前,调用不返回,调用者会一直等待结果的返回。异步: 两个异步的任务完全独立的,一方的执行不需要等待另外一方的执行。再换句话说,异步调用种一调用就返回结果不需要等待结果返回,当结果返回的时候通过回调...
2020-04-27 21:34:15
201
原创 AQS详解
AQS 介绍AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面。AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue...
2020-04-26 09:52:36
206
原创 Java线程池总结
为什么要用线程池?池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。这里借用《Java 并发编程的艺术》提到的来说一下使用线程池的好处:降低资源消耗。通过重复利用已创...
2020-04-26 09:41:31
132
原创 synchronized和ReentrantLock 、volatile关键字的区别
谈谈 synchronized和ReentrantLock 的区别① 两者都是可重入锁两者都是可重入锁。“可重入锁”概念是:自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死锁。同一个线程每次获取锁,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。② synch...
2020-04-26 09:28:36
431
原创 final,static,this,super 关键字总结
final 关键字final关键字主要用在三个地方:变量、方法、类。对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。使用final方法的原因有两个。第一个原因是把方法锁定,...
2020-04-26 08:57:29
175
原创 CAP定理、 BASE理论、
CAP定理在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:一致性(Consistence) :所有节点访问同一份最新的数据副本可用性(Availability):每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据分区容错性(Partition toler...
2020-04-26 08:45:07
185
原创 简述抓包
1.什么是抓包?不同主机之间的数据通信都是通过网络来进行传输,对那些在网络上传输的数据(发送、请求的数据)进行截获、编辑、转存等操作叫做抓包。抓包可以是抓取电脑端请求的数据,还可以抓取移动端(手机APP)的数据包。2.为什么要进行抓包?通过对网络上传输的数据进行抓取,可以对其进行分析,对于软件的Debug很大的帮助。当然也可以通过抓取用户发送的涉及用户名和密码的数据包来获取用户的密码。3....
2020-03-31 17:04:11
2625
原创 分布式架构的优缺点
分布式优点:1.增大系统容量。我们的业务量越来越大,而要能应对越来越大的业务量,一台机器的性能已经无法满足了,我们需要多台机器才能应对大规模的应用场景。所以,我们需要垂直或是水平拆分业务系统,让其变成一个分布式的架构。2.加强系统可用。我们的业务越来越关键,需要提高整个系统架构的可用性,这就意味着架构中不能存在单点故障。这样,整个系统不会因为一台机器出故障而导致整体不可用。所以,需要通过分布式...
2020-03-31 16:29:41
7323
原创 线程同步方式,线程状态及其转换
线程同步的方式互斥量 Synchronized/Lock:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问信号量 Semphare:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量事件(信号),Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先...
2020-03-23 21:27:05
208
原创 Dubbo与SpringCloud的选择
Dubbo优点:Dubbo 支持 RPC 调用,服务之间的调用性能会很好。支持多种序列化协议,如 Hessian、HTTP、WebService。Dobbo Admin后台管理功能强大,提供了路由规则、动态配置、访问控制、权重调节、均衡负载等功能。在国内影响力比较大,中文社区文档较为全面。阿里最近重启维护。Dubbo优点:Registry 严重依赖第三方组件(zookeeper...
2020-03-13 18:27:01
459
原创 序列化二叉树
题目描述:请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得...
2020-03-12 10:34:14
118
原创 把二叉树打印成多行
题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。代码描述:import java.util.ArrayList;import java.util.LinkedList;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null;...
2020-03-12 08:32:04
116
原创 按之字形顺序打印二叉树
题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:主要的方法与BFS写法没什么区别BFS里是每次只取一个,而我们这里先得到队列长度size,这个size就是这一层的节点个数,然后通过for循环去poll出这size个节点,这里和按行取值二叉树返回ArrayList<Array...
2020-03-11 10:47:50
129
原创 对称的二叉树
题目描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:对称二叉树:一棵树的左(右)子树与另一棵树的右(左)子树相同。代码描述:/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null;...
2020-03-11 08:31:06
115
原创 二叉树的下一个结点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。代码描述:/*public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNod...
2020-03-09 13:30:38
97
原创 删除链表中重复的结点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5代码描述:public class Solution { public ListNode deleteDuplication(ListNode pHead)...
2020-03-09 10:57:11
117
原创 链表中环的入口结点
题目描述:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:这题我们可以采用双指针解法,一快一慢指针。快指针每次跑两个element,慢指针每次跑一个。如果存在一个圈,总有一天,快指针是能追上慢指针的。如下图所示,我们先找到快慢指针相遇的点,p。我们再假设,环的入口在点q,从头节点到点q距离为A,q p两点间距离为B,p q两点间距离为C。因为快指针是慢指...
2020-03-08 15:39:19
93
原创 字符流中第一个不重复的字符
题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路:字符出现次数的判断(不重复字符):这个做法大致相同,利用 Hash 思想采用128大小的计数数组进行...
2020-03-08 09:44:02
176
原创 Java中创建线程
相关示例代码Java中创建线程主要有三种方式:一、继承Thread类创建线程类(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。(2)创建Thread子类的实例,即创建了线程对象。(3)调用线程对象的start()方法来启动该线程。二、通过Runnable接口创建线程类(1)定义runnable接口的...
2020-03-06 15:46:52
112
原创 简述Java IO
从数据传输方式或者说是运输方式角度看,可以将 IO 类分为:1、字节流2、字符流字节流是以一个字节单位来运输的,比如一杯一杯的取水。而字符流是以多个字节来运输的,比如一桶一桶的取水,一桶水又可以分为几杯水。字节流和字符流的区别:字节流读取单个字节,字符流读取单个字符(一个字符根据编码的不同,对应的字节也不同,如 UTF-8 编码是 3 个字节,中文编码是 2 个字节。)字节流用来处理二...
2020-03-06 14:34:02
128
原创 表示数值的字符串
题目描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。代码描述:import java.util.regex.Pattern;public class Solution { publ...
2020-03-06 11:06:01
121
原创 为什么StringBuilder线程不安全?
假设我开启多个线程分别调用 StringBuffer 和 StringBuilde r的 append()方法,会发现 StringBuilder 的length总是比预期的更小,而 StringBuffer 与预期是一致的。通过查看 append()源码可以发现,StringBuffer的append()前加了 synchronized,再进一步看,发现 StringBuffer 和String...
2020-03-06 00:53:35
218
1
原创 构建乘积数组
题目描述:给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)思路描述:B[i]的值可以看作下图的矩阵中每行的乘积。下三...
2020-03-05 10:12:51
122
原创 数组中重复的数字
题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。代码描述:public class Solution { // Parameters: // n...
2020-03-05 09:04:49
100
原创 Threadlocal实现原理
首先,在每个线程 Thread 内部有一个 ThreadLocal.ThreadLocalMap 类型的成员变量 ThreadLocals,ThreadLocalMap 是ThreadLocal 的内部类。这个ThreadLocals就是用来存储实际的变量副本的,键值为当前ThreadLocal变量,value为变量副本(即T类型的变量)。初始时,在Thread里面,ThreadLocals为空...
2020-03-03 17:23:23
243
原创 把字符串转换成整数
题目描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0代码描述:public class Solution { public int StrToInt(String str) { if(! (str.matches("[+,-]\\d+") || str.matches("[0-9]\\d*"))) r...
2020-03-03 13:30:43
126
原创 Java内存模型之happens-before
在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。下面是happens-before原则规则:程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作;锁定规则:一个unLock操作先行发生于后面对同一个锁的lock操作;volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作...
2020-03-02 16:02:31
87
原创 不用加减乘除做加法
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。代码描述:public class Solution { public int Add(int num1,int num2) { int result = 0; int carry = 0; do{ result = num1...
2020-03-02 09:46:40
87
原创 求1+2+3+...+n
题目描述:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。代码描述:public class Solution { public int Sum_Solution(int n) { int sum = (int)Math.pow(n, 2) + n; return...
2020-03-02 08:01:50
161
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人