- 博客(31)
- 收藏
- 关注
原创 Java动态代理
在Java中,在动态代理(Dynamic Proxy)的实现中,主要使用了java.lang.reflect包下的Proxy类和接口。通过动态代理,我们可以在运行时创建接口的代理实例,并对接口方法的调用进行拦截和自定义处理。
2025-03-20 16:46:38
351
原创 Mysql 函数解析
一般形式为:列名 [NOT ] LIKE ‘%关键字%’like '%北京%'列名包括北京的字样like ‘北京%’ 列名北京开头like ‘%北京’ 列名北京结尾。
2025-02-10 16:07:13
236
原创 springboot四大核心组件
autoconfigure内容是配置Bean实例到Spring容器的实际代码实现包,然后提供给starter依赖。配置Bean实例到Spring容器中实际是autoconfigure做的,因为是starter依赖它,所以也可以说是starter干的。autoconfigure在我们的开发中并不会被感知,因为它是存在与我们的starter中的。官方提供的starter是这样的:spring-boot-starter-xxx。非官方的starter是这样的:xxx-spring-boot-starter。
2025-01-06 15:14:44
1078
原创 JAVA反射
Java是先编译再运行的语言,程序中对象的类型在编译期就确定下来了;而当程序在运行时需要动态加载某些类时(这些类因为之前用不到没有被加载到JVM),通过反射可以在运行时动态地创建对象并调用其属性,我们不需要提前在编译期知道运行的对象是谁。Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。Java反射机制的本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取t对象的各种信息。java反射详解。
2025-01-03 14:48:22
801
原创 分布式事务
2PC/3PC:依赖于数据库,能够很好的提供强一致性和强事务性,但延迟比较高,比较适合传统的单体应用,在同一个方法中存在跨库操作的情况,不适合高并发和高性能要求的场景。TCC:适用于执行时间确定且较短,实时性要求高,对数据一致性要求高,比如互联网金融企业最核心的三个服务:交易、支付、账务。本地消息表/MQ 事务:适用于事务中参与方支持操作幂等,对一致性要求不高,业务上能容忍数据不一致到一个人工检查周期,事务涉及的参与方、参与环节较少,业务上有对账/校验系统兜底。
2024-12-25 11:11:56
1321
原创 MySQL性能优化
MySQL性能优化是一个综合性的过程,涉及多个方面,以下是对MySQL性能优化的详细解析:对于高并发应用,应适当增加 max_connections 的值,以支持更多的并发连接。同时,thread_cache_size 的调整可以减少线程的创建和销毁开销,从而提升性能。如下sql可查询数据库的最大连接数。wait_timeout:设置连接超时时间,当一个连接在指定时间内没有活动时,将被自动关闭。及时释放不活动的连接,系统默认的客户端超时时间是28800秒(8小时),我们可以把这个值调小一点系统中难
2024-12-19 14:27:47
989
原创 Redis经典面试题
为了解决只有加锁的线程才能进行相应的解锁操作的问题,那么,我们就需要将加锁和解锁操作绑定到同一个线程中,可以使用ThreadLocal来解决这个问题 , 加锁的时候生成唯一标识保存到ThreadLocal , 并且设置到锁的值中 , 释放锁的时候, 判断线程中的唯一标识和锁的唯一标识是否相同, 只有相同才会释放。早期我们在进行定时任务的时候我们采用的是SpringTask实现的 , 在集群部署的情况下, 多个节点的定时任务会同时执行 , 造成重复调度 , 影响运算结果, 浪费系统资源。
2024-12-12 17:29:32
747
原创 事务隔离级别
什么是事务?所谓事务是用户定义的一个数据库序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。COMMIT:表示提交,即提交事务的所有操作ROLLBACK:表示回滚事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。
2024-12-11 17:22:02
819
原创 乐观锁和悲观锁
MySQL 的锁可以分成三类:总体、类型、粒度。总体上分成两种:乐观锁和悲观锁数据库管理上分成两种:读锁(共享锁或者S锁(Shared Lock))和写锁(排他锁或者X锁(Exclusive Lock))锁的粒度上可以分成五种:表锁,行锁,页锁,间隙锁,临键锁。
2024-12-11 14:18:28
2051
原创 Nacos注册中心的心跳机制
和客户端心跳一样,服务端的健康检查也是一个Runable,收到心跳信息将健康状态设置为true,同时发送各种事件。所谓的心跳也很好理解,就是心脏的跳动。在技术中心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。首先,Nacos中的节点分为短暂节点和持久化节点,短暂节点需要定时发送心跳包给Nacos,如果一段时间收不到心跳则会被踢出。
2024-12-10 14:16:43
677
原创 常见的几种注册中心
大家可以通过一张图先来了解下。多数据中心:Consul 和 Nacos 都支持,其他的产品则需要额外的开发工作来实现。KV 存储服务:除了 Eureka,其他几款都能够对外支持 k-v 的存储服务,所以后面会讲到这几款产品追求高一致性的重要原因。而提供存储服务,也能够较好的转化为动态配置服务哦。CAP 理论的取舍Eureka 是典型的 AP,Nacos可以配置为 AP,作为分布式场景下的服务发现的产品较为合适,服务发现场景的可用性优先级较高,一致性并不是特别致命。
2024-12-10 10:59:09
984
原创 CountDownLatch、Semaphore和Cyclicbarrier
countDownLatch是在JAVA1.5被引入,跟它一起被引入的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue,存在于java.util.cucurrent包下。都可以作用同步手段来实现多线程之间的同步效果。CyclicBarrier,直译为“循环栅栏”,是 Java 并发编程中的一种同步工具。CyclicBarrier 之所以被称为“循环”栅栏,是因为它具有循环使用的特性。
2024-12-05 18:26:00
679
原创 线程池的创建方式
关于创建线程池有一点是肯定的,线程池肯定是不是越大越好。通常我们是需要根据这批任务执行的性质来确定的。IO 密集型任务:由于线程并不是一直在运行,尽可能的多配置线程,比如CPU个数 * 2CPU 密集型任务(复杂的运算)应当分配较少的线程,比如 CPU 个数相当的大小。当然这些都是经验值,最好的方式还是根据实际情况测试得出最佳配置。经过以上的学习我们对整个线程池也有了一定的认识了,那究竟该如何选择线程池呢?
2024-11-29 16:04:42
916
原创 线程池相关要点
线程池(ThreadPool)是一种用于管理和复制线程的机制。在项目启动时预先创建一定数量的线程,将这些线程放入池子里,并对其进行有效的使用和管理;在执行任务时,从线程池中取一个线程来执行任务,使用完毕后不会销毁而是重现放入线程池留待后用。
2024-11-28 15:51:29
580
原创 ArraList和LinkedList区别
LinkedList:它基于双向链表。每个元素(我们叫它节点)不仅存储数据,还存储了指向前后元素的两个指针。ArrayList:它基于动态数组。这意味着它需要一段连续的内存来存储数据📦,而不是像LinkedList那样通过指针相互连接。每个元素都通过索引快速访问如下图所示:LinkedList:因为数据是通过链表存储的,要访问某个特定位置的元素,你需要从头(或尾)开始,逐个走过每个节点才能找到目标。这个过程就像翻找一个很长的链子,一环一环地往下走,所以速度会很慢。源码:ArrayList:因为数组是连
2024-11-26 15:44:20
899
原创 Netty
Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序。Netty 是一个基于 NIO 的网络编程框架,使用Netty 可以帮助你快速、简单的开发出一 个网络应用,相当于简化和流程化了 NIO 的开发过程。
2024-11-12 14:51:18
778
原创 BIO和NIO
简述BIO和NIO的原理和应用。提示:以下是本篇文章正文内容,下面案例可供参考最后用一个例子进行总结,在一节课堂中,服务端比作收作业的老师,客户端比作交作业的同学BIO: 老师先收A同学的作业,再去收B,C同学的作业,如果A同学一直做不完就不会去收B,C老师的试卷,虽然可以加几个老师去同时收作业,但是这样开销肯定会变大NIO: 老师这个时候不会因为A同学作业写不完而阻塞,而是继续去收一下同学的作业select/poll: 同学写完作业会举手,但是老师不知道是谁举的手,于是就把所有的同学轮询一遍。
2024-11-12 14:20:35
803
原创 kafka
自动提交情况:当消费者拉取一批消息进行消费后,需要进行Offset的提交,在消费端提交Offset之前,Consumer挂掉了,当Consumer重启后再次拉取Offset,这时候拉取的依然是挂掉之前消费的Offset,因此造成重复消费的问题。因此,我们完全可以在标记之前进行数据的处理,例如插入Mysql等,当出现插入成功后程序崩溃,下一次最多重复消费一次(因为还没标记,Offset没有提交),而不会因为Offset超前,导致应用层消息丢失了。因为消息的消费并不会影响到Offset的提交。
2024-11-04 14:17:34
797
2
原创 Java Long类型对比
在开发的到一个很基础的问题在代码中,两个Long类型数据比较用“==”,结果有时候true有时候false,让我们来一探究竟。
2024-04-17 16:55:28
1332
原创 Java中类的初始化顺序
在日常使用Java的时候,我们都接触过new这个关键字,那你是否知道在我们的对象真正创建出来之前都做了哪些事情呢?实际上要去判断一个类的初始化的顺序,需要分一下情况,一种是没有继承关系的类(不考虑Object类),一种是有继承关系的类。大家可以手动执行下代码做分析,如果疑惑可评论区讨论。
2024-04-17 15:08:33
322
原创 spring cache 详解
伴随信息量的爆炸式增长以及构建的应用系统越来越多样化、复杂化,特别是企业级应用互联网化的趋势,缓存(Cache)对应用程序性能的优化变的越来越重要。将所需服务请求的数据放在缓存中,既可以提高应用程序的访问效率,又可以减少数据库服务器的压力,从而让用户获得更好的用户体验。定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术,并支持使用 JCache(JSR-107)注解简化我们开发。
2024-04-15 15:53:35
3930
1
原创 Java正则表达式
正则表达式(Regular Expression)又称正规表示法、常规表示法,在代码中常简写为 regex、regexp 或 RE。正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作,是一种可以用于模式匹配和替换的规范。一个正则表达式就是由普通的字符(如字符 a~z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串。String 类里也提供了如下几个特殊的方法。
2024-02-21 18:34:59
1501
1
原创 java日志脱敏
在开发中,我们经常会处理一些敏感数据,比如:身份证号、手机号、银行卡、邮箱等等。为了保护用户的数据安全,我们需要对这些数据进行脱敏处理。JAVA提供了一些工具,可以让我们更加便捷的去处理。@Retention(RetentionPolicy.RUNTIME):运行时生效。@Target(ElementType.FIELD):可用在字段上。@JacksonAnnotationsInside:此注解可以点进去看一下是一个元注解,主要是用户打包其他注解一起使用。
2024-02-20 17:44:58
2430
1
原创 Java创建线程的几种方法
优势是:编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。劣势是:线程类已经继承了Thread类,所以不能再继承其他父类。
2024-01-26 18:27:57
1287
原创 HTTP报错状态码详解
HTTP 404或Not Found错误消息是HTTP的其中一种“标准回应消息”(HTTP状态码),此消息代表客户端在浏览网页时,服务器无法正常提供消息,或是服务器无法回应且不知原因。这通常并不意味着上游服务器已关闭(无响应网关/代理) ,而是上游服务器和网关/代理使用不一致的协议交换数据。4、应用程序池启用了CPU监视,并且设置了CPU利用率超过一定百分比关闭应用程序池,而开发人员写的服务端页面(.asp,.aspx)执行效率不高,会引起CPU的长时间占用,最终达到设置的百分比,从而引起应用程序池关闭。
2023-12-15 14:51:58
1405
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人