- 博客(46)
- 资源 (1)
- 收藏
- 关注
原创 netty07-粘包半包以及解决方案
粘包指的是发送方在发送数据时,多个数据包被合并成一个大的数据包发送到接收方,接收方在接收时无法准确地区分各个数据包的边界,从而导致数据粘在一起。半包指的是发送方发送的数据包被拆分成了多个小的数据包,在接收方接收时,无法完整地接收到一个数据包,导致数据包的边界不完整,出现了"半个"数据包。
2023-12-06 16:52:06
682
转载 Netty04-核心组件Bootstrap和ServerBootstrap
Netty的核心组件的设计都很模块化,如果想要实现一个应用程序,就需要将这些组件组装到一起。Netty通过Bootstrap类,以对一个Netty应用程序进行配置(组装各个组件),并最终使它运行起来。
2023-12-06 14:35:31
309
原创 Netty03-核心组件NioEventLoopGroup解读
可以看到NioEventLoopGroup继承了MultithreadEventExecutorGroup并且实现了EventLoopGroup接口,而这两个类被ExecutorService修饰,所以NioEventLoopGroup实际上是一个线程池,池中的对象其实就是单个的NioEventLoop。
2023-12-05 17:22:31
873
原创 Netty02-基础概念
Netty是一个基于Java NIO的异步事件驱动网络应用程序框架。它提供了简单易用的API,用于快速开发可维护的高性能网络应用程序。Netty的设计目标是提供一种高度可扩展的、高性能的网络应用程序框架,使得开发人员能够轻松地构建各种类型的网络应用,包括但不限于服务器通信、实时通信、游戏服务器等。 Netty的核心是基于Channel、EventLoop和Handler的模型。它采用了事件驱动的方式,通过Handler对事件进行处理,实现了高效的并发处理和网络通信。
2023-12-05 15:33:55
987
原创 Netty01-NIO与BIO
Java NIO 全称 java non-blocking IO,是指JDK 1.4 及以上版本提供的新API(New IO)。从 JDK1.4 开始,Java 提供了一系列改进的输入/输出的新特性,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供同步非阻塞式的高伸缩性网络。 NIO的面向缓冲区和非阻塞I/O模式确实提供了高灵活性和高性能的优势,使得一个线程可以处理多个操作,从而提高了系统的可伸缩性。
2023-12-05 11:42:34
1117
原创 池化技术(对象池)
池化技术是一种很常见的编程技巧,目的在于提前创建如内存,对象,线程资源,降低程序运行时频繁的创建销毁带来的开销。常见的有线程池,内存池,对象池等。池化技术如何提高性能,降低系统开销在实际的应用中,程序经常需要创建对象,线程和分配内存。这些设计到系统调用,系统调用会导致程序从用户态到内核态的切换会比较耗时。有了池化技术,需要用到对应的线程,对象和内存时不需要再切换上下文之需要从相应的池中获取,也不需要销毁,用完归还即可。线程池实现的原理。
2023-12-04 16:31:01
1109
原创 一些后端测试的东西
单元测试是针对软件中的最小可测试部分(通常是函数或方法)进行的测试。单元测试的目的是验证这些最小单元的行为是否符合预期,通常是通过编写测试用例来实现。单元测试通常是自动化的,可以在开发过程中频繁地运行,以确保代码的正确性和稳定性。单元测试的好处包括:可以快速发现和定位代码中的问题,有助于提高代码质量。可以在修改代码后快速验证代码的正确性,有助于防止引入新的问题。可以作为文档,帮助其他开发人员理解代码的预期行为。单元测试通常是软件开发中的重要环节,也是保证软件质量的重要手段之一。
2023-11-30 15:19:31
1522
原创 seata集成springboot的一些错误小计
1 原因: @GlobalTransactional 是通过 AOP 实现的,只有通过代理调用的方法才会被 AOP 增强。seata-server.sh -h {ip} -p 8091 不能直接使用seata-server.sh。错误原因: 事务组配置错误,yml没有和配置文件registry.conf中正确对应。2 多个服务间的调用所有相关服务都必须配置seata。错误原因:未指定具体的seata版本。错误原因:未指定当前服务名。nacos中事务组配置。
2023-11-27 17:57:11
1218
原创 几种单例模式
饿汉式单例类在类被加载时就将自己实例化,它的优点在于无须考虑多线程访问问题,可以确保实例的唯一性;懒汉式单例类在第一次使用时创建,无须一直占用系统资源,实现了延迟加载,但是必须处理好多个线程同时访问的问题, 特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费大量时间,这意味着出现多线程同时首次引用此类的机率变得较大,需要通过双重检查锁定等机制进行控制,这将导致系统性能受到一定影响。单例模式指的是一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
2023-10-20 17:54:51
543
原创 阿里面试(持续更新)
HashMap和ConcurrentHashMap都是存储键值对的数据结构,不同的是HashMap是线程不安全的,ConcurrentHashMap是线程安全的,HashMap在高并发情况下会出现数据不一致问题。1.7 基于数组和链表 ,将数据封装成一个Entry节点 ,通过哈希算法找到节点插入的位置,通过头插法进行插入。当hashMap元素数量到达16*0.75时会将容量翻倍进行扩容操作,会重新计算节点的位置并进行插入。但是使用头插法插入在并发扩容时会出现死链问题。
2023-10-19 16:28:08
440
原创 关于多线程的异常处理
我们首先说一说在线程池中的异常处理。像Runable()没有返回值自然就无法捕获和处理异常,如果时Callable()这类有返回值的线程我们就可以对它进行处理。在多线程中我们对任务的提交方式决定了我们对线程中异常处理的不同。execute会直接抛出任务执行时的异常,可以用try、catch来捕获,和普通线程的处理方式完全一致。execute和submit都属于线程池的方法,execute只能提交Runnable类型的任务、submit会吃掉异常,可通过Future的get方法将任务执行时的异常重新抛出。
2023-10-19 16:17:06
383
原创 说说mybatis中的#{} 和 ${}
MyBatis是一种Java持久层框架,为了方便操作数据库,MyBatis提供了动态SQL的功能。在MyBatis中,我们可以使用${}和#{}两种方式来引用变量。${}#{}为什么要使用#{}${}#{}${}#{}总之,为了提高安全性和可靠性,推荐使用#{}的方式来引用变量。
2023-10-18 17:17:23
393
原创 简单说说ConcurrentHashMap的结构和实现
通过树化分割的方式,JDK 1.8中的ConcurrentHashMap在进行扩容时可以更高效地转移数据,并提供更好的并发性能。扩容阈值:JDK 1.8中的ConcurrentHashMap的扩容阈值相较于JDK 1.7有所不同。每个数组中的元素称为Node节点。ConcurrentHashMap是线程安全的HashMap,并非通过锁住整个方法,而是在方法内进行一些原子的操作和局部加锁保证多线程的安全。扩容过程:当哈希表需要扩容时,JDK 1.8中的ConcurrentHashMap采用了树化分割的方式。
2023-10-18 16:40:52
183
原创 一些负载均衡算法
为每个服务器分配一个权重,根据服务器当前的连接数和权重来决定请求的分发。权重高的服务器可以处理更多的请求,但同时也要考虑当前的连接数。每个请求将按照服务器的权重进行分发,权重高的服务器将处理更多的请求。将请求分发到当前连接数最少的服务器上,以保持服务器的负载均衡。:在负载均衡设备和服务器之间建立一对一的映射关系,所有来自同一客户端的请求都发送到相同的服务器。:根据服务器的实际负载动态调整服务器的权重,以确保负载分布均衡。:根据请求的源IP地址进行散列计算,将相同IP的请求分发到同一个服务器上。
2023-10-18 16:06:35
215
原创 浅谈Spring事务
spring事务机制是spring提供的一种事务管理机制,他是基于Aop和mysql的事务机制来实现的。在spring中管理事务主要是通过AOP和事务拦截器来实现,当Spring应用程序被事务注解标记后,事务拦截器会拦截该方法的调用,并在方法执行前后进行事务管理相关操作。
2023-10-18 15:40:23
142
原创 mysql.mongoDb,neo4j数据库对比
如果你的数据是结构化的,并且需要进行复杂的关系查询,那么MySQL可能是更好的选择。如果你有结构化数据并需要复杂的查询和过滤,MySQL的各种索引类型可能是一个不错的选择。如果你有非结构化数据或图形数据,并需要灵活的查询和关系分析,MongoDB和Neo4j的索引类型可能更适合。WiredTiger:默认的存储引擎,支持复杂的查询和高吞吐量的写入操作,提供了数据压缩和多版本并发控制等功能。InnoDB:默认的存储引擎,支持事务和行级锁定,适用于高并发的读写操作和数据完整性要求较高的场景。
2023-10-09 15:17:08
1186
原创 微服务小结1----Eureka的基本能力与配置及负载均衡
本博客根据黑马程序员微服务课程所作笔记什么是EurekaEureka是一个基于REST (Representational State Transfer)的服务,主要用于AWS云中的服务定位,以实现中间层服务器的负载平衡和故障转移。也就是说Eureka在微服务中是一个服务发现注册的组件为什么需要Eureka通过注册服务,注册发现解决不同微服务之间的远程调用问题远程调用问题消费者如何获取服务者提供的信息如何获取服务者的健康信息是否可用在多个服务者之间如何选择服务Eureka的作用1
2022-04-09 12:00:39
1030
原创 Object与Json(String)对象的互相转换
import com.alibaba.fastjson.JSON;import org.assertj.core.util.Strings;public class ObjectConvertMethods { /** * * @param value 对象 * @param <T> 对象类型 * @return */ public static <T> String ObjectToString(T v.
2022-04-06 12:12:45
1093
原创 Java 学习小记 ---- 反射
反射是通过.class文件获取一个类的信息JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制package edu.uestc.LearnningTest.Reflect;import lombok.Data;import java.lang.reflect.Field;import java.lang.reflect.Invocation
2022-04-05 17:14:40
6269
原创 RabbitMq 报错An unexpected connection driver error occured ....Socket Closed
An unexpected connection driver error occuredjava.net.SocketException: Socket Closed at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.8.0_201] at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[na:1.8.0_201] at java.
2021-12-20 21:47:20
3429
原创 RabbitMq设置可视化界面
安装可视化界面rabbitmq-plugins enable rabbitmq_management阿里云安全组开启端口15672先关闭防火墙再开启防火墙firewall-cmd --zone=public --add-port=15672/tcp --permanentfirewall-cmd --reload在游览器打开界面<你的主机>:15672默认在本地使用可以使用username:guestpassword:guest我们使用guest无法进入管理界面
2021-12-15 21:34:42
2417
原创 centos7安装rabbitMq与 Erlang
本文采坑点记录 rabbitMq 与 Erlang 版本一定 要对应**RabbitMq下载**gitHub 下载RabbitMq (RPM)安装包RabbitMq GitHub入口切记 :查看RabbitMq对应的Erlang对应的版本我这里需要的最小版本为23.2Erlang下载下载地址看清楚一定是Centos7(64-bit)而非arm版本安装工作1 在usr目录下建立一个rabbitmq的文件夹2 将下载的erlang安装包与rabbitmq安装包放
2021-12-15 20:33:01
2344
原创 设计模式概述
该笔记是基于B站李建忠老师讲的设计模式所做面向对象设计原则1.依赖倒置原则(DIP) 高层模块(稳定)不应该依赖低层模块(变化) ,二者都应该依赖于抽象(稳定) 抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)2.开放封闭原则(OCP) 对拓展开放,对更改封闭 类模块应该是可拓展的,但是不可修改3.单一职责原则(SRP) 一个类应该仅有一个引起他变化的原因 变化的方向隐含着类的责任4.李氏替换原则(LSP) 子类必须能够替换他们的基类 继承表达类型抽象
2021-12-11 13:15:35
763
原创 java多线程之锁的应用
锁锁应用于java多线程中的同步机制,我们知道线程安全的问题大部分是由于多个线程并发的访问共享变量或共享数据。于是我们想到将并发访问变为串行访问,既一次只能有一个线程访问共享数据。这就是锁的思想如果你学过操作系统的多线程同步机制的话,相信你会对这部分有更好的理解。在操作系统中,多线程的同步是通过p,v原语,既waite(),signal()来解决线程同步问题,在访问临界区之前,所谓临界区就是p,v原语中间的代码,我们首先要对线程进行资源的申请操作p,访问结束后我们使用v归还资源。java多线程中的锁的
2021-06-11 20:52:24
1479
原创 java 线程三大特性
java 线程三大特性介绍三大特性之前,我们首先要粗略的了解一下什么是线程安全性,因为所谓的三大特性,既原子性,可见性,有序性都是围绕着线程安全开展工作的。线程安全性一般而言,如果一个类在单线程环境下能够正常工作,并且在多线程环境下,在其使用方不必为其做任何改变的情况下也能够正常运行,那么我们就称其是线程安全的,相应的我们称这个类具有线程安全性,反之,如果一个类在单线程环境下运行正常而在多线程环境下无法正常工作,那么这个类就是非线程安全的。一个类如果能够导致竞态,那么他就是非线程安全的,而一个类是线程
2021-06-09 20:58:36
484
原创 二叉排序树的创建与删除
二叉排序树的创建与删除二叉排序树:BST(Binary Sort Tree) 对于二叉排序树的任一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前的值大,如果有相同的值,可以将该节点放在左子节点或右子节点(需要保证左子树的任意节点的值都比右子树任意节点的值小)创建public void addNode(BinaryNode node) { if (node == null) { return; } // 值得比较 if (this.value < no
2020-09-02 22:25:02
194
原创 赫夫曼树
赫夫曼树赫夫曼树是带权路径长度(WPL)最小的树,,这样的树称为最优二叉树,也称为赫夫曼树。路径和路径长度:在一棵树中,从一个节点往下可以达到的孩子或孙子节点之间的通路称为路径,通路之间的分支的数目称为路径长度,从根节点到第L层的路径长度通常为L-1结点的权及带权路径长度:给结点赋一个某种原因的值,这个值称为结点的权,权*路径程度=带权路径长度树的带权路径长度:所有的叶子结点的带权路径长度之和为树的带权路径长度,权值最大的结点离根节点最近的二叉树是最优二叉树wpl最小的树就是赫夫曼树
2020-08-31 14:46:38
598
原创 java顺序存储二叉树
顺序存储二叉树public class 顺序存储二叉树 { public static void main(String[] args) { // TODO 自动生成的方法存根 int[] arr = { 1, 2, 3, 4, 5, 6, 7 }; arrBintree arrtree = new arrBintree(arr); arrtree.preOrder(0); }}class arrBintree { private int[] arr; arrBin
2020-08-22 15:03:01
104
原创 查找算法3 斐波那契查找
斐波那契查找(黄金分割法查找)public class FibSearch { public static int maxSize = 20; public static void main(String[] args) { // TODO 自动生成的方法存根 int[] arr = { 1, 8, 10, 89, 1000, 1234 }; System.out.println("index="+fibSearch(arr,1)); } // mid=mid+F(
2020-08-18 14:53:49
157
原创 查找算法3 插值查找
插值查找public class 插值查找 { public static void main(String[] args) { // TODO 自动生成的方法存根 int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8 }; insertFind(arr, 0, arr.length - 1, 1); } public static void insertFind(int[] arr, int left, int right, int value) { //
2020-08-16 16:46:32
145
原创 查找算法2 二分查找
二分查找二分查找是一种重要的查找思想,它要求查找的序列表是有序的,具体实现如下步骤(假设该示例有序表为从小到大排序)public static void main(String[] args) { // TODO 自动生成的方法存根 int[] arr= {1,5,7,9,16,18,122,187}; int start=0; int end=arr.length; int value=187;
2020-08-16 16:06:22
156
原创 查找算法1 线性查找
线性查找线性查找是最简单的查找算法 具体为逐个比对数据,查找效率较低public static void main(String[] args) { // TODO 自动生成的方法存根 int arr[]= {1,2,3,4,5,6,7,8}; int value=5; int k=0; for(int i=0;i<arr.length;i++) { if(arr[i]==value) { S
2020-08-16 10:40:12
95
原创 java基数排序
java 基数排序基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或binsort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。...
2020-08-15 22:52:51
101
原创 java归并排序
java归并排序归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略,将大问题分治成一些小问题然后递归求解,治将分的阶段得到的答案修补在一起实现分而治之归并排序具体图解如下实例代码public class MergeSorted { public static void main(String[] args) { // TODO 自动生成的方法存根 int[] arr= {8,4,5,7,1,3,6,2}; int temp[]=new i
2020-08-14 20:50:06
157
原创 java 快速排序
java 快速排序快速排序是冒泡排序的一种改进,基本思想是选定一个基准值并将所有要排序的数据分为两部分,其中一部分所有的数据都比另一部分的数据小,在按照方法接着进行排序。这里使用递归public class quickSorted { public static void main(String[] args) { // TODO 自动生成的方法存根 int[] arr= {-45,25,-9,0,4,96,56}; quicksort(arr,0,arr.length-1);
2020-08-13 15:57:52
121
原创 java 希尔排序
java 希尔排序希尔排序:希尔排序是一种插入排序的改进算法,可以解决插入排序在某些情况下效率 低下的问题;基本思想:希尔排序是对无序表按一定的步长进行分组,每组使用直接插入排序算法(或其他排序算法)进行排序,随着步长的直接减少,当步长减为1时,无序表变为有序表组内交换法希尔排序(不建议)import java.util.Arrays;public class shellsorted { public static void main(String[] args) { // T
2020-08-13 14:44:28
917
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人