自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(376)
  • 收藏
  • 关注

原创 redis内存淘汰策略

注意: 当使用 volatile-lru、volatile-lfu、volatile-random、volatile-ttl 这四种淘汰策略时,如果没有 key 可以淘汰,则和 neoviction 一样返回错误。: 从所有 key 中使用 LFU 算法进行淘汰(LFU 算法:最不常用算法,根据使用频率计算,4.0 版本新增);: 从所有 key 中使用 LRU 算法进行淘汰(LRU 算法:最近最少使用算法);: 从设置了过期时间的 key 中使用 LRU 算法进行淘汰;

2024-04-01 15:42:26 190

原创 SpringBoot自动配置原理

(2)配置类放在第三方的jar包里,然后通过Spring Boot中的约定优于配置的思想把配置类的全路径放在classpath:/META-INF/spring-factories文件中,这样Spring Boot就可以知道第三方jar包里面的配置类的位置。(3)SpringBoot拿到第三方jar包里面声明的配置类以后,再通过Spring提供的’ImportSelector’接口实现对这些配置类的动态加载,从而完成自动装配过程。SpringBoot的自动装配是通过注解和约定实现的。

2024-03-10 13:13:23 241

原创 HTTP和HTTPS有什么区别

HTTP:是互联网上应用最广泛的一种通信协议,基于TCP,可以使浏览器工作更为高效,减少网络传输。HTTPS:是HTTP的加强版,可以认为是HTTP+SSL(Secure Socket Layer)。在HTTP的基础上增加了一系列的安全机制。一方面保证了数据的传输安全,另一方面对访问者增加了验证机制。是目前现行架构下,最为安全的解决方案。

2024-03-09 19:49:08 656

原创 线程池的核心线程数、最大线程数应该如何设置

CPU密集型任务的特点,线程在执行任务时会一直使用CPU,所以对于这种情况,就要尽量避免发生线程上下文的切换。线程在执行IO型任务时,可能大量时间都阻塞在IO上,假如现在有10个CPU,如果我们只设置了10个线程来执行IO型任务,那么可能这10个线程都阻塞在了IO上,这样10个CPU都没活干了,所以我们通常设置为2*CPU核心数。只不过,为了应对线程执行过程发生缺页中断或者其他异常导致线程阻塞的请求,我们可以额外多设置一个线程,这样当某个线程不需要CPU时,可以有替补线程继续使用CPU。

2024-03-09 14:56:32 566

原创 2PC和3PC的区别是什么

当一个事务需要跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作并最终指示这些节点是否需要把操作结果真正的提交(比如把更新后的数据写入磁盘等等)。事务协调者给每个参与者发送prepare消息,每个参与者要么直接返回失败(如权限验证失败),要么在本地执行事务,写本地的redo和undo日志,但不提交。(2)事务回滚 参与者接收到abort请求之后,利用其在阶段二记录的undo信息来执行事务的回滚操作,并在完成回滚之后释放所有的事务资源。

2024-03-07 01:48:37 770

原创 JVM中CMS和G1垃圾回收器的区别

JVM(Java虚拟机)中的CMS(Concurrent Mark-Sweep)和G1(Garbage First)是两种用于垃圾回收的不同算法。它们都旨在减少垃圾回收对应用程序性能的影响,但它们的实现方式和重点略有不同。

2024-03-02 18:13:09 400

原创 select,poll和epoll有什么区别

它们都是NIO中多路复用的三种实现机制,是由linux操作系统提供的。用户空间和内核空间:操作系统为了保证系统安全,将内核分为两个部分,一个是用户空间,一个是内核空间。用户空间不能直接访问底层的硬件设备,必须通过内核空间。文件描述符(File Description FD):是一个抽象的概念,形式上是一个整数,实际是一个索引值,指向内核中每个进程维护进程所打开文件的记录表。当程序打开一个文件或者创建一个文件时,内核会向进程返回一个FD,主要在unix和linux系统中。

2024-03-02 01:49:09 164

原创 Redis常见性能问题及解决方案

由于redis的数据是存储在内存中的,如果数据量过大或者redis存储的key较多,就容易引发内存溢出问题,当redis内存占用率接近主机内存时,就会导致redis运行变得缓慢或者不可用。(3)优化redis配置参数:修改redis的配置文件,调整maxmemory等内存相关的参数,取消最大使用空间限制,通过主机资源监控的额方式,控制redis的内存使用。对于使用AOF持久化机制的redis应用,频繁写入数据时会导致AOF日志文件的写入次数增加,从而降低redis的性能。(2)启用AOF的重写机制。

2024-03-01 13:40:25 341

原创 SpringMVC中的控制器是不是单例模式?如果是,如何保证线程安全?

(2)最好的方式是将控制器设置为无状态模式,在控制器中,不要携带数据。但可以引用无状态的service和dao。(1)将scope设置成非singleton,比如protype,request。单例模式下会有线程安全。控制器是单例模式的。

2024-02-29 18:20:30 119

原创 如何设计一个分布式锁

(3)将锁的内容设置为过期时间(客户端时间+过期时间),SETNX获取锁失败后,拿这个时间和当前时间比对,如果是过期的锁,就先删除锁,再重新上锁。(4)SETNX失败后,获取锁上的时间戳,然后用getset,将自己的过期时间更新上去,并获取旧值,如果这个旧值,跟之前获取锁的时间是不一致的,就表示这个锁已经被其他进程占用了,自己就要放弃竞争锁。(2)给锁设置过期时间:问题:SETNX 和EXPIRE并不是原子性的,所以获取到锁的进程可能还没有执行EXPIRE指令就挂了,这时锁还是会被锁死。

2024-02-29 16:04:11 419

原创 如何设计一个mq消息队列

一般比较通用的设计是支持组间广播,不同的组注册不同的订阅。目前主流的方案是:追加写日志文件(数据部分) + 索引文件的方式(很多主流的开源 MQ 都是这种方式),索引设计上可以考虑稠密索引或者稀疏索引,查找消息可以利用跳转表、二分查找等,还可以通过操作系统的页缓存、零拷贝等技术来提升磁盘文件的读写性能。Broker 服务的高可用,只需要保证 Broker 可水平扩展进行集群部署即可,进一步通过服务自动注册与发现、负载均衡、超时重试机制、发送和消费消息时的 ack 机制来保证。

2024-02-29 01:04:21 352

原创 jvm中的cms垃圾回收器和G1垃圾回收器有什么区别

JVM(Java虚拟机)中的CMS(Concurrent Mark-Sweep)垃圾回收器和G1(Garbage-First)垃圾回收器是两种不同的垃圾回收器,它们在处理内存管理和垃圾回收时有一些区别。总的来说,CMS和G1是针对不同需求和场景设计的垃圾回收器。选择其中一种取决于应用程序的特性、性能要求以及可用硬件资源。

2024-02-28 20:38:06 546

原创 如何设计一个秒杀系统

因此需要将页面静态化,使用CDN缓存(CDN的主要目的是通过在全球各地部署的边缘服务器,使用户能够就近获取所需内容,从而提高用户访问网站的响应速度和稳定性。(8)缓存优化:抢购场景下,大量的用户同时请求某个商品,会导致缓存命中率降低,从而增加数据库压力。(1)高并发处理能力:秒杀系统往往会吸引大量用户的参与,需要设计支持高并发处理的架构,可以采用分布式系统的架构、消息队列、缓存等技术来提高请求处理能力。(4)数据库优化:针对高并发的场景,需要进行数据库的优化和设计,如合理的分库分表,优化SQL查询性能等。

2024-02-27 19:54:01 187

原创 对象分配内存时的指针碰撞与空闲列表机制

如果Java堆中的内存时不规整的,已使用的内存和空闲的内存相互交错,那么就没有办法使用指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的内存空间分配给实例对象,并更显列表上的记录。如果java堆中的内存时绝对规整的,所有用过的内存都放在一边,空闲的内存都放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就是仅仅把那个指针指向空闲空间那边挪动一段与对象大小相等的距离。

2024-02-04 00:37:40 245

原创 xxl-job相关面试题整理

​ xxl-job是一个分布式的任务调度平台,其核心设计目标是:学习简单、开发迅速、轻量级、易扩展,现在已经开放源代码并接入多家公司的线上产品线,开箱即用。xxl是xxl-job的开发者大众点评的许雪里名称的拼音开头。​ xxl-job框架主要用于处理分布式的定时任务,其主要由调度中心和执行器组成。​ 调度中心:统一管理任务调度平台上的调度任务,负责触发调度执行,并且提供任务管理平台。​ 执行器:接收调度中心的调度并且执行,可以直接执行也可以集成到项目中。

2024-01-24 23:20:27 570

原创 Http常用状态码

当前请求需要用户验证。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。此错误响应表明服务器作为网关需要得到一个处理这个请求的响应,但是得到一个错误的响应。

2024-01-22 23:56:49 545

原创 柠檬微趣面试准备

Spring框架是一个开源的Java应用程序框架,它提供了广泛的基础设施支持,帮助开发者构建Java应用程序。Spring的设计原则包括依赖注入(DI)和面向切面编程(AOP)等,以促使代码的松耦合和更好的可维护性。以下是Spring框架的一些关键原理:(1)依赖注入(Dependency Injection,DI):DI是Spring的核心原则之一,它通过控制反转(Inversion of Control,IoC)来实现。

2024-01-21 21:47:22 1020

原创 Mysql数据库cpu飙升怎么解决

也有可能是每个sql消耗资源不多,但是突然直接有大量的session进来导致cpu飙升,这个情况要根据应用联系起来分析为何连接数会激增,再做出相应的调整,比如限制连接数等。(2)如果是mysql导致的,show processlist,查看session情况,确定是不是有消耗资源的sql在运行。(3)找出消耗高的sql,看看执行计划是否准确,索引是否缺失,数据量是否太大。(1)kill掉这些线程(同时观察cpu使用率是否下降)(2)进行相应的调整(比如加索引、改sql、改内存参数)

2024-01-21 00:25:45 534

原创 Linux常用命令整理

当然,如果想解压缩,就直接替换上面的命令 tar -cvf / tar -zvf / tar -jcvf中的c替换为z就行。(5)、可中断睡眠状态:处于这个状态的进程因为等待某某事件的发生(比如等待 socket 连接、等待信号量),而被挂起。(1)、不可中断状态:进程处于睡眠状态,但是此刻进程是不可中断的。方括号[charset]:可替代charset集合中的任意单个字符,如[a-z],[abABC]参数: -a 所有文件 -l 文件的详细信息,包括大小字节数,可读可写可执行的权限等。

2024-01-20 23:41:28 863

原创 Redis中的BigKey相关问题

bigkey是指key对应的value所占用的内存空间比较大。例如一个字符串类型的value可以最大存到512MB,一个列表类型的value最多可以存储2^32-1个元素。如果按照数据结构来细分的话,一般分为字符串类型bigkey和非字符串类型bigkey。字符串类型:体现在单个value值很大,一般认为超过10kb就是bigkey。非字符串类型:哈希、列表、集合、有序集合体现在元素个数过多。bigkey无论在空间复杂度还是时间复杂度都不太友好。

2024-01-19 23:02:12 569

原创 如何解决redis热点key问题

假设此时有十万个针对同一个key的请求过来,如果没有本地缓存,这十万个请求就会直接请求到同一台redis上了。现在可以假设,你的应用层有50台机器,同时每台机器上都有jvm缓存。这十万个请求平均分散开来,每个机器有2000个请求,这样就会从jvm中直接取到值,然后返回数据。我们把这个key,同时存在多个redis上。接下来,当有热点key请求进来的时候,我们就在有备份的redis上随机抓取一台,进行访问取值,返回数据。针对这种热key请求,就会直接从jvm中取,而不会走本地redis层。

2024-01-17 20:40:03 544

原创 BeanFactory和ApplicationContext有什么区别

BeanFactory采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。ApplicationContext,它是在容器启动时,一次性创建了所有的Bean,这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入。相对于基本的BeanFactory,ApplicationContext唯一的不足是占用内存空间,当应用程序配置的bean较多时,程序启动比较慢。(2)统一的资源文件访问方式。

2023-12-28 19:54:14 382

原创 java 多个线程按顺序交替执行

CountDownLatch使用一个计数器,调用await()方法计数器+1,调用countDown()方法计数器-1,当计数器为0时,使用await()方法的线程可以继续运行。join主要是让父线程等待子线程结束之后父线程才能继续运行。

2023-12-18 11:50:13 444

原创 jdk动态代理和cgLib动态代理的区别

优点:Cglib支持对类进行代理,即使没有接口,也可以通过回调接口间接的实现,性能比JDK动态代理更高,能够戴琳安歇没有实现任何接口的目标对象。CgLib在生成代理类的过程中,采用动态生成字节码的方式,在被代理类加载之间就完成了代理类的创建并缓存到内存中,以后每次调用时,都直接使用缓存的代理类。基于接口来创建被代理对象的代理实例,当对象要被代理时,它必须实现一个或者多个接口并依赖于JDK库。JDK动态代理利用反射机制生成一个包含被代理对象的所有接口的代理类,并覆盖接口中的所有方法,可以对目标对象进行代理。

2023-12-10 18:29:16 425

原创 @Resource和@Autowired的区别

使用idea在编写依赖注入的代码时,如果是注入的是mapper对象,那么使用@Autowired编译器会提示报错信息。(1)来源不同:@Autowired是Spring定义的注解,而@Resource是java定义的注解。@autowired是先按照类型查找,如果存在多个bean再根据名称(byName)进行查找。@Autowired只支持设置一个required的参数,而@Resource支持七个参数。@Resource是先按照name查找,如果查询不到,再按照type查找。(3)支持的参数不同。

2023-09-25 19:57:11 621

原创 Nacos相关面试题

我们可以给某个服务设置一个0-1的阈值,比如0.5,那就表示,一旦实例中只剩下一半的健康实例了,比如10个实例,只剩下五个健康实例了,那么消费者在进行服务发送时,则会把该服务的所有实例,也包括不健康的实例都拉取到本地,然后再从所有实例中进行负载均衡,选出一个实例进行调用,在这种情况下,选出来的既可能是一个健康的实例,也可能是挂掉的实例,但是通过这种方式,很好的保护了剩下的健康实例,至少保证了一部分请求能够正常访问。根据cluster-name来判断两个实例是不是同一个集群,这就是Nacos的就近访问。

2023-09-14 21:16:48 293

原创 什么是JIT即使编译器,有什么作用

但在这个过程中可能会存在一些重复代码,而每次执行都要解释器翻译一次,这样就比较消耗资源了,所以就有了JIT即时编译器,它相当于会把字节码再编译一次,而之后再执行该热点代码时,就不需要解释器翻译了,而是能够直接执行机器指令。在Java中,相当于解释器和JIT即时编译器在同时使用,一开始使用解释器,这样程序能够更快地启动,不需要等全部编译成机器指令后再启动,随着程序运行过程中,发现热点代码后,再利用JIT进行即时编译,这样又能够提高执行效率,这样就既考虑到了启动速度,也考虑到了执行速度。

2023-09-11 22:45:36 176

原创 如何实现接口的幂等性

在计算机领域,幂等性指同一个操作可以执行多次,但是运行结果不会被改变。幂等性操作有以下两个特征:(1)无论调用多少次,结果都一样。(2)重复调用不会对系统产生影响。

2023-09-10 20:33:37 214

原创 Redis单线程为什么这么快

(3)单线程反而避免了多线程的频繁上下文切换带来的性能问题。(2)核心是基于非阻塞IO多路复用机制。

2023-09-10 20:15:29 33

原创 Redis的持久化机制

(1)AOF文件比RDB文件更新频率高,优先使用AOF还原数据。AOF比RDB更安全也更大。(2)RDB性能比AOF好。(3)如果两个都配了会优先使用AOF。

2023-09-10 20:13:18 348

原创 Redis和Mysql如何保证数据一致性

(2)先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中,这种方法能解决方案一的问题,但是在高并发的情况下性能较低,并且仍然会出现数据不一致的问题,比如线程1删除了Redis的数据,正在更新Mysql,此时另一个线程查询再查询,那么依然会将Mysql中的老数据又更新到Redis中。(1)先更新Mysql,再更新Redis,此时如果redis更新失败,就会存在数据不一致。

2023-09-10 19:50:59 269

原创 Redis集群策略

(3)Cluster模式:Cluster模式是用的比较多的模式,它支持多主多从,这种模式会按照key进行槽位的分配,可以使得不同的key分散到不同的主节点上,利用这种模式可以使得整个集群支持更大的数据容量,同时每个主节点可以拥有自己的多个从节点,如果该主节点宕机,会从它的从节点中选择一个新的主节点。对于这三种模式,如果Redis要存储的数据量不大,可以选择使用哨兵模式,如果Redis要存储的数据量很大,并且需要持续的扩容,那么就可以选择Cluster模式。

2023-09-10 19:41:05 111

原创 Redis主从复制的核心原理

(3)在主库将数据同步给从库的过程中,主库不会有阻塞,仍然可以被正常接收请求。(4)最后,主库被把上个阶段执行过程中收到的写命令,再发给从库,具体的操作是,当主库完成RDB文件发送后,就会把此时replication buffer中的修改操作发送给从库,从库再来执行这些操作。(5)后续主库和从库都可以处理客户端的读操作,写操作只能交给主库进行处理,主库收到写操作后,还会将写操作发送给从库,实现增量同步。(2)主库将所有数据同步给从库,从库接收到数据后,在本地完成数据加载,这个过程依赖于内存快照RDB。

2023-09-10 17:55:26 21

原创 一个对象从加载到JVM,再到被GC清除,都经历了什么过程

(3)对象首先会被分配在堆区中年轻代的伊甸园区中,经过一次Minor GC后,如果对象还存活,就会进入Suvivor区中。在后续的每次Minor GC中,如果对象一次存活,就会在Survivor区中来回拷贝,每移动一次,年龄+1.(5)如果经过Full GC,被标记为垃圾对象,那么就会被GC线程清理掉。(4)当年龄超过15后,对象若依然存活,此时该对象进入老年代。(1)首先把字节码文件加载到方法区。(2)然后再根据类信息在堆区创建对象。

2023-09-04 20:28:28 108

原创 SpringBoot的四种handler类型

使用@Component将该类封装成一个Bean。

2023-08-30 21:56:22 653

原创 Mysql中九种索引失效场景分析

表数据:索引情况:其中a是主键,对应主键索引,bcd三个字段组成联合索引,e字段为一个索引。

2023-08-30 21:47:03 395

原创 Tomcat中为什么要使用自定义类加载器

一个Tomcat中可以部署多个应用,而每个应用都存在很多类,并且各个应用中的类是独立的,全类名是可以相同的,比如一个订单系统中可能存在com.xxx.User类,一个库存系统也可能存在com.xxx.User类,一个Tomcat,不管内部部署了多少应用,Tomcat启动之后就是一个Java进程,也就是一个jvm,所以如果Tomcat中只存在一个类加载器,比如默认的AppClassLoader,那么久只能加载一个com.xxx.user类,这是有问题的。

2023-08-29 19:59:44 85

原创 Synchronized的锁升级过程是怎样的

由偏向锁升级而来,当一个线程获取到锁后,此时这把锁是偏向锁,此时如果有第二个线程来竞争锁,偏向锁就会升级为轻量级锁,之所以叫轻量级锁,是为了和重量级锁区分开,轻量级锁底层是通过自旋来实现的,并不会阻塞线程。在锁对象的对象头中记录一下当前获取到的该锁的线程id,该线程下次如果又来获取该锁就可以直接获取到了,也就是支持锁重入。(3)如果自旋锁自旋次数过多,仍然没有获取到锁,则会升级为重量级锁,重量级锁会导致线程阻塞。

2023-08-29 15:46:54 75

原创 为什么不建议使用Executors来创建线程池

(1)FixedThreadPool当我们使用Executors创建FixedThreadPool时,对应的构造方法为:此时我们发现创建的队列为LinkedBlockingQueue,是一个无界阻塞队列,如果使用该线程池执行任务,如果任务过多就会不断地添加到队列中,任务越多占用的内存就越多,最终可能耗尽内存,导致OOM。(2)SingleThreadExecutor当我们使用Executors创建SingleThreadExecutor时,对应的构造方法为:同样使用的是LinkedBlockingQ

2023-08-29 15:10:54 79

原创 Mysql中的最左前缀原则是什么

当一个SQL想要利用索引时,就一定要提供该索引所对应的字段最左边的字段,也就是排在最前面的字段。比如针对abc三个字段建立了一个联合索引,那么在写一个sql时就一定要提供a字段的条件,这样才能使用到联合索引,这是由于在建立abc三个字段的联合索引时,底层的B+树是按照abc三个字段去比较大小排序的,所以如果想要利用b+树进行快速查找时也得符合这个规则。

2023-07-23 15:13:54 71

空空如也

空空如也

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

TA关注的人

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