- 博客(55)
- 收藏
- 关注
原创 后端面经记录
数据库相关问题摘要 INT类型括号长度:仅用于显示宽度(如ZEROFILL补零),不影响存储和计算,可不设置。 INT(11)与INT(5):括号数字仅控制显示格式,不影响实际存储。INT(11)显示100为"00000000100"(ZEROFILL时),INT(5)显示100000仍为原值。 日期类型选择:跨国系统推荐TIMESTAMP(自动时区转换),但需注意2038年限制;备选方案是datetime+应用层时区处理。 VARCHAR长度:最大长度受字符集影响(utf8mb4约16
2025-12-18 15:40:57
627
原创 AOP 的实现原理是动态代理,动态代理有什么缺陷呢?
文章摘要 AOP动态代理的缺陷 动态代理是Spring AOP的核心实现方式,包括JDK动态代理和CGLIB动态代理,但存在适用范围、性能开销、功能限制等固有缺陷。JDK代理要求目标类必须实现接口,而CGLIB无法代理final类或方法。动态代理的性能开销主要体现在运行时生成代理类和反射调用上,且无法代理私有方法或内部调用。调试复杂度和兼容性问题也是动态代理的短板。解决方案包括规避final修饰、拆分内部调用或改用AspectJ编译期织入。 反射的缺点 反射机制虽然灵活,但存在显著性能开销,比静态调用慢50
2025-12-17 09:41:42
417
原创 concurrent hashmap原理,扩容,扩容时怎么保证线程安全?
摘要: ConcurrentHashMap(CHM)是JUC包下的并发安全哈希表,JDK1.7采用分段锁(Segment),1.8优化为Node数组+CAS+桶级synchronized,锁粒度更细。扩容机制上,1.7为Segment内局部扩容,1.8支持多线程协助全局扩容,通过sizeCtl状态控制、ForwardingNode占位和桶级锁保障线程安全。1.8的设计在扩容时仍保持高并发读写,通过四层机制(状态标识、CAS、synchronized和转发节点)确保数据一致性,性能显著优于1.7版本。
2025-12-16 16:21:30
568
原创 redis和mysql有什么区别,以及redis和mysql都有什么缺点,以及什么地方redis不如mysql?
Redis与MySQL的核心差异源于设计定位不同:Redis作为内存型NoSQL数据库,主打高性能读写,适合缓存、高频数据存取;MySQL作为磁盘型关系数据库,侧重数据持久化、事务一致性和复杂查询。Redis的劣势包括内存成本高、数据容量受限、事务能力弱、持久化风险大、缺乏复杂查询支持等。MySQL则在强事务、海量存储、复杂分析、数据完整性等方面表现更优。两者互补而非替代,业务中通常组合使用——Redis处理热点数据,MySQL存储核心业务数据。选择时需根据场景需求权衡性能、成本与功能完备性。
2025-12-16 10:49:10
994
原创 为什么要有虚拟内存,直接访问物理内存不可以吗,怎么理解内存隔离性,还有就是为什么要划分用户态和内核态?
摘要: 虚拟内存解决了物理内存直接访问的冲突、碎片化和利用率问题,通过虚拟地址映射和页表管理实现内存隔离与安全。内存隔离性确保进程间互不干扰,是多任务运行的基础。用户态/内核态的划分通过CPU权限分级,限制用户程序直接操作内核和硬件,必须通过系统调用访问特权资源,保障系统安全稳定。三者共同支撑现代操作系统的多任务、高可用特性。例如,Java程序OOM不会影响其他进程,因其拥有独立虚拟内存空间;用户程序读写磁盘需通过系统调用陷入内核态,由内核统一处理硬件操作。
2025-12-16 10:36:16
537
原创 操作系统是怎么创建进程和线程的?
本文从底层原理角度解析了操作系统创建进程和线程的关键差异。进程创建需要分配独立资源(内存、文件描述符等),涉及PCB分配、内存空间初始化等开销较大的操作;线程创建则仅需分配TCB和独立栈空间,共享进程资源,开销显著降低。文章详细对比了两者的系统调用流程、核心数据结构和性能差异,并延伸至Java开发场景,说明Java线程与OS内核线程的对应关系及线程池的性能优化原理。理解这些底层机制有助于开发者设计高效并发系统,如合理配置线程池参数等。
2025-12-16 10:04:48
721
原创 kafka选型
本文针对秒杀项目中的Kafka选型问题,从业务需求和技术特性两方面进行结构化分析。重点对比了Kafka与RabbitMQ在高并发场景下的表现,突出Kafka在吞吐量(百万级TPS)、可靠性(多副本机制)和扩展性(分区机制)方面的优势。同时阐述了Kafka消息回溯能力对故障恢复的帮助,以及其与SpringBoot技术栈的良好兼容性。最终结论表明,Kafka的高吞吐、高可靠和易扩展特性完美契合秒杀项目需求,是更优的选型方案。
2025-12-15 10:10:55
910
原创 ConcurrentHashMap size () 流程
本文深入解析了 ConcurrentHashMap 的 size() 方法在不同JDK版本中的实现差异。JDK7采用分段锁机制,通过3次无锁尝试失败后加全局锁保证计数准确性;JDK8则基于无锁设计,使用 baseCount 和 CounterCell[] 实现分段计数,始终返回近似值以换取更高性能。文章对比了两者在并发控制、计数准确性和性能上的核心差异,并解答了常见面试问题,揭示了并发容器在计数准确性与性能之间的权衡思路。
2025-12-13 16:52:22
625
原创 kafka和其他消息队列的区别
摘要: Kafka与其他消息队列(RabbitMQ、RocketMQ等)的核心差异源于设计目标不同。Kafka定位为高吞吐分布式日志系统,侧重持久化存储与批量处理,通过分区扩展、顺序写磁盘和零拷贝实现百万级TPS,适配大数据流处理;而RabbitMQ等侧重即时消息投递,提供灵活路由、低延迟(微秒级)和事务支持,适合业务解耦。RocketMQ则平衡吞吐与可靠性,支持金融级场景。选型需权衡吞吐、延迟、功能(如事务/回溯)及生态适配(如Kafka整合Flink)。关键区别在于Kafka是“存储优先”,其他MQ是“
2025-12-13 14:58:24
891
原创 bio、nio、aio的区别以及使用场景
本文分析了Java中三种IO模型(BIO/NIO/AIO)的核心差异。BIO采用同步阻塞方式,每个连接需要单独线程处理,编程简单但并发能力差;NIO通过Selector多路复用实现同步非阻塞,单线程可处理多连接,适合高并发场景;AIO基于异步非阻塞模型,由操作系统完成IO操作后回调通知,性能最高但编程复杂。文章从原理、代码示例、优缺点等方面进行对比,指出BIO适合简单场景,NIO广泛应用于高并发网络服务(如Netty),而AIO依赖操作系统支持,适合耗时IO操作。三种模型在阻塞/非阻塞、同步/异步两个维度上
2025-12-12 19:59:48
930
原创 springai和langchain4j的区别
Spring AI与LangChain4j深度对比:架构上,Spring AI深度集成Spring生态,采用配置驱动和注解简化开发,适合企业级应用;LangChain4j则强调灵活组装,支持更丰富的LLM应用编排。功能方面,LangChain4j在RAG流程、记忆管理、工具调用等场景表现更全面,而Spring AI在配置管理和异常处理上更便捷。开发体验上,Spring AI代码更简洁,LangChain4j则提供更多底层控制。选择时需权衡:若追求开发效率与Spring整合选Spring AI,若需要复杂AI
2025-12-11 16:00:45
1069
原创 sse和websocket的区别
SSE与WebSocket是两种服务器推送技术,核心区别在于通信模式:SSE基于HTTP实现单向推送,简单轻量且内置重连机制;WebSocket则是全双工协议,支持双向实时交互但实现更复杂。SSE适合通知、监控等单向场景,开发成本低;WebSocket适用于聊天、游戏等双向交互需求。技术选型应基于实际场景需求,避免过度设计。
2025-12-11 15:59:35
907
原创 单例模式什么时候用饿汉什么时候用懒汉
单例模式中饿汉式与懒汉式的选择取决于实例初始化成本、使用频率和线程安全需求。饿汉式在类加载时初始化,适合必用、轻量且无外部依赖的场景(如日志工具)。懒汉式延迟初始化,适用于可能不用、初始化成本高或依赖动态资源的场景(如AI客户端),但需处理线程安全问题。关键区别在于初始化时机:饿汉式预加载无延迟但可能浪费资源,懒汉式按需加载更节省资源但首次调用有延迟。选择时应权衡资源占用与性能需求。
2025-12-09 15:30:31
398
原创 Mysql数据库一张表存多少数据合适
MySQL单表数据量的合理范围通常在500万~2000万行(InnoDB引擎),主要基于B+树索引的3层高度设计,可保持最优查询性能(3次磁盘IO)。影响具体数值的关键因素包括表结构复杂度、索引数量、查询模式和硬件配置。超过阈值时,性能会因B+树增高、索引维护开销增大而明显下降。解决方案包括分库分表(水平/垂直拆分)、分区表等,将数据量控制在合理范围内。核心原则是平衡查询/写入性能与维护成本,避免单表过大导致的性能问题。
2025-12-06 15:40:19
771
原创 Redis用了什么机制来保证他快,是怎么保证每个请求都耗时差不多的时间?
Redis 的高性能源于多维优化:纯内存存储避免磁盘IO瓶颈,单线程模型减少锁竞争和切换开销,定制化数据结构(如跳表、哈希表)确保O(1)/O(logN)操作效率,配合IO多路复用支撑高并发。为保持请求耗时均匀,Redis通过禁用长耗时命令(如用SCAN替代KEYS)、异步处理大键删除/持久化、严格控制命令执行时间(微秒级)以及集群分片等措施,确保单线程不被阻塞。其设计核心是"做减法"——仅保留高效操作,消除一切潜在阻塞点,从而实现亚毫秒级响应且无长尾波动的稳定性能。
2025-12-06 15:34:23
756
原创 Mysql底层的数据结构,为什么用B+树,如果在内存中,B树和B+树查询效率怎么样
MySQL选择B+树而非B树的核心原因是适配磁盘存储场景,减少IO次数。B+树非叶子节点仅存索引,使树高更低,查询IO次数更少;叶子节点链表化优化范围查询;查询效率稳定且内存缓存命中率高。在内存中,B+树在范围查询和全表扫描上仍优于B树,仅在特定等值查询时B树略优。数据结构选择取决于存储介质和查询场景,B+树是数据库场景的最优解。
2025-12-06 15:16:41
771
原创 fork函数缺点
摘要: fork函数的核心缺陷在于全量复制父进程资源的设计,导致高开销、行为不一致等问题。主要缺点包括: 极高复制开销:即使采用写时复制(COW),仍需复制页表和资源,高频fork会严重消耗CPU; COW隐性陷阱:内存碎片、性能抖动及失效场景; 资源继承问题:锁死锁、文件描述符泄漏和信号处理混乱; fork+exec冗余:复制的资源在exec时被丢弃,效率低下; 多线程不兼容:仅复制当前线程,继承锁易导致死锁。 优化方案包括:使用posix_spawn/vfork替代,进程池复用,或改用线程/协程。现代高
2025-12-05 16:08:04
575
原创 进程线程、协程和虚拟线程之间有啥区别
本文从调度方式和资源开销两个维度对比了进程、线程、协程和虚拟线程的区别。进程由内核调度,资源隔离但开销大;线程共享进程资源,内核调度开销中等;协程由用户态调度,轻量级但需非阻塞IO支持;虚拟线程由JVM调度,兼具轻量级和易用性。关键区别在于调度责任从内核逐步下放到JVM/用户态,实现开销递减而并发能力递增。虚拟线程通过M:N映射复用OS线程,既支持高并发又兼容阻塞IO,是当前Java等语言的优选方案。
2025-12-05 15:32:37
534
原创 匿名管道为什么只能在父子进程间通信,而命名管道就可以允许无亲缘关系的进程通信
摘要:匿名管道和命名管道的核心差异在于是否有文件系统级的全局标识。匿名管道通过pipe()创建,仅在内核开辟缓冲区,没有文件系统路径,只能通过进程文件描述符(fd)访问,因此仅限父子进程通信。命名管道通过mkfifo()创建,会在文件系统中生成管道文件作为全局标识,任何进程只要知道路径就能通过open()获取fd访问同一缓冲区,从而支持无亲缘关系进程通信。两者的内核缓冲区本质相同,区别在于"如何找到缓冲区"的机制不同。
2025-12-05 10:25:23
617
原创 如果线上一个接口出现了超时情况,你会怎么去排查问题?
摘要:线上接口超时排查全链路方案 本文提出结构化排查方案,分为三个核心步骤: 快速定位故障范围(5分钟内): 通过接口维度(单接口/全局)、实例维度(单实例/全实例)、时间维度(突发/渐进)缩小排查边界 利用监控工具(Prometheus/SkyWalking)分析响应时间、成功率等指标 逐层拆解排查: 应用层:检查日志链路耗时、线程池状态、JVM GC情况、连接池状态 网络层:排查网关限流、负载均衡、网络延迟和带宽问题 依赖层:分析数据库慢查询/锁、Redis性能、第三方服务状态 资源层:检查服务器CPU
2025-12-03 20:49:45
962
原创 在 MySQL 中如何快速的去复制一张表,包括表结构和数据?
MySQL复制表结构和数据的4种核心方法: CREATE TABLE...SELECT:快速复制小表,但不保留约束和索引,适合简单测试场景。 CREATE TABLE...LIKE + INSERT:完整复制结构(含约束)后再插入数据,是生产环境首选,支持分批次插入优化性能。 mysqldump工具:通过导出SQL脚本实现跨实例复制,适合超大表或备份场景,可配合参数优化导出效率。 物理文件复制:直接复制底层数据文件,效率最高但风险较大,仅适用于同版本MySQL的超大表(1亿+行)。 面试建议:优先选择方法2
2025-12-02 19:53:06
939
1
原创 http和rpc的区别
摘要: HTTP是通用的应用层协议,基于文本协议(如JSON)和标准格式,适合跨平台、对外接口等场景,但性能较低;RPC是远程调用框架,采用二进制协议和高效序列化,优化了传输效率和服务治理,适合内部微服务高频调用。核心区别在于设计目标——HTTP注重通用性,RPC追求性能与易用性。实际选型需结合场景:对外服务用HTTP(如RESTful API),内部高性能交互用RPC(如Dubbo/gRPC)。HTTP/2和gRPC等技术的出现缩小了性能差距,但RPC在服务治理和调用体验上仍有优势。
2025-12-02 19:37:02
862
原创 项目中如何排查解决慢接口问题
摘要:排查慢接口问题需结合监控工具定位瓶颈、分层分析和针对性优化。首先通过APM工具和日志埋点确定慢接口及耗时环节,检查服务器资源使用情况。然后从代码逻辑、缓存、数据库和外部依赖四层分析原因,如冗余操作、缓存未命中、慢查询或锁竞争等。优化措施包括代码逻辑简化、缓存命中率提升、SQL索引优化和异步化处理。以秒杀项目为例,通过索引优化和Redis查询简化,将接口响应时间从3s降至100ms内。核心思路是精准定位瓶颈,分层拆解问题,针对性优化后通过压测验证效果。
2025-11-29 14:47:28
639
原创 如果用户反映页面跳转得非常慢,该如何排查
页面跳转慢是典型的全链路性能问题,排查需遵循先定位范围、再分环节深挖、最后验证优化的逻辑。首先通过影响面和跳转类型快速定位问题范围(前端/网络或后端/服务)。然后分环节深度排查:前端/网络层面关注资源加载和网络延迟;Nginx层面检查连接数和缓存配置;后端服务层面分析接口执行耗时和线程池状态;数据库层面排查慢SQL和连接池问题;中间件层面检查Redis命中率和MQ队列堆积。每个环节都提供具体工具和常见原因,形成系统化的排查流程。
2025-11-29 10:43:18
767
原创 1、nginx反向代理了解吗?怎么配置nginx服务器?nginx负载均衡的算法都有哪些? 2、后端服务器宕机了,nginx服务器是怎么检查的
Nginx 反向代理通过中间层转发请求,隐藏后端服务器并实现负载均衡。核心配置包括定义 upstream 集群、设置 proxy_pass 转发规则及优化参数。Nginx 提供多种负载均衡算法:轮询(默认)、权重轮询、IP 哈希和最少连接数等,适用于不同场景。健康检查机制分为被动检查(基于请求失败次数)和主动检查(需第三方模块),通过 max_fails 和 fail_timeout 参数控制故障转移。配置完成后需执行 nginx -t 检查语法,再 reload 生效。该机制确保后端故障时自动剔除不可用节
2025-11-29 10:15:30
671
原创 先更新数据库,再删除缓存;然后从库读取数据,读取到脏数据怎么办?延迟二次删除缓存,删除时间如何确定?
本文分析了数据库主从同步与缓存更新导致的脏数据问题,核心原因是主从同步延迟大于缓存删除后的首次读取时间。提出了三种主要解决方案:1)延迟二次删除缓存(成本最低);2)读主库兜底(强一致性);3)基于binlog的缓存更新(最终一致性)。重点阐述了延迟时间T的计算方法,建议T≥主从同步峰值延迟的1.5-2倍加网络冗余。最后指出缓存过期时间作为兜底策略,并对比了不同方案的适用场景。该问题解决方案需权衡一致性与性能,实际应用中建议优先考虑延迟二次删除方案。
2025-11-27 18:51:03
313
原创 redis实现漏桶算法--https://blog.youkuaiyun.com/m0_74908430/article/details/155076710
本文介绍了基于Redis实现漏桶限流算法的方法。漏桶算法通过固定速率处理请求来平滑流量,防止系统过载。实现方案使用Redis的Hash结构存储漏桶状态(容量、速率、当前水量和最后漏水时间),并通过Lua脚本保证操作的原子性。脚本逻辑包括计算漏水量、更新状态和判断请求是否允许通过。Java示例展示了如何调用该脚本。该方案具有原子性、高性能等优点,但也需注意内存占用和时间精度问题,同时与令牌桶算法相比更适合需要严格平滑流量的场景。
2025-11-24 15:28:22
759
1
原创 redis为什么快,除了基于内存和单线程、io多路复用的原因,还有什么原因?
摘要: 缓存雪崩导致SQL宕机时,需分三阶段处理: 秒级止损:网关限流降级非核心接口,数据库设只读模式,Redis应急处理(热点key永不过期或切本地缓存); 分钟级恢复:逐步放开核心表写权限,缓存预热核心数据,灰度恢复非核心业务; 长期预防:缓存过期时间随机化、集群高可用,数据库读写分离+分库分表,架构层熔断/降级/限流。 根因多为key集中过期、缓存宕机或穿透,需通过监控告警和定期演练提前防范。核心原则:先阻断流量保护数据库,再恢复服务,最终优化架构防复发。
2025-11-24 09:40:56
227
原创 jvm中oom怎么解决
JVM OOM(OutOfMemoryError)的解决关键在于精准定位原因,主要分为堆溢出、栈溢出、元空间溢出等类型。通过分析OOM日志和堆快照(MAT工具)可识别内存泄漏点或配置不足问题。解决方案包括:调整JVM参数(-Xmx、-XX:MaxMetaspaceSize等)、优化代码(避免静态集合泄漏、及时释放资源)、合理使用线程池等。排查工具推荐jps、jstat监控运行状态,结合jmap导出堆快照分析。针对不同OOM类型需采取针对性措施,如堆溢出优先检查内存泄漏,元空间溢出则限制类加载量。
2025-11-22 10:16:13
848
原创 Redis查询很慢的话,如何排查?主要原因?
Redis查询慢的排查流程:「慢查询日志定位命令→INFO/系统工具找资源瓶颈→大key/热key排查→集群/网络确认核心原因:「大key(O(n)命令阻塞)、热key(单线程排队)、资源瓶颈(CPU/内存/IO)、分布式问题(同步延迟/网络)优化核心:「避免单线程阻塞(拆分大key、替换慢命令)、分散负载(集群分片、读写分离)、充足资源(内存/带宽)
2025-11-21 16:51:38
633
原创 Java大厂面试:谢飞机的奇幻求职之旅
方案 | 优点 | 缺点 || 定时任务 | 简单易实现 | 延迟高,DB压力大 || 延迟消息 | 精准,解耦 | 依赖MQ可靠性,需补偿 || Redis过期监听 | 高性能,低延迟 | 事件可能丢失,需兜底 |推荐组合方案:以延迟消息为主Redis过期监听为辅,并配合乐观锁+分布式锁保证数据一致性,最后通过对账系统兜底,确保万无一失。希望这个“谢飞机”的故事能帮你理清订单超时的设计思路。下次面试,别再只会说定时任务啦!
2025-10-23 09:58:04
364
原创 Java大厂面试:谢飞机的奇幻求职之旅
本文以幽默对话形式还原互联网大厂Java工程师面试现场,通过“谢飞机”这一角色展现初级开发者常见误区,并深入解析支付系统设计、分布式锁、乐观锁等核心知识点。结合真实业务场景,帮助读者理解技术选型背后的权衡。
2025-10-23 09:57:17
284
原创 Java大厂面试现场:谢飞机被问懵了,从HashMap到DDD一套带走
面试不仅考记忆,更考理解。谢飞机虽然搞笑,但你也看到了知识盲区。建议扎实掌握底层原理,别只背八股文。
2025-10-20 22:08:21
321
原创 Java大厂面试现场:面试官灵魂拷问,水货程序员刘某某的爆笑对答实录
面试不仅考知识广度,更考深度和准确性。建议系统学习JUC、JVM、MySQL底层、Redis原理、Spring源码及DDD设计思想,避免成为“刘某某”式水货程序员。本文纯属虚构,如有雷同,欢迎对号入座。
2025-10-20 21:44:10
525
原创 Java面试奇遇记:谢飞机大战面试官,笑着学完核心技术栈
核心思想:以业务领域为核心,划分限界上下文(Bounded Context)分层架构表现层应用层领域层(实体、值对象、聚合根、领域服务)基础设施层适用于复杂业务系统,避免贫血模型,提升可维护性总结:谢飞机虽然搞笑,但他提醒我们——基础要牢,细节要抠,别让“我以为”变成“我完了”。希望你在笑声中学到真知识,下次面试,不再是“等通知”,而是“发 offer”!本文纯属虚构,如有雷同,说明你也面过这种题 😄。
2025-10-20 14:49:53
366
原创 Dijkstra(反向建图)
Destination最短路建立两个点 0 和 n+1,让所有 a[i] 为偶数的点与 0 连一条价值为零的边,让所有 a[i] 为奇数的点与n+1 连一条价值为零的边。对于 i - a[i] 和 i + a[i],如果可以到达,就连一条价值为 1 的边。对于偶数点,到达 n+1 的最短路径就是答案。对于奇数点,到达 0 的最短路就是答案。最短路的dij算法是求起点到其他所有点的距离,所以需要反向建图得到其他所有点到某个点的最短了。#include <bits/stdc++.h>
2021-08-23 10:34:49
755
原创 快速乘模板
Destination#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<map>#include<stack>#include<string>#include<cstdlib>#include<queue>#include<v
2021-08-23 08:42:53
221
原创 多重背包的可行性问题
题destination#include <iostream>#include <cstring>#include <algorithm>#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<map>#include<string>#i
2021-08-21 13:24:52
268
原创 多源BFS模板题
D.最近的商店(比赛中叫 不会吧不会有人觉得这不是签到吧)Time limit:1 secondsMemory limit:64 megabytes 协会成员马上要入住算协小镇了!他们不想去一个离自己很远的商店,因此每个人都想知道离自己房子最近的商店有多远。 他们向你求助,希望你能帮他们做一个标有商店距离的平面图。 算协小镇上的房子严格按照n ∗ m n * mn∗m的点阵建造,其中分布有居民楼和商店,距离按照每个单元格进行计算(横与纵坐标差之和)。输入 第一行输入n nn和m mm,
2021-08-15 19:43:28
210
原创 树状数组(求逆序对及离散化)
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 2000010;typedef long long LL;int n;//t[i]表示树状数组i结点覆盖的范围和int a[N], t[N];//Lower[i]表示左边比第i个位置小的数的个数//Greater[i]表示左边比第i个位置大的数的个数int Lower[
2021-08-13 17:26:57
122
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅