自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 什么是 BlockingQueue?都有哪些实现

BlockingQueue是Java中支持线程安全阻塞操作的队列接口,用于协调生产者和消费者线程。常见实现包括:ArrayBlockingQueue(固定容量数组)、LinkedBlockingQueue(可选容量链表)、SynchronousQueue(直接传递队列)、PriorityBlockingQueue(优先级排序)和DelayQueue(延迟元素处理)。

2025-06-04 15:30:21 241

原创 JDK动态代理是什么?和cglib区别?

JDK动态代理是Java基于接口实现的代理技术,通过反射机制在运行时生成代理类。与CGLib的区别:1. JDK需实现接口,CGLib通过继承直接代理普通类;2. JDK无需第三方库,CGLib需引入ASM包;3. CGLib无法代理final类/方法,JDK无法代理无接口类;4. CGLib生成代理类性能通常更高。

2025-06-04 15:29:31 524

原创 Java中的深拷贝、浅拷贝、引用拷贝

引用拷贝:复制对象引用地址,新旧变量指向同一对象。浅拷贝:创建新对象,复制基本类型值,引用类型仍指向原对象。深拷贝:完全复制对象及关联的所有子对象,新旧对象完全独立。实现方式:浅拷贝常用clone()方法(需重写),深拷贝需递归复制或序列化实现。核心区别:深拷贝隔离数据修改,浅拷贝和引用拷贝存在数据关联性。

2025-06-04 15:28:58 893

原创 ConcurrentHashMap 线程安全的具体实现方式

ConcurrentHashMap通过分段锁+CAS机制实现线程安全:1.JDK7采用Segment分段锁,不同段可并发操作;2.JDK8改为Node数组+链表/红黑树,使用synchronized锁单个桶节点;3.volatile保证变量可见性;4.CAS实现无锁化原子操作;5.扩容时多线程协同迁移数据。

2025-06-04 15:28:14 1014

原创 HashMap底层原理和扩容机制

HashMap底层采用数组+链表/红黑树结构,通过哈希算法确定元素存储位置。默认初始容量16,负载因子0.75,当元素数量超过(容量×负载因子)时触发扩容。扩容时创建双倍容量新数组,通过高位运算重新计算节点位置(JDK8优化为无需重新hash),原数据通过尾插法迁移到新数组。链表长度超过8且数组长度≥64时会转为红黑树,提升查询效率。

2025-06-03 15:03:10 1018

原创 哪些线程安全的集合?举例你是怎么使用的?

常见线程安全的集合包括ConcurrentHashMap、CopyOnWriteArrayList和BlockingQueue系列。例如在多线程统计时使用ConcurrentHashMap的compute方法保证原子计数,用CopyOnWriteArrayList维护监听器列表避免遍历时加锁,通过LinkedBlockingQueue实现生产者-消费者任务队列。Java并发包中的集合通过分段锁或写时复制机制实现高效线程安全。

2025-06-03 14:47:47 443

原创 你对反射的了解

Java反射是程序在运行时检查、修改自身结构和行为的能力。通过获取类型信息可动态创建对象、调用方法或访问属性,常用于框架开发与序列化等场景。

2025-06-03 14:44:03 306

原创 Redis的集群模式

Redis集群模式是一种分布式解决方案,通过分片(16384个哈希槽)将数据分散到多个节点,支持自动数据迁移和故障转移。每个节点可为主从结构,主节点处理读写,从节点备份并在主节点故障时接替,实现高可用。客户端通过重定向机制访问数据,无需代理,支持横向扩展与容错。

2025-05-30 21:00:00 738 1

原创 Redis的大key,为什么会产生大key

Redis大key指存储超大值(如字符串过大、集合元素过多)的键。主要成因包括:1.设计不合理,未拆分数据结构;2.业务需求(如缓存整页数据);3.数据持续积累未清理;4.使用不当的集合类型(如无序存储海量数据)。大key易引发内存不均、操作阻塞等问题。

2025-05-30 19:00:00 938

原创 Redis IO多路复用模型

Redis采用IO多路复用技术实现单线程高并发,通过select/epoll等系统调用监控多个网络连接状态。当某个socket就绪(可读/可写)时,主线程通过事件分派器触发对应操作,避免传统阻塞IO的资源浪费。该模型在单线程中实现高效请求处理,减少上下文切换开销,支撑Redis高吞吐量特性。

2025-05-30 07:00:00 581

原创 Redis的事务

Redis事务通过MULTI、EXEC命令组合多个操作按顺序执行,保证原子性(整体执行但不支持回滚)。若命令入队时出现语法错误,整个事务会被拒绝;运行时错误不影响其他命令执行。支持WATCH命令实现乐观锁机制,监视键值变化时自动中断事务,适用于并发控制场景。

2025-05-29 19:00:00 815

原创 Redis的线程模型

Redis采用单线程处理命令请求,避免多线程竞争,保证原子性。主线程执行所有数据操作,非阻塞I/O多路复用处理高并发连接。从6.0版本开始支持多线程处理网络I/O(如解析请求/返回结果),但核心逻辑仍为单线程。异步任务(持久化等)由后台线程完成,不影响主线程性能。

2025-05-29 07:00:00 741

原创 用redis实现注册中心

服务注册:用Hash结构存储实例信息(HSET service:{服务名} 实例ID 元数据)。心跳续期:为每个实例设置String键并定期更新过期时间(SETEX)。健康检查:通过Lua脚本扫描过期心跳Key,清理失效实例。服务发现:通过HGETALL获取所有存活实例。主动下线:删除Hash中的实例数据及对应心跳Key。

2025-05-28 19:00:00 906

原创 使用 Redis 实现一个排行榜怎么做

使用 Redis 的 Sorted Set(有序集合)实现排行榜:1. 用 ZADD 命令添加成员及其分数2. 通过 ZREVRANGE 获取分数从高到低的排名3. ZRANK 可查询成员具体排名4. 结合 ZSCORE 获取成员具体分数5. 相同分数默认按字典序排序,可用时间戳作为辅助排序条件。

2025-05-28 07:00:00 903

原创 Redis中的Zset怎么实现的

Redis的Zset通过跳跃表和哈希表实现。哈希表存储成员到分数的映射以支持快速查询,跳跃表按分数排序成员以支持高效的范围操作。两者结合确保插入、删除和查询的时间复杂度为O(log n)。数据量小时可能使用压缩列表优化内存。

2025-05-27 07:00:00 896

原创 Redis中的String怎么实现的

Redis的String类型采用SDS(简单动态字符串)实现,结构包含长度、空闲空间和字符数组。支持二进制安全数据存储,自动预分配空间减少内存重分配次数,通过len字段实现O(1)时间复杂度获取长度,采用惰性空间释放策略优化性能。

2025-05-26 19:00:00 656

原创 Redis怎么实现延时消息

Redis可通过有序集合(ZSET)实现延时消息:将消息作为value,到期时间戳作为score存入ZSET。消费者轮询用ZRANGEBYSCORE获取到期消息,配合Lua脚本保证原子性获取和删除。也可结合键过期通知机制实现事件触发。

2025-05-26 07:00:00 783

原创 利用Redis实现一个分布式锁

使用Redis的SET命令配合NX(不存在时设置)、EX(过期时间)参数创建唯一键作为锁,并生成随机值标识客户端。获取锁失败时重试或退出,业务处理完成后校验随机值并用Lua脚本原子化删除键释放锁。需注意设置合理超时时间防止死锁,高可用场景可采用RedLock算法增强可靠性。

2025-05-25 19:00:00 503

原创 如何实现Redis高可用

实现Redis高可用主要通过以下方式:1. 主从复制架构实现数据冗余备份;2. 哨兵模式(Sentinel)监控主节点并自动故障转移;3. 集群模式(Redis Cluster)通过数据分片和节点互备提供分布式高可用;4. 配合持久化机制保障数据安全;5. 部署多机房容灾架构应对网络分区。

2025-05-25 15:00:00 549

原创 Redis的缓存淘汰策略

Redis提供多种缓存淘汰策略,包括:volatile-lru(针对过期键的LRU淘汰)、allkeys-lru(全体键LRU)、volatile-lfu(过期键LFU)、allkeys-lfu(全体键LFU)、volatile-ttl(优先淘汰剩余时间短的键)、volatile-random/ allkeys-random(随机淘汰),以及默认的noeviction(禁止写入)。策略根据内存上限自动触发,用于管理内存不足时的数据清理。

2025-05-25 10:21:49 785

原创 Redis的持久化策略

Redis提供两种持久化策略:RDB和AOF。RDB通过定时生成数据快照实现,适合快速恢复但可能丢失部分数据;AOF记录所有写操作命令,数据完整性更高但文件较大。此外,Redis支持混合持久化模式(AOF+RDB),结合两者优势实现高效备份与恢复。

2025-05-25 10:19:31 526

原创 Redis的单线程架构

Redis采用单线程处理命令请求,避免了多线程的上下文切换和锁竞争,保证原子性操作。其基于内存的高效执行和I/O多路复用模型支撑了高并发性能。网络I/O和持久化操作(如RDB/AOF)由后台多线程或子进程处理,主线程仅专注于核心逻辑。单线程架构简化了设计,但需避免耗时命令阻塞整个服务。Redis 单线程性能优异的核心原因在于其 极简的设计理念 和 高效的技术选型,结合内存操作、非阻塞 I/O 多路复用、原子性执行等特性,使其在特定场景下能轻松支撑 10万+ QPS。以下是具体原因分析:首先明确:Redis

2025-05-24 15:30:00 608

原创 Redis的数据类型

String:存储文本、数字或二进制数据。List:双向链表,支持队列和栈操作。Hash:字段-值映射,适合存储对象。Set:无序唯一集合,支持交并差运算。Sorted Set:按分数排序的有序集合。扩展类型含Bitmaps、HyperLogLog、地理空间及Stream(消息队列)。

2025-05-24 09:00:00 471

原创 JDK的监控和 线上处理的一些case

JDK监控常用工具包括JConsole、VisualVM、JMC等,用于实时查看内存、线程、GC状态。线上常见问题处理:内存泄漏通过heap dump分析对象引用链;频繁GC可调整-Xmx/-Xms或更换垃圾回收器;线程死锁用jstack生成线程快照定位;使用Arthas在线诊断方法执行耗时及热更新代码;借助JMX或Prometheus+Grafana实现指标可视化监控。

2025-05-23 15:00:00 704

原创 jvm参数都有哪些

常见JVM参数包括:内存设置:-Xms(初始堆)、-Xmx(最大堆)、-Xss(线程栈)垃圾回收器:-XX:+UseG1GC(G1回收器)、-XX:+UseParallelGC(并行回收)监控调试:-XX:+HeapDumpOnOutOfMemoryError(OOM生成堆转储)性能优化:-XX:MaxMetaspaceSize(元空间上限)日志参数:-Xloggc(GC日志路径)

2025-05-23 09:00:00 2295

原创 出现full gc的情况都有哪些

出现Full GC的常见情况包括:老年代空间不足(对象晋升失败或大对象分配)、显式调用System.gc()、方法区(元空间)内存耗尽、空间分配担保失败(Minor GC前老年代剩余空间不足),以及垃圾回收器自身机制触发(如CMS并发处理失败或G1回收周期阈值达到)。

2025-05-22 21:02:29 882

原创 双亲委派模型,如何打破它

双亲委派模型是Java类加载机制,子类加载器先委托父类加载器尝试加载类,避免重复加载并保证核心类安全。打破方式包括:1. 重写ClassLoader的loadClass()方法,自定义加载逻辑;2. 使用线程上下文类加载器,强制指定类加载器层级;3. SPI等场景通过反向委派(如JDBC驱动加载)绕过默认机制。自定义类加载器时,覆盖loadClass方法,改变委托逻辑(如不先委托父类,直接自己加载)。示例代码12345678910111213141516171819。

2025-05-22 21:01:41 1009

原创 类加载机制

类加载机制是JVM动态加载类的过程,包含加载、验证、准备、解析和初始化五个阶段。加载阶段读取.class文件生成Class对象;验证确保字节码合法;准备为静态变量分配内存并赋默认值;解析将符号引用转为直接引用;初始化执行静态代码块和变量赋值。各阶段顺序执行,确保类正确加载且符合安全规范。

2025-05-22 21:00:24 924

原创 G1收集器

G1(Garbage-First)是Java HotSpot虚拟机的低延迟垃圾收集器,采用分Region堆内存布局,兼顾年轻代和老年代回收。它通过并发标记和优先回收垃圾最多的Region(Garbage-First原则),实现可控的停顿时间预测(通过-XX:MaxGCPauseMillis参数)。适用于大内存、低延迟场景,替代了传统的CMS收集器,支持压缩整理避免内存碎片。

2025-05-22 20:59:34 753

原创 CMS垃圾回收器

CMS(Concurrent Mark Sweep)是Java的并发低停顿垃圾回收器,通过“初始标记-并发标记-重新标记-并发清除”四阶段实现,减少停顿时间。缺点包括内存碎片、浮动垃圾问题,且无法处理并发失败。已在JDK9被标记废弃,JDK14正式移除。

2025-05-22 20:58:36 586

原创 GC的可达性分析

GC可达性分析是判断对象存活的算法,从GC Roots(如栈局部变量、静态变量等)出发,遍历所有引用链。无法被Roots触及的对象视为垃圾,会被回收。此方法避免了循环引用问题,是主流JVM垃圾回收的基础机制。

2025-05-22 12:00:00 848

原创 JVM的垃圾回收算法

JVM主要垃圾回收算法包括:标记-清除(产生内存碎片)、复制算法(适合新生代)、标记-整理(适合老年代)。现代JVM多采用分代收集策略,结合不同算法管理新生代(复制)和老年代(标记-清除/整理)。还有增量、并发算法(如G1)减少停顿时间。

2025-05-22 09:00:00 279

原创 JVM内存模型

JVM内存模型主要包含堆(存放对象实例)、方法区(存储类信息、常量)、虚拟机栈(线程私有方法调用)、本地方法栈(Native方法)和程序计数器(线程执行位置)。堆和方法区线程共享,栈和程序计数器线程私有,直接内存通过堆外分配管理。

2025-05-22 07:00:00 615

原创 Mybatis的底层原理

MyBatis 作为一款流行的持久层框架,其底层原理围绕和展开。

2025-05-21 23:00:00 833

原创 Mybatis的插件原理

MyBatis 的插件机制是其核心扩展能力之一,通过动态代理和拦截器模型,允许开发者在 SQL 执行的关键节点插入自定义逻辑(如日志记录、性能监控、SQL 改写等)。• 逻辑插入:在intercept方法中,可通过invocation.getArgs()获取方法参数,通过invocation.proceed()调用原始方法,实现日志记录、SQL 改写等操作。• 方法拦截:当调用代理对象的方法时,会触发InvocationHandler的invoke方法,进而执行插件的intercept方法。

2025-05-21 21:00:00 832

原创 Mybatis中动态sql的作用

MyBatis 的动态 SQL 是其核心特性之一,通过灵活的标签和表达式,允许开发者根据运行时条件动态生成 SQL 语句。• 避免多条件分支硬编码:通过<choose>/<when>/<otherwise>实现多条件互斥选择,替代多个if-else判断。• 集合遍历生成 SQL:通过<foreach>标签遍历集合,生成IN语句或批量插入。• 按需更新字段:通过<set>标签动态生成UPDATE语句,避免冗余字段和末尾逗号。安全性:即使参数含恶意字符(如' OR 1=1 --),也会被转义为普通字符串。

2025-05-21 19:00:00 656

原创 MyBatis如何实现分页查询

MyBatis实现分页主要有三种方式:1. 使用RowBounds对象进行内存分页(适用于小数据量);2. 在SQL中直接编写LIMIT/OFFSET语句(如MySQL);3. 通过分页插件(如PageHelper)自动拦截SQL并添加分页逻辑。物理分页推荐使用插件或数据库方言实现,避免内存溢出风险。

2025-05-21 17:00:00 721

原创 说一下 MyBatis 和 MyBatis Plus 的区别

MyBatis是基础ORM框架,需手动编写SQL与配置;MyBatis Plus是其增强工具,提供通用Mapper、自动生成SQL、内置分页等功能,简化CRUD操作开发。后者基于前者扩展,减少代码量但保留MyBatis灵活性。

2025-05-21 15:00:00 602

原创 Mybatis如何防止sql注入

Mybatis通过预编译机制和参数绑定防止SQL注入。使用#{}占位符时,参数会被转义并作为预编译参数传递,避免拼接SQL语句。动态SQL标签(如<if>)会自动处理参数安全,框架内部采用PreparedStatement确保参数与指令分离。避免使用${}进行字符串拼接可降低注入风险。

2025-05-21 13:00:00 2413

原创 MyBatis里如何实现一对多关联查询

在MyBatis中实现一对多关联查询可通过两种方式:1)在XML映射文件中使用`<collection>`标签,通过嵌套结果集(联表查询)或嵌套查询(分次查询)关联子表数据;2)使用注解方式通过`@Results`和`@Result`注解,结合`@Many`指定子查询方法。需在实体类中定义包含多个子对象的集合属性,并通过column参数传递关联字段。

2025-05-21 08:57:47 916

空空如也

空空如也

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

TA关注的人

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