自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 设计模式相关问题

在平时的开发中,涉及到设计模式的有两块内容,第一个是我们平时使用的框架(比如spring、mybatis等),第二个是我们自己开发业务使用的设计模式。面试官一般比较关心的是你在开发过程中,有没有使用过设计模式,或者你在简历上写了关于设计模式的描述,那么这样我们就需要重点关心自己开发中用过的设计模式。

2024-02-09 16:24:31 1648

原创 JVM相关问题

难易程度:☆☆☆出现频率:☆☆☆☆程序计数器:线程私有的,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。javap -verbose xx.class 打印堆栈大小,局部变量的数量和方法的参数。java虚拟机对于多线程是通过线程轮流切换并且分配线程执行时间。在任何的一个时间点上,一个处理器只会处理执行一个线程,如果当前被执行的这个线程它所分配的执行时间用完了【挂起】。处理器会切换到另外的一个线程上来进行执行。并且这个线程的执行时间用完了,接着处理器就会又来执行被挂起的这个线程。

2024-02-09 16:23:26 1500

原创 mysql问题

如果一条sql执行很慢的话,我们通常会使用mysql自动的执行计划explain来去查看这条sql的执行情况,比如在这里面可以通过key和key_len检查是否命中了索引,如果本身已经添加了索引,也可以判断索引是否有失效的情况,第二个,可以通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描,第三个可以通过extra建议来判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。

2024-02-04 13:56:29 1106

原创 redis相关问题

这个是不能的,比如,当线程1加锁成功后,master节点数据会异步复制到slave节点,此时当前持有Redis锁的master节点宕机,slave节点被提升为新的master节点,假如现在来了一个线程2,再次加锁,会在新的master节点上加锁成功,这个时候就会出现两个节点同时持有一把锁的问题。我们当时采用的阿里的canal组件实现数据同步:不需要更改业务代码,部署一个canal服务。:嗯,是这样的,单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,可以搭建主从集群,实现读写分离。

2024-02-04 13:55:01 1119

原创 Java多线程

CAS的全称是: Compare And Swap(比较再交换),它体现的一种乐观锁的思想,在无锁情况下保证线程操作共享数据的原子性。在JUC( java.util.concurrent )包下实现的很多类都用到了CAS操作AbstractQueuedSynchronizer(AQS框架)AtomicXXX类例子:我们还是基于刚才学习过的JMM内存模型进行说明线程1与线程2都从主内存中获取变量int a = 100,同时放到各个线程的工作内存中。

2024-01-28 05:00:58 970

原创 微服务面试题

我当时做的xx项目,采用就是微服务的架构,因为xx因为,应该会有突发流量,最大QPS可以达到2000,但是服务支撑不住,我们项目都通过压测最多可以支撑1200QPS。我们当时采用的nginx限流操作,nginx使用的漏桶算法来实现过滤,让请求以固定的速率处理请求,可以应对突发流量,我们控制的速率是按照ip进行限流,限制的流量是每秒20。服务雪崩是指一个服务失败,导致整条链路的服务都失败的情形,一般我们在项目解决的话就是两种方案,第一个是服务降级,第二个是服务熔断,如果流量太大的话,可以考虑限流。

2024-01-28 04:56:54 1149

原创 synchronized的介绍

synchronized是Java编程语言中的一个关键字,用于实现线程同步。在多线程编程中,多个线程可能同时访问共享资源,而这可能导致数据不一致或其他问题。为了避免这些问题,可以使用 synchronized 关键字来确保在任何时候只有一个线程可以访问共享资源。使用synchronized就是为了保证线程的三个特性,及原子性、可见性、有序性。原子性:一个或多个操作时,保证要么全部执行成功,要么都不执行。可见性:一个线程操作时,另外的线程可以看见,里面的数据变化情况能看见。有序性:线程安装顺序进行操作。

2024-01-19 19:51:36 1221

原创 rabbitmq的介绍、使用、案例

rabbitmq的基础理论就是生产者和消费者模型,在这里进行解释,方便对rabbitmq进行理解和使用。生产者和消费者模型是分为以下几个要素:共享缓冲区、生产者、消费者。下面以去kfc买鸡腿举例:就是顾客要买鸡腿,肯定是需要去店里去买的,只有店员在炸好鸡腿之后,顾客点餐买好鸡腿。炸鸡腿的店员和顾客是不直接接触的,是互相不认识的。在rabbitmq的消费者和生产者模型中通常就是消费者将消息发送到消息队列中,消费者从消息队列中获取消息并处理。实现解耦和异步通信。

2024-01-19 19:46:42 893 2

原创 事务的四个特性、四个隔离级别以及数据库的常用锁

共享锁(S):又称读锁,允许一个事务去读取一行,阻止其他事务获得相同数据集的排它锁,若事务T对数据对象A加上S锁,则事务T可以读A,但不能修改A,其他事务只能对再对A加S锁,而不能加X锁,直到T释放A上的锁,这保证了其他事务可以读A,但在释放A上的S锁之前不能对A做任何修改。排它锁(X):又称写锁,允许获取排它锁的事物更新数据,阻止其他事务取得相同的数据集共享读锁和排它写锁,若事务T对数据对象A加上X锁,事物T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T 释放A上的锁。

2023-12-12 03:22:22 762 1

原创 CPU密集型和IO密集型与CPU内核之间的关系

在IO密集型任务中,CPU 的计算能力通常不是系统性能的瓶颈,因为大部分时间都是在等待IO操作的完成。CPU密集型任务: 如果你的任务主要是进行大量的计算,并且没有太多的阻塞操作,那么属于CPU密集型任务。在《Java并发编程实战》一书中,提到了一个线程池的大小计算公式,该公式是为了在一定条件下估算线程池的最优大小,以提高应用程序的性能。任务响应时间敏感: 如果你的任务对于响应时间非常敏感,需要迅速响应用户请求,那么可以适度增加核心线程数,以减少任务排队等待的时间。

2023-12-08 00:37:04 437

原创 ELK的日志解决方案

- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->灵活的数据处理: Logstash 具有强大的数据处理能力,可以对收集到的数据进行过滤、转换和格式化,以适应特定的需求。随着我们系统架构的不断升级,由单体转为分布式、微服务、网格系统等,用户访问产生的日志量也在不断增加,我们急需一个可以快速、准确查询和分析日志的平台。它能够快速存储和检索大量的数据,使用户能够以实时方式探索和分析数据。

2023-12-07 07:22:30 416

原创 线程池,及7大参数,4大拒绝策略详解

上面我们有提到说可以自定义我们的线程池,那么就来列出七个需要的线程池的参数序列参数名含义1.核心线程数2.最大线程数(必须大于核心线程数)3.空闲线程的存活时间4.Unit时间单位5.workQueue用于存放任务的队列6.线程工厂、用来创建新线程7.handler处理。

2023-12-05 23:07:49 410

原创 三种定时任务中的xxl-job总结

一种适合分布式场景的定时任务。

2023-12-04 19:44:01 975

原创 synchronized的介绍

synchronized是Java编程语言中的一个关键字,用于实现线程同步。在多线程编程中,多个线程可能同时访问共享资源,而这可能导致数据不一致或其他问题。为了避免这些问题,可以使用 synchronized 关键字来确保在任何时候只有一个线程可以访问共享资源。使用synchronized就是为了保证线程的三个特性,及原子性、可见性、有序性。原子性:一个或多个操作时,保证要么全部执行成功,要么都不执行。可见性:一个线程操作时,另外的线程可以看见,里面的数据变化情况能看见。有序性:线程安装顺序进行操作。

2023-11-30 20:32:42 809

原创 过滤器,拦截器,aop之间差异

综上所述,过滤器主要用于整个请求的生命周期,处理HTTP请求和响应;AOP则是一种更广泛的编程范式,用于解决横切关注点的问题,提高代码的模块化。主要用于解决横切关注点的问题,将与业务逻辑无关的横切关注点从业务逻辑中分离出来。通过定义切面,可以实现横切关注点的功能,例如事务管理、日志记录、安全性检查等。主要作用于方法调用的层面,可以针对Controller中的方法进行拦截。在方法调用的各个阶段,如方法前、方法后、方法异常等,通过切面进行插入。作用范围覆盖整个请求的生命周期,包括请求前的预处理和响应后的处理。

2023-11-30 07:05:23 405

原创 设计模式-代理模式的三种形式

代理模式是一种结构型设计模式,它允许一个对象(代理)代表另一个对象进行控制访问。代理模式主要用于在访问某个对象时引入一定程度的间接性,以支持更灵活的控制。代理模式有三种形式静态代理、动态代理、cglib代理。

2023-11-29 00:09:09 438

原创 Spring是如何解决循环依赖的

Spring通过使用三级缓存解决循环依赖问题。通过这三级缓存,Spring能够在创建Bean的过程中处理循环依赖,确保每个Bean在初始化时都能够正确地引用其他Bean。earlySingletonObjects: 存放提前曝光的单例Bean,即尚未完全初始化的Bean。singletonFactories: 存放Bean的工厂对象,用于创建Bean的实例。singletonObjects: 存放完全初始化的单例Bean。

2023-11-28 08:01:07 385

原创 Rpc和http的区别

RPC(Remote Procedure Call)和HTTP(Hypertext Transfer Protocol)都是用于实现分布式系统中不同节点之间通信的协议,但它们有一些关键的区别。总的来说,RPC更注重于远程过程调用的语义和效率,而HTTP更注重于资源的状态传输和互联网上的通信。选择使用哪种协议取决于具体的应用场景和需求。

2023-11-25 15:23:42 500

原创 设计模式-build

"建造者模式"(Builder Pattern)是一种创建型设计模式,它的主要目的是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

2023-11-23 20:22:36 970 1

原创 tp协议和WebSocket协议之间的区别与特点

HTTP 协议是一个单向协议,工作在 TCP 协议之上,TCP 协议是面向连接的传输层协议,我们可以在收到 HTTP 连接关闭的响应后使用 HTTP 请求方法创建连接。举个例子,当用户向服务器发送请求时,该请求以HTTP或HTTPS的形式,服务器收到请求后将响应发送给客户端,每个请求都关联一个相应的响应,发送响应后连接关闭,每个 HTTP 或 HTTPS 请求每次都会建立到服务器的新连接,在收到响应后,连接会自行终止。当连接建立并处于活动状态时,将使用相同的连接通道进行通信,直到连接终止为止。

2023-11-23 07:09:11 102

原创 ConcurrentHashMap介绍

引入ConcurrentHashMap是为了同步集合Hashtable之间有更好的选择,Hashtable与HashMap,ConcurrentHashMap主要区别于HashMap不是同步的,线程不安全的和不适合应用于多线程并发环境下,而ConcurrentHashMap是线程安全的集合容器,特别是在多线程和并发环境中,通常作为Map的主要实现。cas是一种基于锁的操作,而且是乐观锁。**1.数据结构:**取消了Segment分段锁的数据结构,取而代之的是数组+链表+红黑树的结构。

2023-11-22 06:48:13 30

原创 网络的七层概念

网络的七层是指OSI(Open Systems Interconnection)模型,它是一个用于理解和描述计算机网络功能的框架,将网络通信划分为七个不同的层次。每个层次都有其特定的功能和责任。这个模型帮助网络设计者和工程师理解网络协议的工作原理,从而更容易实现和维护复杂的网络系统。网络七层分成物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

2023-11-20 19:56:00 61 1

原创 GitLab的搭建和常用命令

gitlab-ce是社区版本。

2023-11-20 00:08:46 270 1

原创 生产者消费者消费者模型

同理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者,所以为了达到生产者和消费者生产数据和消费数据之间的平衡,那么就需要一个缓冲区或容器用来存储生产者生产的数据,所以就引入了生产者-消费者模式。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。当数据制造快的时候,消费者来不及处理,未处理的数据可以暂时存在缓冲区中。

2023-10-31 06:54:22 56 2

原创 分表分库的原则

一张表的字段可能有几十个甚至上百个,而且一张表存储的数据还很多,高达几千万数据,更难受的是这样的表还挺多。水平分库理论上切分起来是比较麻烦的,它是指将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。分库分表后表之间的关联操作将受到限制,我们无法join位于不同分库的表,也无法join分表粒度不同的表, 结果原本一次查询能够完成的业务,可能需要多次查询才能完成。联合查询不仅困难,而且可以说是不可能,因为两个相关联的表可能会分布在不同的数据库,不同的服务器中。

2023-10-29 21:36:50 37 1

原创 Threadlocal对象的使用

从名字我们就可以看到ThreadLocal 叫做线程本地变量,意思是说,ThreadLocal 中填充的的是当前线程的变量,该变量对其他线程而言是封闭且隔离的,ThreadLocal 为变量在每个线程中创建了一个副本,这样每个线程都可以访问自己内部的副本变量。set()——>获取当前线程——>拿到当前线程的threalLocalMap——>如果threalLocalMap不为null,则直接更新要保存的变量值key为ThreadLocal,value为参数,否则创建threadLocalMap,并赋值。

2023-10-26 07:10:37 39 1

原创 CAS(compare and swap)

重排序不会影响单线程的执行结果,但是在并发情况下,可能会出现诡异的BUG。有序性是指程序在执行的时候,程序的代码执行顺序和语句的顺序是一致的。多线程的应用在日常开发中很多,带来了很多的便利,但也有要注意问题,一般主要从这三个方面考虑。原子性是指一个操作是不可中断的,要么全部执行成功要么全部执行失败,有着“同生共死”的感觉。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。

2023-10-25 01:08:11 36 1

原创 搭建nexus私服部署项目

之前是已经安装好了repository的私服了,今天我们要再添加两个私服账号。在Linux上安装步骤,可以看以前的步骤。

2023-10-23 19:03:27 20

原创 RBAC模型

RBAC(基于角色的访问控制)是一种常见的访问控制模型,它是建立在角色和权限的基础上的。在RBAC模型中,权限被分配给角色,而用户则被分配到适当的角色上。RBAC的主要思想是将用户和权限之间的关系转变为用户和角色、角色和权限之间的关系。这样,当一个用户被分配到一个角色上时,他就拥有了该角色所包含的所有权限。通过限制用户的权限,RBAC可以确保用户只能执行他们工作所需的操作,从而降低了潜在的安全风险。角色是一组权限的集合。当权限发生变化时,只需修改角色的权限,所有分配到该角色的用户都会自动拥有新的权限。

2023-10-22 20:56:03 26 1

原创 redis的五种常用类型

这里会介绍几个简单和常用的命令。

2023-10-20 01:13:00 25 1

原创 Spring缓存注解

缓存是一种数据存储技术,它将计算结果或数据存储在一个临时存储区域,以便在将来的请求中可以更快地获取这些数据。在计算机科学中,缓存通常用于加速数据访问速度,减轻后端系统的负载,提高应用程序的性能和响应速度。简单来说就是使我们在后面的查询会更快一点。上图是简单的缓存的示意图,第一次我们从数据库取数据的时候,同时也在缓存中存入了数据,当我们第二次进行查询的时候就不是通过数据库来进行查询了,而是通过缓存来读取数据。这样就要比从数据库中直接读取数据要快很多。

2023-10-18 19:29:14 32

原创 swagger接口测试

Swagger 是一个用于设计、构建、文档化和使用 RESTful Web 服务的开源工具。它提供了一个交互式的、用户友好的界面,用于描述、文档化和测试 RESTful API。我们使用的工具是knife4j,是一个将swagger增强的一个工具。

2023-10-11 20:09:18 918

原创 springboot整合Dockerfile

Dockerfile 是一个用于构建 Docker 镜像的文本文件,它包含了一系列的指令,这些指令定义了在基础镜像上执行的操作,以及如何配置容器。设置好以后,我们只需要输入指令就可以了,不用再像以前一样一步步进行操作了。镜像的pull 。。和容器的run 。。尤其时创建容器时很容易出现问题。这里我们分成了四部分,下来我们先把格式写一下:FROM adoptopenjdk/openjdk11 #基础镜像 jdk11的基础镜像MAINTAINER xxx #维

2023-10-11 01:17:55 283

原创 MySQL的主从搭建

在说明为什么要建立主从关系前,先解释下什么是MySQL的主从。它是一种常见的数据库架构其中一个数据库服务器(主服务器)将其更新或更改复制到一个或多个其他数据库服务器(从服务器)。它的好处有:1.负载分摊:当我们进行读的操作时,可以从多个服务器上读取,减轻主服务器的负载,其中从服务器只负责读的操作。2.高可用性:当我们的主服务器出现故障的时候,可以使用从服务器,不至于当我们的主服务器宕机的时候,我们的系统就停用了。3.数据备份:当我们的主服务器出现问题的时候,数据丢失,可以在从服务器进行恢复、备份。

2023-10-10 03:55:23 543 1

原创 在Linux中安装docker容器的步骤——以MySQL为例

备注:我们通过这条命令来查询mysql镜像有哪些,其中红色框中的是官方的,可以根据需求下载,一般下载第一个。

2023-10-08 20:31:35 99 1

原创 sql语句优化

这样就查到了我们想要的两张表的信息,再这里因为我user这张表的数据不是很多,所以查的会快一点。在使用联合索引的时候需要注意,1.要确定索引的顺序,2.不要使用过多的join,会增加维护的成本。第一条查询语句是在匹配id列中包含1的任意位置的字符序列,第二条查询语句是在匹配id列中以1。大家可以看到查询的时间从上到下,是越来越快的,三条sql语句的区别就是在于通配符%。然后这里还会存在一个问题,如果我们的id以1开头的数比较多的情况下,当我们用。这里我们先假设有两张表staff和user两张表。

2023-08-12 20:28:12 111 1

原创 索引的简单理解

看到现在会发现想用索引,是有条件的,不是随便使用的,在我们优化sql语句的时候会存在很多的坑,需要我们不停的去尝试。在我们使用二级索引的时候,会存在回表的操作,回表越频繁我们的查询性能越低。这其中还有很多要注意的点,大家可以自己去查阅资料。

2023-07-30 03:27:34 78 1

原创 函数当参数的优缺点

4.我们继续加大难度计算(1/(1+2)+2/(2+3)+3/(3+4)+4/(4+5)+5/(5+6))这个时候就不是平方、立方之类的了,加上了加法。新手刚开始真的非常难受,不熟悉它的写法,在使用时也不熟悉。把函数当参数会更加的简洁、灵活,但逻辑性会更强、难度会加大。PS:在js中是用function来声明函数,let相当于Java中的int、String等。3.然后我们稍微变一下,我们计算一下 1 + 2^2 + 3^2 + 4^2 +……计算1加到100的和,这个所有应该都是不陌生的。

2023-07-06 01:38:37 224

原创 Map的好处和缺点

当我们用list查找arr{2,5,8,4,6,9,3,1,17,10}时,假如我们需要7这个数字它是一个个去查找的,要查9次,它的时间复杂度是O(N)。而我们用map查找时17%10-->arr[7]它的时间复杂度是O(1)。像INSERT、DELETE、SEARCH在Map中是可以的,其它的方式也可以通过其它方式实现,但是会变的更加复杂,这个时候就可以考虑用list。当链表过长时会树化,当形成"树"的时候,它又会发生碰撞变成链表,这个时候我们就要用红黑树来代替,来保持平衡。当用map时会发生碰撞。

2023-07-05 21:05:25 215

原创 二叉树的简单理解

height ≈ log2(N) = 二分查找的时间复杂度。这个时候它就会退成链表的形式,此时的时间复杂度为O(N)为了保持平衡用红黑树(暂不说明)代替二叉树。“树”的高度越低,时间复杂度越好。一种特殊的情况当第一个数字是3时。用“树”的样子来表示有序的数组。

2023-07-05 20:29:17 26

空空如也

空空如也

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

TA关注的人

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