自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MyBatis知识点

Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

2025-08-01 17:52:08 660

原创 Redis知识点(2)

缓存击穿时指某个热点数据缓存过期时,大量请求就会穿透缓存直接访问数据库,导致数据库瞬间承受的压力巨大。缓存击穿有两种常用的策略:第一种是加互斥锁。当缓存失效时,第一个访问的线程先获取锁并负责重建缓存,其他线程等待或重试。第二种是永不过期策略。缓存项本身不设置过期时间,也就是永不过期,但在缓存值中维护一个逻辑过期时间。当缓存逻辑上过期时,返回旧值的同时,异步启动一个线程去更新缓存。缓存穿透是指查询的数据在缓存中没有命中,因为数据压根不存在,所以请求会直接落在数据库中。

2025-07-30 22:00:48 1133

原创 Redis知识点(1)

全量同步会将主节点的完整数据集传输给从节点,通常全量同步的代价很高,因为完整的 RDB 文件在生成时会占用大量的 CPU 和磁盘 IO;哨兵机制,这是一个相对成熟的高可用的解决方案,我们生产环境部署的是一主两从的Redis实例,再加上三个Sentinel节点监控它们。集群架构是对前两种方案的进一步扩展和完善,通过数据分片解决 Redis 单机内存大小的限制,当用户基数从百万增长到千万级别时,我们只需简单地向集群中添加节点,就能轻松应对不断增长的数据量和访问压力。主从复制允许从节点维护主节点的数据副本。

2025-07-30 19:00:17 894

原创 JVM知识点(2)

白色(White):尚未访问的对象。垃圾回收结束后,仍然为白色的对象会被认为是不可达的对象,可以回收。灰色(Gray):已经访问到但未标记完其引用的对象。灰色对象是需要进一步处理的。黑色(Black):已经访问到并且其所有引用对象都已经标记过。黑色对象是完全处理过的,不需要再处理。三色标记法的工作流程:①、初始标记(Initial Marking):从 GC Roots 开始,标记所有直接可达的对象为灰色。

2025-07-29 20:58:22 685

原创 JVM知识点(1)

假设堆内存是一个连续的空间,分为两个部分,一部分是已经被使用的内存,另一部分是未被使用的内存,在分配内存时,Java虚拟机会维护一个指针,指向下一个可用的内存地址,每次分配内存时,只需要将指针向后移动一段juice,如果没有发送碰撞,就将这段内存分配给对象实例。JVM维护一个列表,记录堆中所有没有占用的内存块,每个内存块都记录有大小和地址信息。当有新的对象请求内存时,JVM会遍历空闲列表,寻找足够大的空间来存放新对象。

2025-07-29 19:43:36 1068

原创 Java并发知识点(3)

而在 JDK 1.8 中,ConcurrentHashMap 取消了 Segment 分段锁,采用了更加精细化的锁——桶锁,以及 CAS 无锁算法,每个桶都可以独立地加锁,只有在 CAS 失败时才会使用 synchronized 代码块加锁,这样可以减少锁的竞争,提高并发性能。也就是线程数达到 maximumPoolSiz,任务队列也满了的时候,就会触发拒绝策略。②、对于 IO 密集型任务,由于线程经常处于等待状态,等待 IO 操作完成,所以可以设置更多的线程来提高并发,比如说 CPU 核心数的两倍。

2025-07-28 15:05:07 827

原创 Java并发知识点(2)

指令重排是CPU或者编译器为了优化程序的执行效率,改变代码执行顺序的一种优化技术。从 Java 源代码到最终执行的指令序列,会经历 3 种重排序:编译器重排序、指令并行重排序、内存系统重排序。if (instance == null) { // 第一次检查if (instance == null) { // 第二次检查// 可能发生指令重排如果线程 A 执行了,但构造方法还没执行完,线程 B 可能会读取到一个未初始化的对象,导致出现空指针异常。正确的方式是给 instance 变量加上。

2025-07-28 13:11:07 819

原创 Java并发知识点(1)

线程上下文切换是指CPU从一个线程切换到另一个线程执行的过程在线程切换的过程中,CPU 需要保存当前线程的执行状态,并加载下一个线程的上下文。之所以要这样,是因为 CPU 在同一时刻只能执行一个线程,为了实现多线程并发执行,需要不断地在多个线程之间切换。为了让用户感觉多个线程是在同时执行的, CPU 资源的分配采用了时间片轮转的方式,线程在时间片内占用 CPU 执行任务。当线程使用完时间片后,就会让出 CPU 让其他线程占用。

2025-07-28 10:35:19 655

原创 JavaSE知识点(3)

序列化(Serialization)是指将对象转换为字节流的过程,以便能够将该对象保存到文件、数据库,或者进行网络传输。反序列化(Deserialization)就是将字节流转换回对象的过程,以便构建原始对象。反射允许Java在运行时检查和操作类的方法和字段。通过反射,可以动态地获取类的字段、方法、构造方法等信息,并在运行时调用方法或访问字段。反射功能主要通过类及包中的类如 Method, Field, Constructor 等来实现。

2025-07-27 16:07:15 1187

原创 JavaSE知识点(2)

可以,抽象类可以有构造方法接口主要用于定义一组方法规范,没有具体的实现细节hashCode()方法的作⽤是获取哈希码,它会返回⼀个 int 整数,定义在Object 类中, 是一个本地⽅法。

2025-07-27 15:06:19 994

原创 JavaSE知识点(1)

跨平台就是Java语言编写的程序一次编译后,可以在多个操作系统上运行。原理就是JVM。

2025-07-27 10:38:41 945

原创 java集合框架知识点(2)

①、HashMap 是基于数组+链表+红黑树实现的,put 元素的时候会先计算 key 的哈希值,然后通过哈希值计算出元素在数组中的存放下标,然后将元素插入到指定的位置,如果发生哈希冲突,会使用链表来解决,如果链表长度大于 8,会转换为红黑树。②、TreeMap 是基于红黑树实现的,put 元素的时候会先判断根节点是否为空,如果为空,直接插入到根节点,如果不为空,会通过 key 的比较器来判断元素应该插入到左子树还是右子树。扩容时,HashMap 会创建一个新的数组,其容量是原来的两倍。

2025-07-26 16:08:42 698

原创 java集合框架知识点(1)

java中的队列主要是通过Queue接口和并发包下的BlockingQueue两个接口来实现的优先级队列 PriorityQueue 实现了Queue接口,是一个无界的队列,他的元素按照自然顺序排序或者Compartor比较器排序双端队列ArrayDeque也实现了Queue接口,是一个基于数组的,可以在两端插入和删除元素的队列。LinkedList实现了Queue接口的子类Deque,所以也可以当做双端队列来使用。

2025-07-26 09:44:14 982

原创 计算机网络知识点总结 (2)

泛洪攻击(SYN Flood Attack)是一种常见的 DoS(拒绝服务)攻击,攻击者会发送大量的伪造的 TCP 连接请求,导致服务器资源耗尽,无法处理正常的连接请求。半连接服务拒绝,也称为 SYN 洪泛攻击或 SYN Flood。所谓的半连接就是指在 TCP 的三次握手过程中,当服务器接收到来自客户端的第一个 SYN 包后,它会回复一个 SYN-ACK 包,此时连接处于“半开”状态,因为连接的建立还需要客户端发送最后一个 ACK 包。

2025-07-24 22:48:04 997

原创 计算机网络知识点总结 (1)

幂等就是可以重复执行但是执行结果都是一致的在正确实现的条件下,GET、HEAD、PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是。

2025-07-24 21:27:17 705

原创 Https以及CA证书

HTTPSHTTP 加上加密处理和认证以及完整性保护后即是 HTTPS。它是为了解决 HTTP 存在的安全性问题,而衍生的协议,那使用 HTTP 的缺点有:1.通信使用明文可能会被窃听2.不验证通信方的身份可能遭遇伪装3.无法验证报文完整性,可能已遭篡改HTTPS 并非是一种新协议,只是 HTTP 通信接口部分用 SSL 和TLS协议代替。通常,HTTP 是直接跟TCP通信,当使用了 SSL 后,则变成先和 SSL 通信,再有 SSL 和 TCP 通信。

2025-07-23 21:37:45 1038

原创 DNS域名解析的过程

DNS,全称Domain Name System,域名系统,是一个记录域名和Ip地址相互映射的一个系统,能够将用户访问互联网时使用的域名地址转换成对应的IP地址,而不用使用者去记住数量众多的IP地址。通过域名得到域名对应的IP地址的过程被称为域名解析。DNS运行于UDP协议之上,使用的端口为53。如上图所示,域名结构是树状结构,树的最顶端代表根服务器,根的下一层就是由我们所熟知的.com、.net、.cn等通用域和.cn、.uk等国家域组成,称为顶级域。网上注册的域名基本都是二级域名,比如。

2025-07-23 21:08:49 959

原创 Spring 核心知识点梳理 2

④、ISOLATION_REPEATABLE_READ:可重复读,确保事务可以多次从一个字段中读取相同的值,即在这个事务内,其他事务无法更改这个字段,从而避免了“不可重复读”,但仍可能发生“幻读”问题。⑤、ISOLATION_SERIALIZABLE:串行化,这是最高的隔离级别,它完全隔离了事务,确保事务序列化执行,以此来避免“脏读”、“不可重复读”和“幻读”问题,但性能影响也最大。事务的传播机制定义了方法在被另一个事务方法调用时的事务行为,这些行为定义了事务的边界和事务上下文如何在方法调用链中传播。

2025-07-22 23:21:10 839

原创 Spring 核心知识点梳理 1

IoC 控制反转是一种设计思想,它的主要作用是将对象的创建和对象之间的调用过程交给 Spring 容器来管理。AOP 面向切面编程,简单点说就是把一些通用的功能从业务代码里抽取出来,统一处理。自动装配的本质就是让 Spring 容器自动帮我们完成 Bean 之间的依赖关系注入,而不需要我们手动去指定每个依赖。自动装配的工作原理简单来说就是,Spring 容器在启动时自动扫描指定包路径下的所有类,然后根据类上的注解,比如@Autowired@Resource等,来判断哪些 Bean 需要被自动装配。

2025-07-22 23:07:46 1096

原创 MySQL 核心知识点梳理(5)

事务对数据进行修改前,会记录一份快照到 Undo Log,如果事务中有任何一步执行失败,系统会读取 Undo Log 将所有操作回滚,恢复到事务开始前的状态,从而保证事务要么全部成功,要么全部失败。读已提交会在更新数据前加行级排他锁,不允许其他事务写入或者读取未提交的数据,也就意味着事务2 不能在事务 1 提交之前读取到事务1 修改的数据,从而解决脏读的问题。读已提交避免了脏读,但可能会出现不可重复读,即同一事务内多次读取同一数据结果会不同,因为其他事务提交的修改,对当前事务是可见的。

2025-07-22 02:12:31 1155

原创 MySQL 核心知识点梳理(4)

当使用非聚簇索引进行查询时,MySQL 需要先通过非聚簇索引找到主键值,然后再根据主键值回到聚簇索引中查找完整数据行,这个过程称为回表。回表通常需要访问额外的数据页,如果数据不在内存中,还需要从磁盘读取,增加 I/O 开销。什么情况下必然会触发回表?第一,当查询字段不在非聚簇索引中时,必须回表到主键索引获取数据。第二,查询字段包含非索引列(如 SELECT *),必然触发回表。最左前缀原则指的是:MySQL 使用联合索引时,必须从最左边的字段开始匹配,才能命中索引。查询条件是否触发索引?说明。

2025-07-22 01:50:47 798

原创 MySQL 核心知识点梳理(3)

MySQL 中有一个叫 long_query_time 的参数,原则上执行时间超过该参数值的 SQL 就是慢 SQL,会被记录到慢查询日志中。当不能使用索引生成排序结果的时候,MySQL 需要自己进行排序,如果数据量比较小,会在内存中进行;如果数据量比较大就需要写临时文件到磁盘再排序,我们将这个过程称为文件排序。

2025-07-21 22:43:39 809

原创 MySQL 核心知识点梳理(2)

redolog的大小是固定的,使用环形的方法写入`,满了就会把最早的给覆盖掉,为了避免覆盖没有持久化的,会定期执行checkPoint,把内存的数据页刷到磁盘,然后记录checkPoint点,重启时,MySQL 只会重放 CheckPoint 之后的 Redo Log,从而提高恢复效率。binlog 关注的是逻辑变更的全局记录;Buffer Pool 是 InnoDB 存储引擎中的一个内存缓冲区,它会将经常使用的数据页、索引页加载进内存,读的时候先查询 Buffer Pool,如果命中就不用访问磁盘了。

2025-07-21 20:51:17 848

原创 MySQL 核心知识点梳理(1)

数据库是按照数据结构来组织、存储和管理数据的仓库,它是计算机系统中用于高效存储和处理数据的核心组件。分为关系型数据库和非关系型数据库.

2025-07-21 17:25:42 1167

原创 一文彻底解释清楚Java 中的NIO、BIO和AIO

IO 是 Java 中比较重要,且比较难的知识点,主要是因为随着 Java 的发展,目前有三种 IO 共存。分别是 BIO、NIO 和 AIO。BIO 全称 Block-IO 是一种的通信模式。是一个比较传统的通信方式,模式简单,使用方便。但并发处理能力低,通信耗时,依赖网速。javaNIO,全程 Non-Block IO ,是 Java SE 1.4 版以后,针对网络传输效能优化的新功能。是一种的通信模式。

2025-07-21 15:39:41 346

原创 Mysql Explain详解

我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extraid:选择标识符select_type: 表示查询的类型table: 输出结果集的表partitions: 匹配的分区type:表示表的连接类型possible_keys:表示查询

2025-07-20 18:00:09 732

原创 分布式面试点

的设计目标是对业务无侵入,因此它是从业务无侵入的两阶段提交(全局事务)着手,在传统的两阶段上进行改进,他把一个分布式事务理解成一个包含了若干分支事务的全局事务。计数器比较简单粗暴,比如我们要限制 1s 能够通过的请求数,实现的思路就是从第一个请求进来开始计时,在接下来的 1s 内,每个请求进来请求数就+1,超过最大请求数的请求会被拒绝,等到 1s 结束后计数清零,重新开始计数。,是两阶段提交的一个变种,针对每个操作,都需要有一个其对应的确认和取消操作,当操作成功时调用确认操作,当操作失败时调用取消操作。

2025-07-18 22:20:25 562

原创 消息队列和RockMQ篇(含面试点)

1.通过异步处理提高系统性能2.削峰/限流3.降低系统的耦合性。

2025-07-17 21:57:14 675

原创 腾讯云服务上下载docker以及使用Rabbitmq的流程

接着在我们本机浏览器上搜索 云服务器ip地址+端口号 就可以看到RabbitMQ 登录界面。(显示容器 ID 和名称):说明容器存在但已停止,直接启动即可。如果没有我们则需要看看是不是Rabbitmq是不是已经停止了。执行以下命令,添加 Docker 软件源并配置为腾讯云源。执行以下命令,查看已添加的 Docker 软件源。执行以下命令,安装 Docker。,则端口已开放,此时在浏览器访问。:说明容器已被删除,需要重新创建。执行以下命令,运行 Docker。执行以下命令,检查安装结果。

2025-07-17 17:46:45 375

原创 ConcurrentHashMap原理详解(很细------带源码解析)

ConcurrentHashMap和HashMap一样,是一个存放键值对的容器。是线程安全的HashMap。专门用于多线程环境.

2025-07-16 19:13:56 871

原创 ThreadLocal

多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。

2025-07-14 19:13:54 1015

原创 进程,协程,线程的联系与区别

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。进程控制块P C B是 进程 存在的唯一标识,这意味一个 进程 一定会有对应的PCB,进程消失,P C B也会随之消失P C B通过链表的方式进行组织,把具有相同状态的进程链在一起,组成各种队列。

2025-07-14 14:43:45 713

原创 代理模式详解

虽然相对于静态代理,动态代理大大减少了我们的开发任务,同时减少了对业务接口的依赖,降低了耦合度。但是JDK自带动态代理只能支持实现了Interface的类。JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLIB了。CGLIB采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。但因为采用的是继承,所以不能对final修饰的类进行代理。

2025-07-14 01:33:35 270

原创 适配器模式详解

可以让任何两个没有关联的类一起运行。提高了类的复用,可以一致化多个不同接口。将现有接口实现类隐藏,增加了类的透明度。灵活性高,可自由适配。过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。某些适配工作可能非常困难,例如让房子飞起来。当我们有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

2025-07-14 01:15:42 405

原创 工厂模式详解

首先来说简单工厂,简单工厂模式,又叫做静态工厂模式(Static Factory Method),由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。属于创建型模式,但不属于GOF23设计模式。工厂方法模式(Factory Method),又称多态性工厂模式,属于设计模式三大分类中的创建型模式,作为抽象工厂模式的孪生兄弟,工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,也就是说工厂模式让实例化推迟到子类。

2025-07-14 01:05:54 806

原创 单例模式详解

上述两种实现方式中,最推荐这种优化后的饿汉式实现,利用static保证线程安全,利用静态内部类节约了空间,实现lazy-loading(懒加载),而且代码非常简短,可谓一箭三雕。上述传统方式中,由于类加载时就实例化对象,因此当我们调用这个类的其它静态方法时,也会触发类加载,从而实例化单例独享,会导致空间的暂时浪费。传统实现方式中,每次获取实例都要被synchronized关键字串行化,即使已经生成了对象实例。而我们加锁的目的是为了防止生成多个实例,因此其实只需要对生成实例的代码加锁.

2025-07-13 23:57:17 329

原创 虚拟线程,多线程,单线程

主要动机是为了克服传统“线程-每-请求”模型的可伸缩性限制。平台线程是重量级资源。创建过多平台线程会耗尽内存,并导致操作系统施加的高昂上下文切换成本,从而限制应用程序的吞吐量,尤其是在 I/O 密集型任务(线程大部分时间在等待网络、磁盘或数据库操作)中。引入虚拟线程是为了让应用程序能够高效处理极大数量的并发任务,同时强迫开发者采用复杂的异步编程模型(如响应式流或链),从而保持更简单、更熟悉的同步阻塞式编程风格。其目标是实现高吞吐量和高开发者生产力。

2025-07-13 18:51:38 358

原创 《Java 虚拟机内幕:从垃圾回收到类加载的深度解析》

如果允许,那会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行一次Minor GC,尽管这次Minor GC是有风险的;双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。

2025-07-11 17:39:59 899

原创 深入剖析 JVM:内存布局、对象模型与垃圾收集机制全解析

栈1.本地方法栈 调用的本地方法需要的参数存到这里2.虚拟机栈每一个方法的执行都包含一个栈针入栈出栈的过程存放局部变量以及临时数据存储区,存储中间计算结果和操作数程序计数器 指向下一行执行的代码行号 -->唯一一个没有规定OOM。

2025-07-10 23:19:32 598

原创 HashMap中的get,put方法源码解析(超详细)

HashMap中的get方法,点进来发现hash(key)getNodenull先进行判断 如果tab是空 直接返回null不是的话进行往下判断 先判断头结点的hash值以及key值是否和目标相等,相等返回头结点。为什么要对头结点单独进行一次判断呢 因为头结点是最常被访问到的,单独对头节点进行检查,能够避免执行遍历链表或树的操作,从而显著提升查找的效率。如果不是头结点,继续往下判断,判断是否是红黑树,是的话通过getTreeNode在树中查找,不是就在链表中遍历比对,找到了返回,然后移动下一个节点。

2025-07-09 21:27:04 604

空空如也

空空如也

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

TA关注的人

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