- 博客(120)
- 资源 (2)
- 收藏
- 关注
原创 高并发下,Redis 和 MySQL 如何保证数据一致性?
摘要:Redis与MySQL数据一致性方案主要有三种:1)先更新MySQL再更新Redis,适合读多写少场景,需处理Redis更新失败风险;2)先删除Redis再更新MySQL,适用于写频繁场景,通过后续读请求重建缓存;3)基于MySQL binlog的异步同步,适合强一致性需求,通过监听binlog实现缓存与数据库解耦。三种方案各有适用场景,需根据业务特点选择,兼顾性能与一致性。(149字)
2025-11-05 09:00:00
333
原创 guava Cache入门Demo
本文介绍了使用Guava缓存库实现本地缓存的示例。首先引入Guava依赖,然后通过Demo展示了缓存构建、配置过期策略、缓存加载逻辑和使用方法。测试结果验证了缓存的命中、过期重新加载和手动清除等功能。文章分析了Guava缓存的适用场景,包括热点数据缓存、减轻数据源压力等,并指出了内存限制、不支持分布式等关键注意事项。该缓存适合单机应用下的高性能数据缓存需求。
2025-11-02 21:20:21
411
原创 Kafka的leader epoch 和 high watermark 如何解决数据不可重复读,数据冲突问题?
Kafka通过High Watermark(HW)和Leader Epoch机制协同保障数据一致性:HW作为"安全读取边界",确保消费者只能读取ISR副本确认的消息,避免读取未确认数据;Leader Epoch则通过任期标识解决Leader切换时的日志冲突,防止旧日志覆盖新数据。二者共同作用,HW管理读端一致性,Leader Epoch维护写端一致性,无论Leader如何切换都能保证数据不重复、不冲突,实现端到端的可靠性。
2025-10-30 08:15:00
401
原创 docker学习笔记,从入门开始!
本文摘要:本文详细介绍了Docker在CentOS系统上的安装、配置和使用方法。主要内容包括:1)通过阿里云镜像配置Docker的yum源;2)Docker的安装、启动及镜像加速配置;3)常用镜像操作命令(搜索、下载、查看、删除);4)容器管理(启动、停止、日志查看等);5)数据存储方案(目录挂载和卷映射);6)自定义网络配置及实例测试;7)Docker Compose批量容器管理。文章还提供了Redis主从集群、MySQL等具体应用场景的配置示例,是一份全面的Docker使用指南。
2025-10-29 22:14:18
1020
原创 Kafka 去掉 ZooKeeper 依赖后有哪些优势?
**摘要:**Kafka去ZooKeeper依赖(KRaft模式)有三大核心优势:1)架构简化,消除外部依赖,避免ZooKeeper故障影响Kafka;2)性能提升,元数据操作延迟降低50%以上,支持百万级分区;3)运维成本降低40%,无需维护两套系统,减少兼容性问题。此外,集群启动时间缩短至1/3,可用性显著提升。(150字)
2025-10-16 09:30:00
480
原创 RocketMQ 会不会重复消费?如何避免?如何处理?
RocketMQ重复消费的核心原因是消费确认失败导致消息重新投递。解决方法分两步:从源头减少重复,可通过合理ACK时机、优化消费配置和保障消费端稳定性;根本解决需实现幂等性,常用方案包括:基于唯一ID去重、使用分布式锁和利用数据库唯一键约束。其中确保"先处理业务再ACK"是关键,既能避免消息丢失,又能通过后续幂等处理保证正确性。
2025-10-15 09:00:00
382
原创 RocketMQ 如何保证消息的顺序性?
RocketMQ通过"分区内有序、跨分区无序"机制保证消息顺序性。生产者需将关联消息路由至同一分区(如按业务ID哈希),消费者则需单线程处理同一分区消息。异常时应启用重试机制避免顺序错乱。全局顺序需设置单分区,但会降低并发性能。该方案适用于需要局部顺序的业务场景(如订单流程),而全局顺序仅适合低并发场景。
2025-10-14 09:00:00
826
原创 垃圾收集算法了解吗?
摘要:JVM垃圾收集算法主要分为4类:1)标记-清除算法简单但会产生内存碎片;2)复制算法解决碎片问题但内存利用率低;3)标记-整理算法兼顾碎片和利用率但移动开销大;4)分代收集算法是商用主流,将堆分为年轻代和老年代,分别采用复制算法和标记清除/整理算法,结合各算法优势。目前HotSpot等JVM多采用基于分代思想的组合算法如G1、ZGC等,以平衡内存利用率和收集效率。(149字)
2025-10-13 10:30:00
378
原创 notify和notifyAll唤醒等待线程的区别?
摘要:Java重量级锁维护三个队列:entryList(尾部添加/头部取)、CXQ(头部添加/取)、waitSet(单向回环)。notify()唤醒时,若entryList空则加入CXQ头节点,否则加入entryList尾节点;notifyAll()则将所有waitSet线程加入CXQ头节点。notify()避免惊群效应但可能引发线程饥饿,notifyAll()确保公平性但增加锁竞争开销。两种唤醒方式后续都优先处理entryList头节点,其次CXQ头节点。
2025-10-12 10:00:00
350
原创 重量级锁的获取和释放过程是怎样的?
摘要:重量级锁的获取和释放涉及Monitor的三个关键结构:CXQ、Entry List和Wait Set。获取时,线程检查Monitor状态,未占用则直接获取,否则进入队列等待。释放分三种情况:正常执行结束、调用wait()主动释放或异常自动释放。wait()会将线程移入Wait Set,其他情况会唤醒队列中的线程参与竞争。整个过程实现了线程状态的有序流转和锁的安全管理。(148字)
2025-10-11 09:00:00
334
原创 LockSupport .park 方法和 Thread.sleep 方法的区别?
LockSupport.park()和Thread.sleep()的差异主要体现在: 唤醒机制:park()需unpark()主动唤醒,sleep()自动超时或中断唤醒 中断处理:park()保留中断状态,sleep()清除中断状态 锁关联性:两者都不释放锁,但park()与锁无关,sleep()常用于计时等待 (共计99字)
2025-10-10 09:30:00
225
原创 StampedLock 和 ReentrantLock 有什么区别?
StampedLock与ReentrantLock对比摘要(148字) StampedLock采用读写分离设计,支持乐观读(无锁校验)和悲观读/写锁,在读多写少场景性能显著优于ReentrantLock。后者仅提供悲观独占锁,需配合ReadWriteLock实现共享读但无乐观机制。关键差异:①StampedLock支持无锁读但需手动校验,ReentrantLock全阻塞;②StampedLock不可重入且无Condition,ReentrantLock支持重入和条件等待;③StampedLock适合高频读(
2025-10-09 09:30:00
409
原创 LockSupport.park 与 Object.wait 的方法的区别?
摘要:LockSupport.park()与Object.wait()的核心区别在于锁依赖:park()无需锁对象,可任意调用;wait()必须在synchronized块中使用。主要差异包括:park()无调用限制,由unpark()唤醒,不释放锁且保留中断状态;wait()需notify()唤醒,主动释放锁并清除中断状态。两者都会响应中断但处理方式不同。(99字)
2025-10-08 17:33:08
423
原创 如何搭建Redis的哨兵机制和集群?
搭建Redis哨兵机制和集群的核心是先配置基础Redis节点,再分别通过哨兵配置和集群命令完成部署,以下是极简实操步骤。
2025-10-08 08:30:00
371
原创 Redis 的哨兵机制和集群有什么区别?
Redis哨兵与集群的核心区别在于:哨兵是"1主N从"的高可用方案,仅解决故障自动切换问题,所有节点存储完整数据;而集群是"多主多从"的分布式方案,通过数据分片同时解决横向扩容和高可用问题。哨兵适合数据量不大的高可用场景,集群则适用于需要突破单机瓶颈的大规模场景。
2025-10-07 09:00:00
276
原创 如何判断对象仍然存活?
JVM通过可达性分析算法判断对象存活,以GC Roots(栈变量、静态变量、常量等)为起点遍历引用链,不可达对象标记为可回收。支持四种引用强度:强引用(不回收)、软引用(内存不足回收)、弱引用(GC即回收)和虚引用(仅跟踪回收)。相比引用计数法(有循环引用问题),可达性分析能准确识别无效对象,是HotSpot等主流JVM采用的核心机制。
2025-10-06 09:00:00
380
原创 内存泄露可能由哪些原因造成?
内存泄露的四大常见原因:1)长生命周期对象(如静态集合、单例)持有短生命周期对象引用;2)资源(IO流、数据库连接)未及时关闭;3)匿名内部类/Lambda隐式引用外部类导致对象无法释放;4)缓存未设置过期或清理机制。这些情况都会导致无用对象持续占用内存,最终引发内存耗尽。开发中需特别注意对象引用管理、资源释放和缓存策略,避免高频失误。
2025-10-05 08:30:00
873
原创 对象的内存布局
摘要:HotSpot虚拟机中对象的内存布局分为三部分:对象头(存储Mark Word和类指针等元数据,12/16字节)、实例数据(存储成员变量)和对齐填充(确保8字节对齐)。对象头包含锁状态、哈希码等动态信息;实例数据按类型紧凑排列;对齐填充提升CPU读取效率。以64位JVM为例,一个包含int和String引用的对象总大小为24字节(12+8+4)。这种结构优化了内存使用和访问性能。
2025-10-04 08:30:00
627
原创 请描述用 ZooKeeper 管理 Kafka 集群有哪些不足?
ZooKeeper管理Kafka集群存在三大核心缺陷:1)性能瓶颈,主从架构无法支撑海量元数据操作;2)架构强耦合,ZooKeeper故障直接影响Kafka核心功能;3)运维复杂,需独立维护两套系统。具体表现为元数据存储效率低、双集群维护成本高、故障传播风险大等问题。为此,Kafka 2.8.0推出KRaft模式,通过内置元数据管理完全取代ZooKeeper。
2025-10-03 08:00:00
409
原创 在做同城多活方案中如何实现机房之间的数据同步?
文章摘要:本文介绍跨机房数据同步的四种技术方案:1)数据库复制技术(MySQL主从复制、Oracle Data Guard);2)消息队列技术(Kafka、RocketMQ);3)分布式存储系统(如Ceph);4)ETL工具(Informatica、Talend)。每种方案各有特点,适用于不同业务场景,可根据数据一致性、延迟容忍度等需求选择合适方案。(98字)
2025-10-02 08:00:00
565
原创 RocketMQ 如何解决消息丢失问题
RocketMQ防止消息丢失的解决方案围绕生产、存储、消费三个环节展开:生产端通过同步发送+重试机制确保消息送达;存储端采用同步刷盘和主从同步策略保证消息持久化;消费端通过业务处理完成后再确认+重试队列机制保障消息被正确处理。这种全链路设计最大限度地降低了消息丢失风险。
2025-10-01 08:00:00
1399
原创 JVM 里 new 对象时,堆会发生抢占吗?JVM 是怎样来设计保证线程安全的?
JVM通过两种机制确保多线程下堆内存分配的线程安全:1)优先使用TLAB(线程本地分配缓冲区),为每个线程在Eden区预分配独立内存空间,避免直接竞争;2)当TLAB不足时,采用CAS原子操作配合失败重试机制,在共享堆内存中安全分配。这种"私有缓冲避竞争+原子操作解冲突"的设计,在保证安全性的同时最大限度减少了锁开销,兼顾了效率与可靠性。
2025-09-30 16:41:13
178
原创 简述一下 Redis 的事务实现。
Redis事务通过MULTI、EXEC、DISCARD、WATCH四命令实现,将多个命令打包顺序执行但不支持回滚。核心流程为:MULTI开启事务,命令入队后EXEC执行或DISCARD取消。特性包括:一次性执行(全成功或全不执行)、WATCH实现乐观锁、不支持回滚(出错命令不影响后续执行)。业务层需自行处理执行错误。
2025-09-30 09:00:00
304
原创 Redis 如何配置 Key 的过期时间?它的实现原理?
Redis通过4个核心命令配置Key过期时间,底层采用"过期字典+三种删除策略"机制实现高效管理。主要命令包括EXPIRE、PEXPIRE、SET with EX和PEXPIREAT,支持秒/毫秒级精度。实现原理上,Redis维护过期字典记录时间戳,结合惰性删除(访问时检查)、定期删除(100ms随机扫描)和内存淘汰(达到上限时触发)三种策略,在保证内存不溢出的同时平衡性能。通过TTL/PTTL命令可查询剩余过期时间。
2025-09-29 08:45:00
657
原创 java中数字取绝对值,结果一定不为负吗?
摘要: 计算机中,有符号整数取绝对值后可能仍为负数。以32位int为例,最小值-2147483648取绝对值时,结果2147483648超出最大值2147483647,导致溢出并回绕为原值。这是二进制补码的固有特性,仅影响最小负整数,其他情况结果均为非负数。
2025-09-29 08:30:00
147
原创 JVM原理:对象在内存中的存储结构是什么样的
文章摘要:Java对象在内存中的标准存储结构由三部分组成:对象头、实例数据和对齐填充。对象头包含Mark Word和Klass Pointer,存储对象状态和类型信息;实例数据保存成员变量值;对齐填充确保总大小为8字节的整数倍。以Person类为例,对象头占12字节,实例数据占8字节,总大小20字节(需填充至24字节)。其他语言如C++和Python的对象存储机制有所不同。该结构体现了JVM通过对象头管理对象,实例数据存储业务值,对齐填充满足内存对齐要求的特点。
2025-09-28 09:00:00
776
原创 对象分配在哪块内存?
JVM对象分配遵循分代策略:新对象优先分配到年轻代伊甸区;大对象直接进入老年代;存活时间长的对象从年轻代晋升到老年代;无逃逸对象可栈上分配。此外,线程本地分配缓冲(TLAB)可优化多线程环境下的对象分配效率。这种策略基于"大多数对象短命"的假设,通过分代管理和不同分配方式优化内存使用及GC效率。
2025-09-28 09:00:00
410
原创 JVM 里面的年轻代为什么分为Eden区和 survivor 区?
JVM年轻代采用Eden和Survivor分区设计,基于"90%对象短命"的特性优化GC效率。新对象先进入Eden区,Minor GC时快速回收死亡对象,存活对象转入Survivor区。两个Survivor区通过复制算法轮转筛选,对象存活满15次GC后晋升老年代。这种设计优势在于:1)Minor GC仅处理年轻代,速度快;2)复制算法避免内存碎片;3)多轮筛选确保只有长期存活对象进入老年代,减少Full GC频率。
2025-09-27 09:00:00
368
原创 什么是 TCP 的粘包拆包,以及如何解决?
TCP粘包/拆包是指TCP协议在传输数据时,由于其面向字节流的特性,无法像UDP那样区分数据包边界,导致发送方多次发送的数据包被接收方一次性接收(粘包),或单次发送的大数据包被TCP分割成多个小数据包发送(拆包)的现象。
2025-09-27 08:30:00
678
原创 动态代理有哪些实现?
动态代理技术通过运行时生成代理类实现方法增强,主要有JDK原生代理和CGLIB第三方库两种实现方式。JDK代理基于接口反射,要求目标类必须实现接口;CGLIB通过字节码生成子类代理,支持普通类但无法代理final方法。两者分别在Spring AOP中根据目标对象特性自动切换使用。此外,Javassist和ASM等底层字节码工具提供更灵活的代理实现,但复杂度较高。选择方案时需权衡功能需求、性能和维护成本。
2025-09-26 09:00:00
1089
原创 Hashmap 为什么选择红黑树来解决哈希冲突?
摘要: Java的HashMap采用红黑树解决哈希冲突,当链表长度超过阈值(如8)时,转为红黑树可将操作复杂度从O(n)优化至O(logn)。红黑树优于AVL树的关键在于:1)近似平衡特性(最长路径≤2倍最短路径)降低旋转成本,适合频繁动态操作;2)平衡查询效率与维护开销,避免普通二叉搜索树的退化风险;3)仅需1比特存储节点颜色,空间效率高,结构简单适配哈希桶场景。
2025-09-26 08:30:00
196
原创 正向代理和反向代理
正向代理和反向代理的核心区别在于代理服务器的“服务对象”和“作用场景”:正向代理服务于客户端,帮客户端访问外部资源;反向代理服务于服务器,帮服务器接收客户端请求。
2025-09-25 09:30:00
905
原创 线程和进程的区别
摘要: 进程与线程的核心区别在于资源分配和调度:进程是独立资源单位,拥有隔离的内存和文件;线程共享进程资源,仅保留私有栈和寄存器。进程切换成本高(需切换地址空间),线程切换更快(共享地址空间)。进程崩溃不影响其他进程,线程崩溃可能导致整个进程终止。线程通信更高效(直接共享内存),进程需通过IPC机制。进程适合隔离任务,线程适合高并发场景,两者共同支撑现代操作系统的多任务处理。
2025-09-25 09:00:00
342
原创 什么是堆外内存?怎么使用?
堆外内存是直接由操作系统管理、不受JVM垃圾回收机制管控的内存区域。其核心优势在于减少GC开销、突破堆内存限制并提升跨进程数据传输效率,适用于高性能中间件、大数据处理等场景。Java中主要通过DirectByteBuffer操作堆外内存,需手动申请和释放以防泄漏。Unsafe类和MappedByteBuffer也可实现相关功能,但存在兼容性风险或适合特定场景。使用时需权衡性能,重点关注内存释放问题。
2025-09-24 09:00:00
1023
原创 线程和协程的区别
摘要: 线程与协程的核心区别在于调度方式——线程由操作系统抢占式调度,协程由用户程序协作式控制。线程资源消耗高(MB级栈空间),切换需内核介入,适合CPU密集型任务;协程资源占用极低(KB级栈空间),切换在用户态完成,适合高并发I/O场景。简言之,线程是“系统管的兵”,协程是“程序员管的兵”,前者强制切换但开销大,后者轻量灵活需主动配合。
2025-09-24 08:30:00
349
原创 没有锁竞争时,synchronized 一定是偏向锁吗?
Java的synchronized锁在没有竞争时通常优先使用偏向锁,但存在例外情况:1)JVM默认延迟启用偏向锁,初始阶段会使用轻量级锁;2)显式禁用偏向锁参数;3)类曾发生过偏向锁撤销;4)调用了wait()/notify()方法会强制升级为重量级锁。这些场景下即使无竞争也无法使用偏向锁。
2025-09-23 17:43:07
245
原创 Nacos和Eureka有什么区别?
Nacos与Eureka的核心差异在于功能定位:Nacos作为一站式微服务治理平台,整合了服务注册发现、动态配置管理和服务治理能力;而Eureka仅专注于服务注册发现。Nacos支持AP/CP双模式,提供更丰富的健康检查机制,但部署复杂需依赖MySQL;Eureka仅支持AP模式,部署简单但功能单一且已停止更新。当前主流推荐Nacos,尤其适合需要"服务+配置"一体化解决方案的中小型微服务集群,而Eureka仅适用于无需配置管理的简单场景,但不推荐新项目使用。
2025-09-23 09:00:00
408
原创 谈一谈你对 Nacos 的理解,以及它的优点和缺点。
摘要: Nacos是阿里开源的微服务一站式解决方案,兼具服务注册发现与动态配置管理能力,支持Spring Cloud/Dubbo生态。其优势在于功能整合(替代Eureka+Apollo)、高可用集群、实时配置推送及可视化管控;但存在大规模并发性能瓶颈、安全控制较弱、依赖MySQL等不足。推荐中小规模微服务使用,超大规模或高安全场景需搭配其他组件优化。核心价值是降低微服务架构复杂度,平衡功能与运维成本。(150字)
2025-09-22 09:00:00
1657
原创 每天新增 1000 万条订单,如何实现快速导出?
摘要:实现每日1000万订单快速导出,需采取多维度优化策略:1)数据库使用滚动翻页代替传统分页;2)采用多线程并行处理数据;3)流式写入技术避免内存溢出;4)优先选择CSV格式或分sheet页存储;5)借助QuickAPI等专业工具提升效率;6)采用异步任务机制,通过任务ID跟踪状态。这些方法组合使用可显著提升大数据量导出性能。
2025-09-22 08:30:00
335
原创 每天新增1000万条订单,如何选择合适的数据库?
摘要:针对1000万条/天的订单数据处理,建议采用混合数据库架构,根据数据场景拆分选型。关系型数据库(MySQL/PostgreSQL)处理高并发实时写入,时序数据库(InfluxDB/TDengine)支持实时查询分析,列存数据库(ClickHouse)存储历史订单。最终架构组合写入层、查询层和归档层,同时排除纯MongoDB和Hadoop方案。这种混合方案兼顾写入性能、查询效率和存储成本,实现订单数据的全生命周期管理。(150字)
2025-09-21 21:09:42
522
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅