标签: 后端相关

晚风 | 2024-06-18 | Java后端相关

盘点历届 Java 语言的关键字,一定有你不认识的

在 Java 编程语言中,关键字是具有特殊含义的保留字,它们用于表示语言中的特定功能和操作。 了解和正确使用这些关键字对于编写高效、可靠的 Java 程序至关重要。 今天通过这篇文章,我们一起来了解一下相关的关键字以及含义。 一、关键字汇总 二、访问控制 ✓表示可以访问,x表示不能访问 2.1、private(私有化) private 关键字是访问控制修饰符,可以应用于内部类、方法或类的变量字段。只能在声明 private(内部)类、方法或字段的类中引用这些类、方法或字段。在类的外部或者对于子类而言,它们是不可见的。 2.2、default(缺省) default:关键字是可以应用于类、方法或类的变量字段的访问控制修饰符。当没有指定类的访问权限的时...

 408 |  0 |  0 Java后端相关

晴天 | 2024-06-17 | Spring 全家桶后端相关

一张长图透彻理解SpringBoot 启动原理,架构师必备知识,不为应付面试!

虽然Java程序员大部分工作都是 CRUD ,但是工作中常用的中间件必须和Spring集成,如果不知道Spring的原理,很难理解这些中间件和框架的原理。 一张长图透彻解释 Spring启动顺序 Timeout重构 (2).jpg 测试对Spring启动原理的理解程度 我举个例子,测试一下,你对Spring启动原理的理解程度。 1. Rpc框架和Spring的集成问题。Rpc框架何时注册暴露服务,在哪个Spring扩展点注册呢?init-method 中行不行? 2. MQ 消费组和Spring的集成问题。MQ消费者何时开始消费,在哪个Spring扩展点”注册“自己?init-method 中行不行? 3. SpringBoot 集成Tomcat问题。如果出现已开启Http流量,Spring还未启动完成,怎么办?Tomcat何时开启端口,对外服务? SpringBoot项目常见的流量入口无外乎 Rpc、Http、MQ ...

 399 |  0 |  0 Spring 全家桶后端相关

青木 | 2024-06-17 | Spring 全家桶后端相关

面试官:说说Spring事务传播机制?

Spring 事务传播机制是指,包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。 既然是“事务传播”,所以事务的数量应该在两个或两个以上,Spring 事务传播机制的诞生是为了规定多个事务在传播过程中的行为的。比如方法 A 开启了事务,而在执行过程中又调用了开启事务的 B 方法,那么 B 方法的事务是应该加入到 A 事务当中呢?还是两个事务相互执行互不影响,又或者是将 B 事务嵌套到 A 事务中执行呢?所以这个时候就需要一个机制来规定和约束这两个事务的行为,这就是 Spring 事务传播机制所解决的问题。 Spring 事务传播机制有哪些? Spring 事务传播机制可使用 @Transactional(propagation=Propagation.REQUIRED) 来定义,Spring 事务传播机制的级别包含以下 7 种: 1. Propagation.REQUIRED:默认的事务传播级别,它表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。 2. Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果...

 353 |  0 |  0 Spring 全家桶后端相关

OOM | 2024-06-14 | Spring 全家桶后端相关

用 Arthas 定位 Spring Boot 接口的超时问题,让应用起飞~

背景 公司有个渠道系统,专门对接三方渠道使用,没有什么业务逻辑,主要是转换报文和参数校验之类的工作,起着一个承上启下的作用。 最近在优化接口的响应时间,优化了代码之后,但是时间还是达不到要求;有一个诡异的100ms左右的耗时问题,在接口中打印了请求处理时间后,和调用方的响应时间还有差了100ms左右。比如程序里记录150ms,但是调用方等待时间却为250ms左右。 下面记录下当时详细的定位&解决流程(其实解决很简单,关键在于怎么定位并找到解决问题的方法) 定位过程 分析代码 渠道系统是一个常见的spring-boot web工程,使用了集成的tomcat。分析了代码之后,发现并没有特殊的地方,没有特殊的过滤器或者拦截器,所以初步排除是业务代码问题 分析调用流程 出现这个问题之后,首先确认了下接口的调用流程。由于是内部测试,所以调用流程较少。 Nginx -反向代理  渠道系统 公司是云服务器,网络走的也是云的内网。由于不明确问题的原因,所以用排除法,首先确认服务器网络是否有问题。 先确认发送端到 Nginx Host

 413 |  1 |  0 Spring 全家桶后端相关

iron Man | 2024-06-12 | Spring 全家桶后端相关

网易面试:SpringBoot如何开启虚拟线程?

虚拟线程(Virtual Thread)也称协程或纤程,是一种轻量级的线程实现,与传统的线程以及操作系统级别的线程(也称为平台线程)相比,它的创建开销更小、资源利用率更高,是 Java 并发编程领域的一项重要创新。 PS:虚拟线程正式发布于 Java 长期支持版(Long Term Suort,LTS)Java 21(也就是 JDK 21)。 虚拟线程是一种在 Java 虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此它可以减少上下文切换所带来的性能开销。 操作系统线程、普通线程(Java 线程)和虚拟线程的关系如下: 1.虚拟线程使用 虚拟线程的创建有以下 4 种方式: 1. Thread.startVirtualThread(Runnable task) 2. Thread.ofVirtual().unstarted(Runnable task) 3. Thread.ofVirtual().fa...

 326 |  0 |  0 Spring 全家桶后端相关

花小染 | 2024-06-11 | Redis后端相关

百度面试:如何用Redis实现限流?

高并发系统有三大特征:限流、缓存和熔断,所以限流已经成为当下系统开发中必备的功能了。那么,什么是限流?如何实现限流?使用 Redis 能不能实现限流?接下来我们一起来看。 1.什么是限流? 限流是指在各种应用场景中,通过技术和策略手段对数据流量、请求频率或资源消耗进行有计划的限制,以避免系统负载过高、性能下降甚至崩溃的情况发生。限流的目标在于维护系统的稳定性和可用性,并确保服务质量。 使用限流有以下几个好处: 1. 保护系统稳定性 :过多的并发请求可能导致服务器内存耗尽、CPU 使用率饱和,从而引发系统响应慢、无法正常服务的问题。 2. 防止资源滥用 :确保有限的服务资源被合理公平地分配给所有用户,防止个别用户或恶意程序过度消耗资源。 3. 优化用户体验 :对于网站和应用程序而言,如果任由高并发导致响应速度变慢,会影响所有用户的正常使用体验。 4. 保障安全 :在网络层面,限流有助于防范 DoS/DDoS 攻击,降低系统遭受恶意攻击的风险。 5. 运维成本控制 :合理的限流措施可以帮助企业减少不必要的硬件投入,节省运营成本。 ...

 315 |  0 |  0 Redis后端相关

大牛猫 | 2024-06-10 | Spring 全家桶后端相关

公司禁止在 SpringBoot 中使用 @Autowired 注解,为什么?

前言 Spring 官方已不推荐使用 Autowired 字段/属性注入 bean,一些大公司的新项目也明令禁止使用了。 说明 最近公司升级框架,由原来的 spring framework 3.0 升级到 5.0,然后写代码的时候突然发现 idea 在属性注入的 @Autowired 注解上给出警告提示,就像下面这样的,也是挺懵逼的,毕竟这么写也很多年了。 ❝Field injection is not recommended ❞ 查阅了相关文档了解了一下,原来这个提示是 spring framework 4.0 以后开始出现的,spring 4.0 开始就不推荐使用属性注入,改为推荐构造器注入和 setter 注入。 下面将展示了 spring 框架可以使用的不同类型的依赖注入,以及每种依赖注入的适用情况。 依赖注入的类型 尽管针对 spring framework 5.1.3 的文档只定...

 384 |  0 |  0 Spring 全家桶后端相关

蔡文姬 | 2024-06-10 | 后端相关

如何设计一个秒杀系统?

前言 如何从整体角度,去设计一个秒杀系统。秒杀系统主要有这几个特征: 瞬时间的流量特别高。过了秒杀的时间,流量就会瞬时结束 大批量用户同时请求极少数商品 在秒杀时间前,可能会有很多请求过来。比如在11点抢票开始,10点59分你可能会提前去刷新页面请求。 所以特意写篇文章给大家说说。秒杀系统,应该满足哪些方面: 1. 满足高并发,快速响应 秒杀系统的瞬时流量特别大,为了防止系统被打垮了,一般要 做压测 。测清楚你的系统支撑的最大并发是多少,确定系统的瓶颈点,让自己心里有底,最好预防措施。 压测完要分析整个调用链路,性能可能出现问题是网络层(如带宽)、Nginx层、服务层、还是数据路缓存等中间件等等。 要快速响应,前期还可以做一些优化。比如 页面资源静态化、缓存热数据预加载、 CDN加速 等等。 2. 防止超卖 做秒杀系统,最主要就是防止超卖问题。所以是要 加 分布式锁 ...

 254 |  0 |  0 后端相关

布朗熊 | 2024-06-07 | 后端相关

如何防止线上事故?从一次流水号重复引发的故障说起

最近我负责的系统出了一次生产事故,这次事故竟然是因为流水号重复导致的。今天来给大家分享一下。 1.问题背景 这个流水号的使用场景是上游 系统调用 下游接口时传入一个唯一 ID,流水号这个参数在联调或定位问题时很方便。 我们系统中的流水号是一个 32 位的字符串,为了能让上下游系统联动,下游系统接到上游传过来的这个 ID 后,会取前 23 位,再自己拼接剩下 9 位,传到自己要调用的下游系统,这样整个调用链通过请求 ID 就可以快速串起来。 2.流水号使用 在我的系统中,自己定义流水号的后 9 位,为了能够更清晰地从流水号中看到请求链上的系统调用关系,我们把流水号后 9 位定义成了系统编号(3位) + 子系统编号(2位) + 自增序列(4 位) 。 如下图,我的系统生成的流水号前 23 位来自上游,后 9 位是 001(系统编码) + 01(子系统编码) + (0 9999自增)。 ![图片](https://s...

 263 |  0 |  0 后端相关

渣渣辉 | 2024-06-07 | Java后端相关

Java 泛型编程所说的类型擦除到底是什么?

什么是泛型 在 Java 中,不会泛型,寸步难行。泛型可能是一个 Java 初学者需要攻克的第一个难点。随便跟着一门教程或 任何一本《Java入门到精通》,前面关于变量、关键字、语法(if、while、for等等)这些基本上是一看就懂,而当内容来到泛型的时候,大部分人可能就突然感觉没那么轻松了。 如果没有编程经验的话,可能需要练习一段时间才能完全掌握泛型编程概念和技巧,这么说吧,有些人写了好几年代码,碰到泛型的时候可能还是不太熟练。 说到Java泛型,最明显的标志就是 < 。 泛型是什么呢?通俗的说就是一个类型是没有固定类型的,即可以是Integer 也可以是 Long,还可能是你自定义的类。 “泛型使类型(类和接口)能够在定义类、接口和方法时成为参数。与方法声明中使用的更熟悉的 形式参数 非常相似,类型参数为您提供了一种通过不同输入重复使用相同代码的方法。区别在于形式参数的输入是值,而类型参数的输入是类型。 ” 例如在类定义中使用泛型,最常见的 ArrayList public class ArrayList<E  extends

 287 |  0 |  0 Java后端相关

雨馨 | 2024-06-06 | Java后端相关

Java线程池的实现原理及其在业务中的最佳实践

一、线程池简介 1.什么是线程池? 线程池是一种用于管理和复用线程的机制。 线程池的核心思想是预先创建一定数量的线程,并把它们保存在线程池中,当有任务需要执行时,线程池会从空闲线程中取出一个线程来执行该任务。任务执行完毕后,线程不是被销毁,而是返还给线程池,可以立即或稍后被再次用来执行其他任务。这种机制可以避免因频繁创建和销毁线程而带来的性能开销,同时也能控制同时运行的线程数量,从而提高系统的性能和资源利用率。 线程池的主要组成部分包括工作线程、任务队列、线程管理器等。线程池的设计有助于优化多线程程序的性能和资源利用,同时简化了线程的管理和复用的复杂性。 2.线程池有什么好处? 减少线程创建和销毁的开销,线程的创建和销毁需要消耗系统资源,线程池通过复用线程,避免了对资源的频繁操作,从而提高系统性能; 控制和优化系统资源利用,线程池通过控制线程的数量,可以尽可能地压榨机器性能,提高系统资源利用率; 提高响应速度,线程池可以预先创建线程且通过多线程并发处理任务,提升任务的响应速度及系统的并发性能; 二、Java...

 281 |  0 |  0 Java后端相关

一纸荒年 | 2024-06-06 | 后端相关

如何线程安全的使用 HashMap

这篇文章,我们聊聊线程安全使用 HashMap 的四种技巧。 1 方法内部:每个线程创建单独的 HashMap 如下图,tomcat 接收到到请求后,依次调用控制器 Controller、服务层 Service 、数据库访问层的相关方法。 每次访问服务层方法 serviceMethod 时,都会在方法体内部创建一个单独的 HashMap , 将相关请求参数拷贝到 HashMap 里,然后调用 DAO 方法进行数据库操作。 每个 HTTP 处理线程在服务层方法体内部都有自己的 HashMap 实例,在多线程环境下,不需要对 HashMap 进行任何同步操作。 这也是我们使用最普遍也最安全的的方式,是 CRUD 最基本的操作。 2 配置数据:初始化单线程写,后续只...

 238 |  0 |  0 后端相关

雪千寻 | 2024-06-05 | Java后端相关

中厂Java后端15连问!

前言 最近去面试一个中厂,Java后端。他说,好几道题答不上来,于是我整理了一波答案 1. G1收集器 2. JVM内存划分 3. 对象进入老年代标志 4. 你在项目中用到的是哪种收集器,怎么调优的 5. new对象的内存分布 6. 局部变量的内存分布 7. Synchronized和Lock的区别 8. Synchronized原理 9. 可重入是如何知道当前锁的拥有着的 10. Spring用到的设计模式 11. 说说SPI 12. 排行榜怎么设计 13. SpringBoot 中注解实现缓存用过没?实现原理是什么。 14. 深分页优化 15. Redis分布式锁如何进一步提升性能 1. 说说G1收集器 G1(Garbage-First)收集器是 Java 虚拟机中的一种垃圾收集器。它于 JDK 7 中首次引入,并在后续版本中不断改进优化。 可以使用 -XX:+UseG1GC 开启它。这个选项告诉 JVM 在运行时使用 G1 垃圾收集器来管理堆内存。 G1(Garbage-First)收集器的核心原则之一就是 “首先收集尽可能多的垃圾” ,即优...

 245 |  0 |  0 Java后端相关

晴天 | 2024-06-04 | Redis后端相关

Redis Pipelining 底层原理分析及实践

Redis是一种基于客户端-服务端模型以及请求/响应的TCP服务。在遇到批处理命令执行时,Redis提供了Pipelining(管道)来提升批处理性能。本文结合实践分析了Spring Boot框架下Redis的Lettuce客户端和Redisson客户端对Pipeline特性的支持原理,并针对实践过程中遇到的问题进行了分析,可以帮助开发者了解不同客户端对Pipeline支持原理及避免实际使用中出现问题。 一、前言 Redis 已经提供了像 mget 、mset 这种批量的命令,但是某些操作根本就不支持或没有批量的操作,从而与 Redis 高性能背道而驰。为此, Redis基于管道机制,提供Redis Pipeline新特性。Redis Pipeline是一种通过一次性发送多条命令并在执行完后一次性将结果返回,从而减少客户端与redis的通信次数来实现降低往返延时时间提升操作性能的技术。目前,Redis Pipeline是被很多个版本的Redis 客户端所支持的。 二、Pipeline 底层原理分析 2.1 Redis单个命令执行基本步骤 Redis是一种...

 211 |  0 |  0 Redis后端相关