- 博客(105)
- 收藏
- 关注
原创 基于Prometheus的监控系统设计
如果你想修改告警内容,直接修改 alertmanager.yaml 文件并更新 Secret。创建alertmanager.yaml。
2025-03-25 16:36:24
360
原创 Spring面试题——第六篇(核心注解)
默认情况下,Spring会使用方法参数作为缓存的键,可以通过key属性自定义缓存键。在这个例子中,key=“#id” 表示使用id作为缓存键。
2024-10-25 10:20:13
908
原创 Spring面试题——第五篇
拦截器用于在请求处理流程的不同阶段拦截HTTP请求和响应,并对其进行预处理或者后处理,拦截器可以用于实现注入权限验证、日志记录、性能监控等功能,而无需将这些逻辑直接耦合在控制器代码中。定义一个拦截器的步骤实现HandlerInterceptor接口:自定义的拦截器需要实现HandlerInterceptor接口,并且重写其三个核心方法preHandle(): 请求到达控制器之前的预处理postHandle():控制器执行之后但视图渲染之前的后处理。
2024-10-24 15:34:35
804
原创 Spring面试题——第四篇
他是Spring中基于经典的MVC模式来开发Web应用的模块,SpringMVC将请求处理流程分为三层:模型层(Model)、视图层(View)、和控制层,提供了一种松耦合的方式将用户请求、业务逻辑和视图渲染分离开来。Spring MVC基于Servlet API构建,可以说核心就是 DispatcherServlet,即前端控制器。他通过注解、配置等方式,将HTTP请求映射到控制器方法,然后由控制器处理请求逻辑并将数据返回给视图层进行渲染。Spring MVC工作流程。
2024-10-23 14:58:40
1066
原创 面经汇总——第一篇
在许多现代应用中,两者也常常结合使用,例如,使用HTTP作为传输协议的gRPC,这样既利用了HTTP的广泛支持,也优化了远程调用的效率。然而, 从17开始,ZGC添加了分代收集的特性,这意味着ZGC开始支持对年轻代和老年代的不同处理,可以更高效的管理Java堆,特别是对那些对象生命周期差异大的应用程序。Java针对int类型的优化体现在多个层面:缓存机制减少小对象分配,寄存器分配加快访问速度,逃逸分析减少堆内存的使用,这些优化共同作用,使得int类型的运算在Java中既高效又节省内存。
2024-10-21 20:55:23
1167
原创 Spring面试题——第三篇
Spring IOC是Spring框架的核心概念之一,它是通过 依赖注入实现的。IOC让对象的创建和管理由容器负责,而不是对象自身控制。核心思想:控制反转意味着将对象的创建和依赖关系交由Spring容器管理,这种机制使得程序更加灵活和解耦。依赖注入:通过构造器注入、setter注入或者接口注入,将对象所需的依赖传递给他,而不是让对象自行创建依赖。理解控制和反转IOC,控制反转,控制指的是控制对象的创建。
2024-10-16 13:25:55
758
原创 Redis面试题——第四篇
常见命令lpush:将一个或者多个值插入到列表头部,列表不存在,一个新的列表会被创建。rpush:将一个或者多个值插入到列表尾部lpop:移除并返回列表头部的元素rpop:移除并返回列表尾部的元素lrange:获取列表指定范围内的元素lindex:通过索引获取列表中的元素llen:获取列表长度lset:将列表中指定索引的元素设置为另一个值lrem:移除列表中与参数匹配的元素 lrem mylist 1 a # 从mylist中移除第一个a。
2024-10-14 20:33:02
870
原创 消息队列面试题——第三篇
这其实就是多活模式,主要用于异地的数据复制,例如,在北京上海两个机房都部署RabbitMQ集群,他们之间依赖的RabbitMQ的federation插件实现持续的可靠的AMQP数据通信。相比于标准模式,镜像队列模式下,队列的主副本和一个或多个副本会同步到不同的节点上,即队列的消息会复制到多个节点,如果主队列所在的节点故障,副本节点会自动接管,保证队列的可用性。首先,如果要实现RabbitMQ的高可用,单机部署肯定是不合适的,因为单机故障,消息必然无法发送和消费。,确认上一条消息发送成功后再发送下一条。
2024-10-14 15:03:11
1190
原创 消息队列面试题——第二篇
AMQP是一种开放标准的应用层协议,定义了消息的格式、消息队列的行为以及客户端和消息中间件之间的通信方式。他的主要目标是为不同平台上的消息传递提供标准化的、高效和可靠的支持。AMQP的基本组成部分Message Broker:消息中间件、负责接收、存储和转发消息,在AMQP中,RabbitMQ是一个典型的消息代理实现。Exchange:交换机、负责接收消息并根据绑定规则将消息路由到消息队列。AMQP定义了多种交换机类型,如direct、fanout、topic、header。
2024-10-12 11:10:22
979
原创 Redis面试题——第三篇
所以新的主节点上可能没有锁的信息,此时,另一个业务去加锁,一看锁还没被占,于是抢到了锁开始执行。Redis官方推出了红锁,避免这种状况发生,主要解决的问题就是当部分节点发生故障也不会影响锁的使用和数据问题的发生。客户端会对这5个实例依次申请加锁,如果最终申请成功的数量超过半数,则表明加锁成功,反之失败。2. 红锁一定安全吗。首先要使用红锁需要集群部署Redis,官方推荐至少5个实例,不需要部署从库和哨兵,只需要主库。此时,由于瞬间的高并发,可能导致数据库崩溃。,比如增加Redis的配置,容纳更多的内存。
2024-10-12 10:51:09
777
原创 Redis面试题——第二篇
即再抢到锁之后,启动一个后台任务,该任务检查变量值,如果变量为false,表示该任务尚未执行结束,定时任务(看门狗)向redis进行锁的续期。主从架构中,如果采用读写分离的模式,即主节点负责写请求,从节点负责读请求。Lua脚本本身不具备原子性,但是由于redis的命令是单线程执行的,他会把整个lua脚本作为一个命令执行,会阻塞期间接受到的其他命令,这就保证了Lua脚本的原子性。针对这个情况,便出现了哨兵这个机制,主要进行监控作用,如果主节点挂了,将从节点切换成主节点,从而最大限度的减少停机时间和数据丢失。
2024-10-10 14:54:12
1377
原创 场景面试题——第二篇
在序列化存入redis后,再把代码里的class结构变更,这时候,从redis获取之前的值反序列化,由于当前的class还是没有serialVersionUid,于是会再次根据当前类计算得到serialVersionUID,而由于结构变了,类信息肯定变了,所以计算出来的serialVersionUID不一致。同时,远程调用还会有重试的情况,比如重试2次,那么实际上最多会有三次调用,最长的耗时就是超时时间*3,所以重试的时间也需要计算在总的超时时间之内。查询的时候,先从老的数组中找,找不到再去新的数组中找。
2024-10-09 16:45:10
1168
原创 Java面试题——第十篇
PLAB是Java垃圾回收器中的一种优化机制,主要用于G1垃圾收集器,目的是提高对象晋升到老年代的效率。在垃圾回收过程中,新生代中的某些对象由于生命周期较长,会被晋升到老年代。为了减少线程竞争和提升晋升效率。G1为每个GC线程分配一个局部缓冲区,称为 PLAB。每个线程可以在其本地PLAB中直接进行对象晋升操作。而不需要竞争全局老年代的内存空间,减少了锁竞争,提高了多线程垃圾回收的效率。在多线程并行执行YGC时,可能有很多对象需要晋升到老年代,此时老年代的指针就“热”起来了,于是搞了个PLAB。
2024-10-09 10:45:23
1249
原创 Redis面试题——第一篇
不过Redis并不是一直都单线程的,在4.0之后引入了多线程指令,6.0之后正式引入了多线程机制,不过,这里的 多线程其只是针对网络请求过程使用多线程,其对于数据读写命令的处理依旧是单线程的。Redis集群会将数据分散到16384个哈希槽中,集群中的每个节点负责一定范围的哈希槽,在Redis集群中,使用CRC16哈希算法计算键的哈希值,已确定该键应存储在哪个节点。Redis集群内每个节点都会保存集群的完整拓扑信息,包括每个节点的ID、IP地址、端口、负责的哈希槽范围等。集群哈希槽分片如图所示。
2024-10-08 21:20:50
2919
原创 Java面试题——第九篇(JVM)
三色标记算法是现代垃圾回收器中常用的一种增量标记算法。可以与应用线程并发执行,用于标记哪些对象需要被回收,哪些需要被保留,减少一次性停顿带来的性能影响。非常适合 低延迟和实时垃圾回收的场景。他通过将对象分为三种颜色来进行标记和追踪。三色标记基本概念白色对象:表示还没有被垃圾回收器访问到的对象,这些对象有可能是垃圾。灰色对象:表示已经被访问到,但其引用的其他对象还没有被处理完。黑色对象:表示已经被访问到且其引用的所有对象也都已经标记完毕,这些对象不会被回收。标记过程初始状态:所有对象都是白色。
2024-10-08 10:59:39
959
原创 Java面试题——第八篇(JVM)
Java中的直接内存是由操作系统分配的内存区域,不受JVM堆内存管理限制。直接内存通过java.nio包中的ByteBuffer.allocateDirect()方法分配,可以绕过JVM垃圾回收机制,直接与本地系统内存交互。1. 直接内存的优势由于直接内存不需要在堆上进行分配和复制数据,因此和操作系统的IO操作时可以减少一次复制。提升性能,在文件读写和网络传输场景直接内存有很大的优势。2. 性能优化策略。
2024-10-07 19:55:44
1162
原创 计算机网络面试题——第三篇
DNS(域名系统)是一个用于将域名转换为IP地址的互联网基础服务。当用户输入一个域名时,DNS服务器会查询该域名对应的IP地址,并将结果返回给用户。这样,用户就可以通过易记的域名访问网站,而不需要记录复杂的IP地址。除此之外,DNS还有负载均衡能力,通过将域名解析到多个IP地址,DNS可以帮助分散流量,进行负载均衡,提高服务的可靠性和性能。互联网中的域名地址,分为多级结构:最顶级是根域,然后是顶级域,如.com、.org接着是二级域(taobao.com),以及子域(www.taobao.com)。
2024-10-06 21:32:58
1390
原创 计算机网络面试题——第二篇
SYN Flood是一种拒绝服务攻击(Dos),攻击者通过发送大量的SYN包来耗尽服务器的资源,从而使得服务器无法响应用户的连接请求。攻击是利用TCP三次握手的机制,攻击者发送大量的SYN包,但是不完成后续的握手步骤,导致服务器在等待未完成连接的状态下耗尽资源。如何防御SYN Flood攻击SYN Cookies:根据第一次握手的客户端信息,生成cookies,随着第二次握手返回给客户端,后续客户端第三次握手时携带cookies,最终建连接,这个过程不会使用SYN队列缩短连接超时时间。
2024-09-29 14:56:21
1301
原创 计算机网络面试题——第一篇
TCP面向连接的并不是真的双方之间连起来,而是双方都维护了一个状态,通过每一次通信来维护状态的变更,使得双方好像有一条线关联对方。TCP中Socket、序列号和窗口大小socket:在TCP/IP协议中,Socket是通信的端点,由IP地址和端口号组成,如192.168.1.1:8080。在编程中,socket是用于网络通信的接口,通过它,应用程序可以发送和接收数据。序列号:TCP序列号在传输过程中非常关键,因为他保证了数据传输的有序性和完整性。
2024-09-28 22:10:25
956
原创 计算机网络——TCP/IP网络模型
只需要重新发送这一个分块。网络层最常使用的是IP协议,IP协议会将传输层的报文作为数据部分,再加上IP包头组成IP报文,如果IP报文大小超过MTU(以太网中一般为1500字节)就会再次进行分片,得到一个即将发送到网络的IP报文。电脑上的以太网接口,wifi接口,以太网交换机,路由器上的千兆、万兆以太网口、还有网线,他们都是以太网的组成部分。事实上,传输层协议不需要处理太多的事情,只需要服务好应用即可,让其作为应用间数据传输的媒介,帮助实现应用到应用的通信,而实际的传输功能就交给下一层,也就是网络层。
2024-09-27 11:01:22
2590
5
原创 MyBatis面试题
MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或者注解用于配制和原始映射,将接口和Java的POJOS映射成数据库中的记录。DAO是一个为数据库或者其他持久化机制提供了抽象接口的对象。在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。在实际开发中,应该将所有对数据源的访问操作进行抽象化后封装在一个公共API中。
2024-09-25 11:11:43
874
原创 消息队列面试题——第一篇
首先客户端必须连接到RabbitMQ服务器才能发布和消费消息,客户端和Rabbit server之间会创建一个tcp连接,一旦tcp打开并通过了认证(认证就是发送给rabbit服务器的用户名和密码),客户端和RabbitMQ就会创建一条amqp通道, 信道是创建在【真实】tcp上的虚拟连接,amqp命令都是通过信道发送出去的。vhost可以理解为虚拟的broker,其内部含有独立的queue、exchange和binding,但 最重要的是,其拥有独立的权限系统,可以做到vhost范围的用户控制。
2024-09-24 22:05:59
597
原创 Dubbo面试题
RPC远程过程调用协议,他是一种通过网络从远程计算机程序上请求服务,而不需要了解网络底层技术的协议。简言之,RPC使得程序能够像访问本地系统资源一样,去访问远端系统资源。简单的说,RPC就是从一台机器上通过参数传递的方式调用另一台机器上的一个函数或方法并得到返回的结果。
2024-09-23 22:18:45
802
原创 zookeeper面试题
zookeeper是一个开源的 分布式协调服务。他是一个为分布式应用提供一致性服务的软件,分布式应用程序可以基于Zookeeper实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。顺序一致性原子性单一视图可靠性实时性(最终一致性)Zookeeper提供了一个多层级的节点命名空间(节点称为znode)。与文件系统不同的是,这些节点都可以设置关联的数据,而文件系统只有文件节点可以存放数据而目录节点不行。
2024-09-23 18:51:41
1385
原创 场景题面试题——第一篇
海量数据处理是指基于海量数据的存储、处理和操作。正因为数据量太大,所以导致要么无法在短时间内迅速解决,要么无法一次性装入内存。对于 时间问题,可以采用巧妙的算法搭配合适的数据结构(如 布隆过滤器、哈希、位图、堆、数据库、倒排索引、Trie树)来解决。对于 空间问题,可以采用分而治之(哈希映射)的方法,也就是说,把规模大的数据转化为规模小的,从而各个击破。单机指处理装载数据的机器有限(只要考虑CPU、内存、硬盘之间的数据交互)
2024-09-23 15:09:08
660
原创 Spring面试题——第二篇
Spring IOC容器负责创建对象、管理对象(通过依赖注入),装配对象、配置对象,并且管理这些对象的整个生命周期。BeanFactory接口提供了一个先进的配置机制,使得任何类型对象的配置称为可能。ApplicationContext接口对BeanFactory进行了扩展,在BeanFactory的基础上添加了其他功能,比如和Spring的AOP更容易集成,也提供了处理message resource(国际化)的机制。
2024-09-20 16:00:43
1217
原创 MySQL面试题——第二篇
MySQL为了操作的性能优化,把数据更新先放入内存中,之后在统一更新到磁盘,当内存数据和磁盘数据不一致的时候,称这个内存页为脏页;内存数据写到磁盘后,内存的数据和磁盘上的内容就一致了,我们称为【干净页】。
2024-09-20 10:58:59
1827
原创 MySQL面试题——第一篇
表类型如果是MyISAM,那么id就是8如果是InnoDB,那就是6InnoDB表只会把自增主键的最大id记录在内存中,所以重启之后才会导致最大id丢失。每当行被更改时,时间戳字段将获取当前时间戳。内连接:取得两张表中存在连接匹配关系的记录。外连接:取得两张表中存在连接匹配关系的记录,以及某张表中不满足匹配关系的记录。交叉连接:也称为笛卡尔积。没有匹配关系进行筛选。视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成。
2024-09-19 14:40:25
1387
原创 Java面试题——第七篇(Java Web)
什么是CookieHTTP Cookie是服务器发送到用户浏览器并保存在本地的一小块数据。它会在浏览器下一次向同一个服务器再次发起请求时携带并发送到服务器上。通常,用于告知服务端两个请求是否来自同一个浏览器,如保持用户登录状态。什么是SessionSession代表着服务器和客户端一次会话的过程。Session对象存储特定用户会话所需的属性及配置信息。XSS攻击是攻击者向有XSS漏洞的网站中输入恶意的HTML代码,当用户浏览网站时,这段HTML代码会自动执行,从而达到攻击目的。
2024-09-13 09:31:26
589
1
原创 Java面试题——第四篇(集合)
可以,但是 HashMap的key如果是自定义的类,就需要重写hashcode()和equals()方法。阻塞队列是一个支持两个附加操作的队列。在队列为空时,获取元素的线程会等待队列变为非空。队列满时,存储元素的线程会等待元素可用。JDK提供了7个阻塞队列,分别为:ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列LinkedBlockingQueue: 一个由链表结构组成的有界阻塞队列PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
2024-09-10 14:56:42
512
原创 操作系统与Linux面试题
操作系统的内核是操作系统的核心部分,负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。操作系统的内核是连接应用程序和硬件的桥梁,决定着操作系统的性能和稳定性。在运行的用户程序中,凡是和系统态级别的资源相关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用的方式向操作系统提出服务请求,并由操作系统代为完成。设备管理文件管理进程控制进程通信内存管理虚拟地址到物理地址的转换要快。解决虚拟地址空间大、页表也会很大的问题。快表。
2024-09-06 19:59:42
876
原创 Java面试题——第六篇(Java基础)
由于JVM在运行Java应用程序的时候,首先会调用main方法,调用时不实例化这个类的对象,而是通过类名直接调用因此需要限制为public static。不能改为非静态,main方法必须声明为静态的,这样JVM才可以调用main方法而无需实例化他的类。
2024-09-06 15:58:33
906
原创 Netty原理及高性能
Netty的NioEventLoop读取到消息之后,直接调用ChannelPipeline的fireChannelRead,只要用户不主动切换线程,一直会由NioEventLoop调用到用户的Handler,期间不进行线程切换,这种串行化处理方式避免了多线程操作导致的锁的竞争,从性能角度看是最优的。在Netty中,零拷贝技术被广泛应用以提高网络数据传输的效率,零拷贝指的是在数据传输过程中,减少或者避免CPU的拷贝次数,从而加快数据传输速度,降低CPU负载。主要涉及到的是TCP的NAGLE算法。
2024-08-08 19:41:16
906
原创 Java面试题——第五篇(Java基础)
如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法,如果此刻线程B正在wait、sleep、join,则线程B会立刻抛出InterruptedException,在catch中直接return即可安全的结束线程。当new时,他们的执行顺序为:父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数。final 修饰的变量是引用不可变,但是引用的对象还是可以发生改变。
2024-08-07 10:36:25
870
原创 Java面试题——第四篇(多线程)
AQS即队列同步器,是用来构建锁或者其他同步组件的基础框架,使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。AQS使用一个int成员变量state来表示同步状态,当state>0时表示已经获取了锁,当state=0时表示释放了锁。他提供了三个方法getState()、setState(int newState)、compareAndSetState(int expect,int update)来对同步状态state进行操作,当然AQS对state的操作是安全的。
2024-08-06 19:40:12
1250
原创 Java面试题——第三篇(JVM)
完整GC流程GC开始时,对象只存在于Eden区和From Survivor区域,To Survivor是空白的保留区域。GC进行时,Eden中所有存活的对象会被复制到To Survivor区域,而在From Survivor区域的对象,根据年龄决定去向,如果年龄+1大于15,则晋升到老年代,否则,进入To Survivor区域。接着,清空Eden区域和From Survivor区域。
2024-08-05 21:01:29
1001
原创 Java面试题——第二篇(设计模式)
当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例方法即可。工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性。对一个原型对象进行复制、克隆产生类似的新对象:将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。
2024-08-01 19:53:10
1136
原创 计算机网络面试题——第一篇
浏览器发送302跳转主要涉及HTTP协议中的重定向机制。具体来说,当服务器收到一个请求后,如果发现请求的资源暂时不在当前位置。而是位于另一个URL,服务器就会向浏览器发送一个302状态码,并在响应头中指定新的资源位置(即Location字段)。浏览器收到这个状态码和Location字段后,会自动向新的URL发送请求,从而实现页面跳转。Rest是一种软件架构风格,HTTP是一种文本传输协议。
2024-07-31 21:03:35
1008
原创 Netty面试题——第一篇
要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。要发送的数据小于TCP发送缓冲区大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。接收数据端的应用层没有及时读取接受缓冲区的数据,将发生粘包。
2024-07-31 19:43:24
726
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人