自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis中常见数据结构底层实现结构是什么

Redis核心数据结构底层实现原理摘要: String采用SDS(动态扩容/O(1)长度获取)或int编码;List使用QuickList(ziplist链表组合);Hash根据元素规模切换ziplist/dict;Set采用intset或dict实现;SortedSet通过ziplist或跳表+dict组合存储。关键设计包含三项优化:1)动态结构转换(如ziplist超过阈值转dict);2)内存优化策略(SDS预分配/ziplist紧凑存储);3)性能平衡机制(渐进式Rehash/跳表概率索引)。

2025-09-22 17:20:53 1075

原创 Redis为什么快

Redis的高性能源于内存存储、单线程高效处理、I/O多路复用技术、原子命令设计等关键特性。其采用内存操作避免磁盘I/O瓶颈,通过单线程避免线程切换开销,利用epoll实现高并发网络通信。同时提供高效持久化方案、优化的数据结构,支持原子操作和主从复制,确保在高并发场景下快速响应。这些设计使Redis成为低延迟、高性能的缓存和数据库解决方案。

2025-09-22 17:19:39 363

原创 设计一个图片上传服务,支持每秒5000张图片上传,并且要实时生成多种尺寸的缩略图。你觉得架构设计的要点有哪些?

摘要:设计支持5000张/秒图片上传及实时缩略图生成的高并发系统,需采用分布式架构。核心组件包括:负载均衡层(Nginx)分发请求、无状态上传服务集群处理验证/存储、消息队列(Kafka)异步解耦任务、缩略图服务集群(使用Pillow等高效库)生成多尺寸图片,配合对象存储(S3/OSS)持久化数据及CDN加速分发。关键优化点涵盖水平扩展能力、分块上传支持、幂等性设计、多层缓存策略及智能监控告警系统,建议采用预生成常用尺寸+按需生成长尾尺寸的混合策略平衡性能与存储成本。

2025-09-20 09:21:34 761

原创 有个异步任务用了FixedThreadPool,结果因为任务处理不过来,导致队列堆积,最后OOM了。你会怎么优化?

摘要:针对FixedThreadPool因任务堆积导致OOM的问题,本文提出系统化优化方案。核心措施包括:使用有界队列替代无界队列并配置合理拒绝策略,根据CPU/IO密集型任务特性设置线程数,建立监控体系动态调整参数。同时建议从架构层面优化,如任务拆分、异步处理、限流等。通过队列控制、参数调优、监控告警和任务优化四管齐下,可有效预防内存溢出,提升系统稳定性。

2025-09-20 09:14:24 688

原创 来设计一个全局唯一ID生成器。要求每秒能生成10万个,ID要趋势递增,还得支持机房容错。

该文提出改进Snowflake算法以满足高并发ID生成需求。方案采用64位ID结构,包含时间戳(41位)、机房ID(5位)、机器ID(5位)和序列号(12位)。关键改进包括:将时间单位从毫秒改为10微秒,使理论峰值达40.96万/秒;动态分配机房/机器ID;采用预生成缓冲池、无锁设计等优化措施。系统具备多机房容错能力,提供时钟回拨异常处理、降级策略等容灾方案,确保每秒10万ID的高吞吐量需求。

2025-09-19 20:06:32 433

原创 线上环境出了个问题:Young GC看起来很正常,但Full GC每天发生20多次,每次都让CPU飙得很高。你会怎么去排查和解决?

摘要:排查FullGC触发原因需检查老年代内存使用率、GC日志及System.gc()调用。通过jmap生成堆转储文件分析内存泄漏,关注大对象分配和GC策略配置。解决方案包括调整内存区域比例(如NewRatio=3)、优化GC参数(如CMS收集器配置)。需修复资源泄漏、缓存问题及静态集合滥用。验证手段包括监控GC指标、压测对比及业务高峰期OOM检查。

2025-09-19 19:58:21 292

原创 spring的循环依赖是什么,介绍一下三级缓存

摘要:Spring通过三级缓存解决循环依赖问题。一级缓存存储完整Bean,二级缓存存半成品对象,三级缓存保留Bean工厂。当A依赖B、B又依赖A时,先创建A半成品存入三级缓存;创建B时通过三级缓存获取A的早期引用完成注入,再反向完成A的初始化。最终将完整Bean移入一级缓存,实现依赖闭环的破解。该机制确保循环引用场景下的正确初始化顺序。

2025-09-18 15:59:49 145

原创 springboot约定大于配置体现在哪里

SpringBoot的"约定大于配置"原则通过预设默认行为简化开发流程,主要体现在自动配置、启动器依赖、默认属性值、嵌入式服务器等方面。该原则显著减少显式配置需求,如自动配置Web服务、数据库连接等,开发者只需遵循依赖和文件位置等约定即可快速构建应用,同时支持自定义配置覆盖。这一设计理念有效降低了配置复杂度,提高了开发效率。

2025-09-18 15:53:40 1407

原创 如何保证消息的顺序性?

文章摘要:面试中消息顺序问题主要考察对MQ顺序性理解和解决方案。以MySQL binlog同步为例,消息顺序错乱会导致数据不一致。RabbitMQ中多个消费者并发消费可能乱序,可通过拆分队列或内部内存队列解决;Kafka中相同key消息分发到同一partition保证顺序,但多线程消费可能乱序,需按key哈希到不同内存队列由单线程处理。核心思路是通过队列隔离或键值路由确保同一业务消息由同一线程顺序处理。

2025-09-18 15:46:24 457

原创 什么是mysql的索引下推(ICP)

摘要:索引下推(ICP)是MySQL 5.6引入的查询优化技术,通过在存储引擎层提前过滤数据,减少回表次数和I/O开销。其核心是将部分WHERE条件下推至索引扫描阶段,仅对符合条件的数据回表查询。适用于联合索引查询、范围查询后的列过滤等场景,可通过EXPLAIN的"Using index condition"判断是否生效。优势包括减少磁盘I/O和Server层负载,但需合理设计联合索引并注意其限制条件(如仅支持二级索引)。优化建议包括合理设计索引结构、优先使用覆盖索引等。

2025-09-17 15:03:33 1027

原创 某个服务平时QPS是一万,大促活动的时候预估会涨到50万。你会怎么设计一个弹性的扩容方案来应对?

本文提出多层级弹性扩容方案,应对大促期间QPS从1万激增至50万的场景。方案采用AI预测模型进行流量预判,结合Kubernetes动态扩缩容、多级缓存削峰、智能限流降级等策略,实现资源利用率提升70%且系统可用性≥99.99%。关键措施包括:混合云资源池秒级扩容、消息队列异步削峰、数据库分库分表优化,并通过全链路监控和混沌测试保障稳定性。该方案在保障性能的同时,通过竞价实例和自动伸缩策略实现成本优化。

2025-09-17 14:58:15 658

原创 有一个发积分的流程,跨了3个服务:先扣A账户,再加B账户,最后记日志。怎么保证这套操作的最终一致性?

本文介绍了分布式系统中实现跨服务操作最终一致性的三种核心方案:基于可靠消息队列的最终一致性(推荐)、TCC和Saga模式。着重分析了消息队列方案的技术细节,包括本地消息表设计、幂等性保障、补偿机制等,并提供了具体代码示例。方案对比显示,消息队列适合高并发且允许最终一致的场景,TCC适用于强一致性的核心业务,Saga则适合长流程业务。文章还提出了故障恢复策略,建议优先采用消息队列+本地消息表方案,平衡性能与实现复杂度。

2025-09-16 11:24:24 1215

原创 假设有个明星突然发了条动态,导致某个Redis热点Key的请求量飙到50万QPS,缓存瞬间被打穿,数据库也跟着雪崩了。你要是当时的值班工程师,怎么快速止损?事后又会怎么优化?

文章摘要:针对高并发场景下的热点数据管理,提出多级优化方案:1)采用永不过期+逻辑过期双缓存策略;2)构建本地缓存+Redis分片的多级体系;3)实施预加载与动态监控刷新机制;4)数据库层通过分库分表、读写分离加固;5)设置多活架构与降级容灾方案。技术选型建议结合分布式锁、熔断机制和异步队列,实现快速止损与压力分流。核心优化方向包括智能缓存策略、弹性架构设计和实时监控体系,以构建高可用系统。

2025-09-16 10:47:08 339

原创 三次握手,四次挥手

TCP协议通过三次握手建立可靠连接(客户端SYN→服务端SYN-ACK→客户端ACK),确保双方通信能力并协商序列号。断开连接采用四次挥手(FIN→ACK→FIN→ACK),因全双工特性需独立关闭通道。关键机制包括TIME_WAIT(防止ACK丢失和旧报文干扰)和应对SYN Flood攻击。该机制类似电话确认流程,是网络编程和故障排查的基础,解决资源释放、连接异常等问题。

2025-09-15 15:55:37 870

原创 长连接和短连接

摘要:长连接和短连接是网络通信的两种核心策略,主要区别在于连接生命周期、资源占用和适用场景。长连接保持连接活跃,减少握手开销,适合高频请求和实时通信(如即时通讯、视频直播);短连接每次请求后关闭,资源释放快,适合低频、轻量级请求(如静态资源加载)。协议层面,HTTP/1.1支持长连接,HTTP/2实现多路复用。优化策略包括心跳机制、连接池管理(长连接)和批量请求(短连接)。实际应用中常结合两者,根据业务需求选择或混合使用。

2025-09-15 15:54:09 786

原创 数据库里面有 2000 万的数据,但是Redis 中只能存 20 万的数据,怎么保证 Redis 中的数据都是热点数据?

本文介绍了如何确保Redis中存储热点数据的优化策略。主要步骤包括:通过日志分析和实时监控识别热点数据;选择性分批加载到Redis;配置LFU淘汰策略和定期清理;建立数据更新机制;持续监控并优化系统性能。这些方法能有效提升应用性能,减轻数据库压力,实现高效缓存管理。

2025-09-12 15:35:19 286

原创 Redis里面有1 亿个key,里面有 10 万个 key 是以某个固定前缀开头的,如何能把它们找出来?

文章摘要:本文介绍了5种查找Redis中以特定前缀开头的键的方法:1)使用SCAN命令(推荐生产环境);2)KEYS命令(仅测试环境);3)RediSearch插件;4)编写Python脚本批量处理;5)Redis集群的CLUSTER命令。针对不同场景(生产/测试环境、单节点/集群)提供了解决方案,并比较了各方法的优缺点,建议根据实际需求选择合适方案,其中SCAN命令是生产环境的首选。

2025-09-12 15:20:23 527

原创 mysql索引失效

摘要:MySQL索引失效常见于查询写法不当、数据特征或索引设计问题,主要包括:对索引列运算/使用函数、隐式类型转换、违反最左前缀原则、前导通配符LIKE查询、OR连接非索引字段、负向查询、低区分度数据、范围查询后索引列失效、字符集不匹配、统计信息过期等。优化建议包括避免索引列运算、确保类型匹配、遵循最左前缀原则、使用覆盖索引、定期更新统计信息。通过EXPLAIN分析执行计划可进一步排查问题。

2025-09-11 17:27:35 1138

原创 常见限流算法详解与对比

本文系统介绍了五种主流限流算法及其应用场景:1.计数器算法实现简单但存在临界问题;2.滑动窗口计数器能缓解临界问题但复杂度高;3.漏桶算法严格限制速度但无法应对突发流量;4.令牌桶算法支持突发流量且灵活性好;5.分布式限流适合高并发场景但依赖外部存储。选型建议:单机优先选令牌桶,分布式用Redis+Lua,严格速率控制用漏桶。实际应用需结合业务特点,必要时可采用自适应限流策略提升系统稳定性。

2025-09-11 17:25:45 1268

原创 分布式事务seata有哪些模式

本文介绍了Seata分布式事务的四种核心模式:AT、TCC、Saga和XA。AT模式通过自动生成回滚日志实现无侵入式设计,适合高并发短事务;TCC模式需手动实现预留-确认-取消接口,适用于资源预留场景;Saga模式通过正向和补偿操作处理长事务,适合跨系统流程;XA模式依赖数据库原生协议,保证强一致性但性能较低。文章对比了各模式的特点,建议AT模式作为默认选择,TCC/Saga用于特定场景,XA模式适用于金融等高一致要求业务,并提供了实战中的注意事项。

2025-09-10 15:36:42 896

原创 Tomcat 如何打破双亲委派机制?

Tomcat的WebAppClassLoader通过重写loadClass方法打破双亲委派机制,实现"子优先"加载策略:先检查本地缓存,尝试加载Web应用目录(WEB-INF/classes/lib)中的类,最后才委托父加载器。这种设计既允许Web应用覆盖容器类(如日志框架),又确保核心类(如java.lang)仍由父加载器加载,平衡了灵活性与安全性。

2025-09-10 15:16:17 360

原创 juc中的原子类是怎么实现的

JUC中的原子类基于CAS无锁算法实现线程安全,通过Unsafe类底层操作确保原子性。核心机制是比较内存值与预期值,一致则更新否则重试,避免了锁开销。适用于单变量原子操作场景如计数器,但不支持多变量复合操作。高并发下性能优异,但竞争激烈时可能自旋。原子类提供高效的无锁解决方案,平衡了线程安全与性能需求。

2025-09-08 16:32:19 315

原创 HashMap高频面试题目

摘要:HashMap底层数据结构在JDK1.8后采用数组+链表+红黑树组合。链表解决哈希冲突,当链表长度≥8且数组长度≥64时转为红黑树(查找复杂度从O(n)降至O(logn)),红黑树节点<6时转回链表。扩容机制为2倍增长以保持2的幂特性,默认负载因子0.75平衡时空效率。采用尾插法避免多线程成环问题。通过链地址法解决哈希冲突,在极端情况下通过树化优化性能。

2025-09-08 16:31:16 1371

原创 spring事物失效场景

摘要:Spring事务失效常见原因包括:1.非public方法使用@Transactional;2.自调用绕过代理;3.异常处理不当;4.传播行为配置错误;5.数据库引擎不支持;6.未启用事务管理;7.多数据源未指定管理器;8.final/static方法;9.类未被Spring管理;10.编程式事务未提交。解决方法涉及调整方法可见性、使用代理调用、正确配置异常处理和传播行为等。排查时需检查日志、简化场景,确保事务正确配置和执行。

2025-09-05 14:38:44 1098

原创 Java中的协程

Java协程解析:轻量级并发编程方案 Java协程通过协作式调度和用户态管理提升高并发性能。核心特性包括纳秒级切换成本、KB级内存占用和百万级并发支持。Project Loom的虚拟线程方案兼容Thread API,支持同步代码风格实现异步逻辑,使电商系统吞吐量提升5倍。第三方库如Quasar通过字节码增强提供替代方案。协程特别适合I/O密集型场景,如网络请求和微服务调用,未来随着Project Loom成熟将成高并发标准方案。开发者可根据需求选择原生虚拟线程或第三方库。

2025-09-05 14:27:27 1078

原创 Bean的详细注册到ioc的过程

摘要:Spring框架中Bean注入IOC容器的核心流程包括:1)通过ClassPathBeanDefinitionScanner或XmlBeanDefinitionReader加载BeanDefinition并注册到DefaultListableBeanFactory;2)容器启动时执行refresh()方法,处理BeanFactoryPostProcessor和注册BeanPostProcessor;3)通过doCreateBean()三阶段(实例化、属性填充、初始化)完成Bean创建,其中依赖注入由A

2025-09-04 15:49:17 1060

原创 BeanFactory和FactoryBean接口

摘要: Spring框架中,BeanFactory是IoC容器核心接口,负责管理Bean的生命周期和依赖关系,通过getBean()等方法提供Bean实例。FactoryBean是特殊工厂接口,用于自定义复杂对象的创建逻辑,其生产的对象需通过&beanName获取。两者的核心区别在于角色(容器vs工厂)、对象获取方式及生命周期管理。典型应用包括MyBatis的SqlSessionFactory(通过FactoryBean简化配置)和AOP动态代理(如ProxyFactoryBean)。Factory

2025-09-04 15:42:01 632

原创 http报文内容

HTTP报文是客户端与服务器通信的基本单位,分为请求和响应两种类型。请求报文包含请求行(方法+URI+版本)、头部字段(如Host、User-Agent)和可选请求体(POST/PUT数据)。响应报文由状态行(版本+状态码)、头部字段(如Content-Type)和可选响应体(如HTML/JSON)组成。两者都需用空行分隔头部与正文,支持分块传输、持久连接等功能。典型例子如GET请求获取资源或服务器返回200 OK响应。

2025-09-03 14:57:18 661

原创 http和https区别是什么

HTTP与HTTPS的核心区别:1)安全性差异-HTTP明文传输易受攻击,HTTPS通过SSL/TLS加密;2)连接过程-HTTPS需额外SSL/TLS握手;3)端口号不同-HTTP默认80端口,HTTPS使用443;4)证书要求-HTTPS需CA认证的数字证书。这些区别使HTTPS成为更安全的网络传输协议。(98字)

2025-09-03 14:39:10 649

原创 Redisson和Redis实现分布式锁的对比

Redisson与SETNX实现Redis分布式锁的对比分析。Redisson通过内置Lua脚本保证原子性操作,支持自动续期(看门狗机制)、可重入锁、高可用集群等特性,开发体验更好但性能略低(约28,000TPS)。SETNX实现更轻量(约35,000TPS),适合简单场景但需自行处理锁续期、可重入等问题。建议简单高性能场景用SETNX,复杂业务和企业级项目选择Redisson。Redisson还提供细粒度锁、监控接口等扩展功能,是官方推荐的Redis客户端。

2025-09-01 16:19:08 1255

原创 Java中的四大引用类型强引用、软引用、弱引用、虚引用

Java引用类型分为强引用、软引用、弱引用和虚引用四种,强度依次递减。强引用确保对象不被回收;软引用在内存不足时回收,适合缓存;弱引用在下一次GC时回收,用于避免内存泄漏;虚引用仅跟踪对象回收状态,用于资源清理。这些引用类型配合ReferenceQueue使用,可优化内存管理并提升性能,适用于不同内存敏感场景。

2025-09-01 16:17:59 903

原创 Spring AOP:JDK与CGLIB代理机制解析

Spring框架中AOP的底层实现主要依赖JDK动态代理和CGLIB两种技术。JDK动态代理基于接口实现,通过反射机制生成代理类,需目标类实现接口;CGLIB通过字节码生成目标类的子类,适用于无接口类但无法代理final类/方法。性能方面,CGLIB在运行时效率更高,适合高频调用场景。Spring默认优先使用JDK代理,无接口时自动切换CGLIB。实际应用中需注意内部方法调用失效和final方法代理失败等问题。

2025-08-29 16:32:50 518

原创 cookie,session,token区别

摘要:Cookie、Session和Token在Web应用中各有特点:Cookie存储于客户端,自动传递;Session数据存储在服务端,依赖Cookie传递SessionID;Token存储在客户端,需手动添加到请求头。Session是有状态的,需服务器维护;Token无状态,包含加密用户信息。Cookie存放SessionID实现会话跟踪,而Token通过解密即可验证用户身份,开发者需自行处理Token传递。三者在存储位置、传递方式和安全性上存在差异。

2025-08-28 08:48:09 234

原创 Dubbo vs Feign

本文对比了Dubbo和Feign两种服务调用框架的核心差异。Dubbo采用二进制协议,性能高、延迟低,自带服务治理功能,适合高频内部调用场景;Feign基于HTTP协议,开发便捷,天然支持REST API,更适合对外服务调用和快速开发。两者都能实现服务间通信,但适用场景不同:Dubbo如同企业专线物流,注重效率;Feign则像标准化快递服务,强调通用性和开发速度。选择时需根据具体业务需求(内部高性能调用或对外API)决定。

2025-08-23 20:12:14 358

原创 http请求有哪些?

HTTP请求方法对比:GET用于获取资源(URL传参、可缓存),POST用于提交数据(请求体传参);PUT可更新/创建资源(幂等),DELETE删除资源。GET与PUT的核心差异:GET参数暴露于URL(不安全、有长度限制),PUT通过请求体传参(安全、无长度限制);GET不幂等且可缓存,PUT幂等不可缓存。其他方法包括HEAD、OPTIONS和PATCH等。

2025-08-22 20:27:28 185

原创 JAVA期末速成(下)

JAVA期末复习下

2024-12-19 21:31:34 959

原创 JAVA期末速成(中)

JAVA期末复习(中)

2024-12-17 20:07:00 1345 2

原创 JAVA期末速成(上)

java期末复习 (上 )

2024-12-16 17:38:30 2077 6

原创 线性dp求解最小代价问题

本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。小蓝可以花费 3 的代价将整数增加一个值,这个值是整数的数位中最大的那个(1 到 9)。状态转移方程 dp[i+1]=Math.min(dp[i+1],dp[i]+1);小蓝有一个整数,初始值为 1 ,他可以花费一些代价对这个整数进行变换。又如,如果整数为 23,花费 10 将整数变为 46。例如,如果整数为 16,花费 3 将整数变为 22。又如,如果整数为 22,花费 1 将整数变为 23。

2024-12-15 16:06:33 334

原创 关于进制转化

进制转化

2024-12-12 16:54:30 334

空空如也

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

TA关注的人

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