自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

0

  • 博客(243)
  • 收藏
  • 关注

原创 Spring AOP基础、快速入门(Spring的设计思想之一)

AOP,面向切面编程,作为面向对象的一种补充,将公共逻辑(事务管理、日志、缓存、权限控制、限流等)封装成切面,跟业务代码进行分离,可以减少系统的重复代码和降低模块之间的耦合度。切面就是那些与业务无关,但所有业务模块都会调用的公共逻辑。

2024-12-15 12:37:59 700

原创 手写一个单例模式

一个私有构造函数 (确保只能单例类自己创建实例)一个私有静态变量 (确保只有一个实例)一个公有静态函数 (给使用者提供调用方法)简单来说就是,单例类的构造方法不让其他人修改和使用;并且单例类自己只创建一个实例,这个实例,其他人也无法修改和直接使用;然后单例类提供一个调用方法,想用这个实例,只能调用。这样就确保了全局只创建了一次实例。

2024-11-21 09:45:00 684

原创 数据库锁升级问题

在 MySQL 的 InnoDB 存储引擎中,锁升级是指将行锁升级为表锁的过程。这种情况通常会影响数据库的并发性能,降低系统的效率。锁升级的主要原因包括索引的使用情况和查询的范围。

2024-11-20 11:07:21 362

原创 保证线程安全的处理策列

weakCompareAndSetInt中会再次通过偏移量offset从对象o中获取字段的当前值,如果这期间字段值被其他线程修改,那么此时获取到的当前值就不等于期望值,就不会执行更新操作,只有确保在修改字段值之前,字段的当前值与预期值依然相等,才能执行更新操作,从而确保了原子操作的安全性。1、单独操作:上述我们的demo中,出现了两个线程A、B,它们分别调用get()、put()方法,虽然看起来像是在组合操作,但实际上对于单个线程而言,这是单独操作,是线程安全的。线程3这不就获取了错误的数据?

2024-11-11 10:00:00 756

原创 Redis如何保证数据不丢失(可靠性)

Redis 保证数据不丢失的主要手段有两个:持久化和集群运行。其中持久化有三种实现:RDB、AOF、混合持久化;而集群(运行)也包含了三种实现:主从复制、哨兵模式和 Redis Cluster。

2024-11-10 11:15:34 1328

原创 聚簇索引和非聚簇索引

很简单记住一句话:找到了索引就找到了需要的数据,那么这个索引就是聚簇索引,所以主键就是聚簇索引,修改聚簇索引其实就是修改主键。(索引就是我们要找的数据)索引的存储和数据的存储是分离的,也就是说找到了索引但没找到数据,需要根据索引上的值(主键)再次回表查询,非聚簇索引也叫做辅助索引。(找到了索引还要根据索引查询数)

2024-10-29 09:00:00 253

原创 什么是索引覆盖,索引下推,回表

它发生在使用非聚集索引(Secondary Index)进行查询时,索引中只包含了索引列的副本以及指向对应主键的引用。当一个查询的所有数据需求都可以通过索引中的数据来满足时,就发生了索引覆盖。的一个关键要求是查询中的所有列都必须在索引中。如果查询引用了索引中没有的列,那么就无法实现索引覆盖。这意味着查询涉及的所有列都包含在索引中,从而避免了第二次查询。在设计索引时,应该考虑查询模式,以便最大限度地利用索引覆盖和索引下推的优势。列有一个普通索引,查询会首先使用这个索引。在MySQL中,如果有一个表,其中。

2024-10-29 03:00:00 937

原创 @Autowried privite static User user的输出结果是什么

在控制台上的输出结果是 Null

2024-10-28 09:45:00 1425

原创 线上问题排查-线程池异常

Java 线程池以有界队列的线程池为例,当新任务提交时,如果运行的线程少于 corePoolSize,则创建新线程来处理请求。如果正在运行的线程数等于 corePoolSize 时,则新任务被添加到队列中,直到队列满。当队列满了后,会继续开辟新线程来处理任务,但不超过 maximumPoolSize。当任务队列满了并且已开辟了最大线程数,此时又来了新任务,ThreadPoolExecutor 会拒绝服务。

2024-10-27 20:42:16 230

原创 线程本地变量-ThreadLocal

ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

2024-10-25 13:13:14 1024

原创 再通过for循环遍历list集合时,怎么删除list集合中的元素

在Java中,如果你尝试在一个迭代过程中直接修改正在迭代的集合(如使用remove),可能会遇到ConcurrentModificationException异常。这是因为迭代器检测到了集合的结构性修改(比如添加或删除元素)。

2024-10-25 12:54:59 554

原创 线上问题排查-频繁GC

一个常常被讨论的问题(惯性思维)是在生产环境中GC日志是否应该开启。因为它所产生的开销通常都非常有限,因此我的答案是需要。你也可以从full GC 的效果来推断问题,正常情况下,一次full GC应该会回收大量内存,所以。获取到gc日志之后,可以上传到GC easy帮助分析,得到可视化的图表分析结果。接前面的内容,这个情况下,我们自然而然想到去查看gc 的具体情况。至于内存分析之后的步骤,就需要小伙伴们根据具体问题具体分析啦。在了解下面内容之前,请先花点时间回顾一下GC的整个流程。

2024-10-24 20:39:03 521

原创 线上问题排查解决思路-CPU 利用率高/飙升

不管处于应急的哪个阶段,我们首先必须想到的是恢复问题,恢复问题不一定能够定位问题,也不一定有完美的解决方案,也许是通过经验判断,也许是预设开关等,但都可能让我们达到快速恢复的目的,然后。在大多数情况下,我们都是先优先恢复服务,保留下当时的异常信息(内存dump、线程dump、gc log等等,在紧急情况下甚至可以不用保留,等到事后去复现),等到服务正常,再去复盘问题。这里为了演示,用一个最简单的死循环来模拟CPU飙升的场景,下面是模拟代码,通过第一步,找出有问题的代码之后,观察到线程栈之后。

2024-10-24 14:59:29 729

原创 RabbitMQ如何防止消息丢失及重复消费

解释:RabbitMQ可以开启 confirm 模式,在生产者那里设置开启 confirm 模式之后,生产者每次写的消息都会分配一个唯一的 id,如果消息成功写入 RabbitMQ 中,RabbitMQ 会给生产者回传一个 ack 消息,告诉你说这个消息 ok 了。消息丢失之后的处理:消息自动重新入队。confirm机制是异步的,生成者发送完一个消息之后,不需要等待RabbitMQ的回调,就可以发送下一个消息,当RabbitMQ成功接收到消息之后会自动异步的回调生产者的一个接口返回成功与否的消息。

2024-10-24 09:15:00 1547

原创 Spring中的循环依赖

1.Spring首先从一级缓存singletonObjects中获取。2.如果获取不到,并且对象正在创建中,就再从二级缓存earlySingletonObjects中获取。3.如果还是获取不到且允许singletonFactories通过getObject()获取,就从三级缓存singletonFactory.getObject()(三级缓存)获取.4.如果从三级缓存中获取到就从singletonFactories中移除,并放入earlySingletonObjects中。其实也就是从三级缓存移

2024-10-23 11:43:25 1000

原创 插入数据时遇到主键重复问题怎么办?——insert into数据库技巧 (insert into主键重复数据库)

在使用数据库时,主键的作用非常重要,它可以确保数据的唯一性,避免重复插入数据。针对这种情况,我们可以采取忽略重复行、更新重复行、指定插入某些数据等处理方式,有效避免主键重复的问题。另外,在设计数据库表时,应该合理设计主键,并为需要唯一性约束的字段添加唯一索引,以及将主键设置成自增长,这样可以有效地避免主键重复的问题。但是在插入数据的过程中,有时候会遇到主键重复的问题,当这种情况发生时,该怎么处理呢?当我们执行插入数据的操作时,如果插入的数据的主键已经在表中存在,就会出现主键重复的情况。

2024-10-22 21:51:13 1997

原创 线上问题排查-常见的线上问题

明确问题:首先,需要明确线上出现了什么问题。这包括了解问题的具体表现、发生的时间、影响的范围等。通过收集用户反馈、查看监控系统告警等方式,收集问题相关信息。收集信息:收集与问题相关的各种信息,如日志、指标、用户反馈等。这些信息是排查问题的关键,可以帮助我们了解问题的来龙去脉。分析问题:根据收集到的信息,对问题进行深入分析。这包括分析日志、指标等数据,找出异常点,进一步定位问题原因。解决问题:在定位问题原因后,采取相应的解决措施。这可能涉及到修改代码、调整配置、优化系统架构等。

2024-10-22 12:27:08 1215 2

原创 MySQL的多列索引问题:最左匹配原则

最左匹配原则是数据库索引设计中的一个重要概念,尤其是在使用MySQL数据库时。这个原则指出,在创建多列索引时,索引会从最左边的列开始匹配,直到遇到范围查询(如>、

2024-10-22 12:02:03 656

原创 在Spring中,什么是配置类

配置类是用来配置 Spring 应用程序上下文的 Java 类。它通过使用特定的注解和方法,为应用程序提供各种配置信息,使得 Spring 容器能够正确地初始化和管理应用程序的各个组件。

2024-10-21 12:03:30 415

原创 @Component 和 @Bean 的区别与联系

@Component 和 它的子类型(@Controller, @Service and @Repository)注释在类上。告诉Spring,我是一个bean,通过类路径扫描自动检测并注入到Spring容器中。@Bean不能注释在类上,只能用于在配置类(@Configuration)中显式声明单个bean。意思就是,我要获取这个bean的时候,spring要按照这种方式去获取这个bean。默认情况下@Bean注释的方法名作为对象的名字,也可以用name属性定义对象的名字。

2024-10-21 11:56:41 270

原创 Gateway服务网关

传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调用的微服务数量很多时,它需要了解每个服务的接口,这个工作量很大。那有了网关之后,能够起到怎样的改善呢?网关作为系统的唯一流量入口,封装内部系统的架构,所有请求都先经过网关,由网关将请求路由到合适的微服务,所以,使用网关的好处有:(1)简化客户端的工作。网关将微服务封装起来后,客户端只需同网关交互,而不必调用各个不同服务;(2)降低函数间的耦

2024-10-19 17:47:37 360

原创 Nacos(一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台)的服务注册与服务发现的原理

Nacos的功能官方用一句话来进行了说明:“一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。”也就是说Nacos不仅提供了服务注册与发现功能,还提供了配置管理的功能,同时还提供了可视化的管理平台。

2024-10-19 17:36:04 788

原创 面试题:分布式事务,你了解多少?来谈谈2PC、TCC、可靠消息、最大努力通知

在条件允许的情况下,我们尽可能选择本地事务单数据源,因为它减少了网络交互带来的性能损耗,且避免了数据弱一致性带来的种种问题。若某系统频繁且不合理的使用分布式事务,应首先从整体设计角度观察服务的拆分是否 合理,是否高内聚低耦合?是否粒度太小?分布式事务一直是业界难题,因为网络的不确定性,而且我们习惯于拿分布式事务与单机事务 ACID 做对比。无论是数据库层的 XA、还是应用层 TCC、可靠消息、最大努力通知等方案,都没有完美解决分布式事务问题,它们不过是各自在性能、一致性、可用性等方面做取舍,寻求某些场景

2024-10-18 15:19:17 1310

原创 面试题:MySQL为什么一定要有一个主键

有主键查询速度会更快。如果没有主键,那么这些表就会依赖一个全局序列计数器生成的ROW_ID来构造一个隐式的聚簇索引,就会导致竞争引起性能问题。没有主键,更新或删除表中特定行会很困难。

2024-10-18 10:21:10 738

原创 MySQL中的binlog redolog和undolog的区别和作用

MySQL中的Redo Log(重做日志)、Undo Log(撤销日志)和Binlog(二进制日志)是三种不同的日志类型,它们在数据库中扮演不同的角色和功能。

2024-10-17 08:17:16 921 1

原创 K8S中的pod和node的区别

每个容器的文件系统与其他容器是隔离的。容器内的存储层是跟随容器变化的,生命周期同容器保持一致。进入pod后,正常的linux命令可以使用,若pod内包含多个容器,进入到每个容器都相当于进入了一个逻辑主机。容器将代码和依赖关系打包在一起,可以多个容器同时运行在同一台机器上,并与其他容器共享操作系统内核。pod是k8s调度的最小单元。1个pod可以包含1个或多个容器,可以理解为pod是容器集合。每个容器执行的相关配置,比如容器的镜像版本或者是需要使用的特定端口。容器就是镜像运行时的实体,镜像是类,容器是实例。

2024-10-17 08:12:23 612

原创 Spring事务的底层原理

事务其实是一个并发控制单位,是用户定义的一个操作序列,这些操作要么全部完成,要不全部不完成,是一个不可分割的工作单位

2024-10-03 18:49:09 1385 1

原创 JAVA基础-线程(Thread)、多线程(Multi-threaded)

线程是进程中的⼀个执⾏单元,负责当前进程中程序的执⾏,⼀个进程中⾄少有⼀个线程。⼀个进程中是可以有多个线程的,这个应⽤程序也可以称之为多线程程序。

2024-10-03 11:24:29 1398

原创 JAVA的三大特性-封装、继承、多态

Java作为一种面向对象的编程语言,其核心特性包括封装、继承和多态。这三大特性是Java语言的基石,它们相互关联,共同构成了Java强大的面向对象能力。

2024-10-03 10:29:58 426

原创 HashMap、HashTable与ConcurrentHashMap的区别与联系

是基于哈希表的 Map 接口实现,它存储的内容是键值对(key-value)。HashMap 的底层实现原理涉及数组、链表和红黑树的结合使用。

2024-09-29 20:28:48 731

原创 windows 查看端口占用情况的命令

结束该进程(上面查看pid对应进程是什么下面就杀死什么)查看所有的端口占用情况。查看指定端口的占用情况。查看PID对应的进程。

2024-09-26 13:48:51 258

原创 ORM框架:Mybatis与Hibernate

因为MyBatis具有相对轻量级,封装少,映射多样化、支持存储过程、可以进行SQL语句优化等特点,符合互联网高并发、大数据、高性能、高响应的要求,使它取代了Hibernate成为了Java互联网中首选的持久框架。学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate需要开发者的经验和能力都很强才行。同样功能的两条sql语句的性能可能相差十几倍到几十倍,在高并发、快响应要求下的互联网系统中,手写SQL更合适.,可以更加精确的定义SQL。

2024-08-27 10:17:38 1023

原创 分布式设计原理——CAP原则

总的来说,BASE理论面向的是大型高可用可扩展的分布式系统,和传统事务的ACID特性使相反的,它完全不同于ACID的强一致性模型,而是提出通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。对复杂的SQL查询,特别是多表关联查询的需求 —— 任何大数据量的web系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的报表查询,特别是SNS类型的网站,从需求以及产品设计角 度,就避免了这种情况的产生。与此同时,与进程A无因果关系的进程C的数据访问则没有这样的限制。

2024-08-27 10:17:10 1348 1

原创 非关系型数据库MongoDB(文档型数据库)介绍与使用实例

MongoDB是一种开源的数据库管理系统,它使用类似于JSON的BSON格式(Binary JSON)来存储数据。与传统关系型数据库不同,MongoDB不使用表和行的结构,而是采用集合(Collection)()和文档(Document)(的概念来组织数据。1. 强大的灵活性:MongoDB的文档模型允许存储的数据,使用者可以轻松地添加、修改和删除字段,而无需进行复杂的模式迁移。2. 高性能:MongoDB支持水平扩展,可以实现高并发和大规模的数据处理。

2024-08-19 11:16:05 1534

原创 @RequestBody、 @RequestParam 、 @PathVariable 和 @Vaild 注解的使用及区别

RequestParam 和 @PathVariable 注解是用于从 request 中接收请求的,两个都可以接收参数,关键点不同的是 @RequestParam 是从 request 里面拿取值,而 @PathVariable 是从一个 url 模板里面来填充。注:如果参数前写了 @RequestParam(xxx),那么前端必须有对应的 xxx 名字才行 (不管其是否有值,当然可以通过设置该注解的 required 属性来调节是否必须传) 如果没有 xxx 名的话,那么请求会出错,报400。

2024-08-19 11:14:37 1602

原创 容器编排引擎kubernetes(k8s)

kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。Kubernetes是Google开源的一个容器编排引擎,它支持、大规模、应用。在生产环境中部署一个应用程序,通常要部署该应用的多个实例以便对应用请求进行。是业界最受欢迎的。

2024-08-17 15:22:17 465

原创 对Spring的两个核心思想IOC和AOP的简单认识

它的主要思想是将应用程序的业务逻辑和横切关注点(如日志、事务、安全等)分离开来,从而提高代码的可维护性和可重用性。5. 模块化开发:通过 IOC 容器组织业务模块,可以实现业务逻辑的模块化开发,提高代码的可重用性和可维护性。4. 生命周期管理:通过IOC容器管理对象的生命周期,从而实现了对象的初始化、销毁等生命周期的自动化管理。2. 配置管理:通过IOC容器将配置文件中的参数注入到应用程序中,从而实现了配置和代码的分离。2. 性能监控:通过AOP框架定义性能切面,从而实现了对程序中所有方法的性能监控功能。

2024-08-17 15:11:54 290

原创 linux更换为阿里云的yum下载镜像源

3.往CentOS-Base.repo添加内容。

2024-08-17 11:32:49 1660

原创 MySQL集群实现方式之主从异步复制

是MySQL的原生功能,这也是最简单最有效的方式,既然单点MySQL扛不住,那多来几台不就完事了,主从复制说的就是这种方案,如下图,一主两从,主接收写请求后同步给从,这种方案天生就是读写分离的。随着公司业务的发展,对数据库的要求越来越高,以前的单机MySQL肯定是玩不转了,亟需升级成MySQL集群,这是一个公司在业务发展时不得不面临的问题。的,Master只需要写入Binary Log就不管了,不用等待Slave的确认。不难看出,这种方式天生就是。

2024-08-16 16:13:15 479

原创 数据库行转列

1、使用case…when…then2、使用SUM(IF()) 生成列3、使用SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行4、使用SUM(IF()) 生成列,直接生成汇总结果,不再利用子查询5、使用SUM(IF()) 生成列 + UNION 生成汇总行,并利用 IFNULL将汇总行标题显示为 Total6、动态查询列值不确定的情况7、合并字段显示:group_concat()

2024-08-16 10:08:32 1360

基于三层框架的JavaWeb项目实现登录验证,并对表数据进行增,删,改,查

三层架构就是把整个软件的代码分为三个层次,分层的目的是:规范代码,大型软件需要团队配合的时候问题就来了,由于每个程序员风格不一样,而开发软件大量的代码风格不统一就会造成后期调试和维护出现问题,然而软件分层后,每个层合理分工这样的问题便迎刃而解。 本教程是一个0基础创建一个基于三层架构的JavaWeb项目,从创建项目到实现对数据库表数据进行增删改查操作。本教程侧重于培养编程习惯,详细讲解了三层架构的编写顺序,讲解了如何快速编写一整个,从头至尾的详细反复练习琢磨。通过快捷键来演示三层架构之间的关系。

2024-01-02

志愿者活动管理系统的设计与实现

用户: user 密码: 123456; 管理员: admin 密码: 123456; 环境: IntelliJ IDEA 2021.3; Mysql 5.7.26; Tomcat 7.0.73; JDK 1.8;

2023-12-15

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

TA关注的人

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