- 博客(37)
- 资源 (3)
- 收藏
- 关注
原创 最新版python与pycharm下载安装教程
PyCharm最新版安装指南:访问官网下载安装包,建议自定义安装路径(非C盘且确保空间充足)。安装时可勾选创建桌面快捷方式和自动配置Path变量,简化后续操作。按照向导完成安装即可。
2025-09-21 15:17:15
464
原创 MySql索引为什么采用B+树的结构
MySQL选择B+树作为索引结构,主要因其能有效减少磁盘I/O次数,特别适合大规模数据的增删改查和范围查询。相比哈希表无法支持范围查询、二叉树I/O效率低,B+树具有多路搜索、树高低、叶子节点形成有序链表等特点,使查询性能稳定且高效。B+树节点大小匹配磁盘页,利用预读机制,3-4次I/O即可定位亿级数据,同时支持高效的全表扫描和范围查询,是关系型数据库索引的最佳选择。
2025-09-18 16:03:57
1192
原创 数据库性能瓶颈优化策略
本文系统化地介绍了数据库性能优化的三个阶段。第一阶段聚焦低成本高收益方案:精细化索引优化、SQL语句优化和数据库配置调优;第二阶段引入应用架构优化:使用缓存、读写分离和消息队列等手段;第三阶段涉及高级架构方案:垂直分库和水平分片等数据拆分策略。特别针对动态数据查询场景,建议采用Elasticsearch等专用搜索系统或物化视图方案。整体优化应遵循"诊断先行、由浅入深"原则,从简单索引优化逐步过渡到复杂架构改造,最终实现性能提升。
2025-09-14 19:21:44
523
原创 Redis缓存同步链路实现方案
摘要:Redis缓存同步链路的核心在于实现数据库与缓存的数据一致性。常见方案包括:1)基于事件驱动的同步(如监听MySQL Binlog),解耦性好但架构复杂;2)消息队列异步同步,平衡性能与解耦;3)同步双写,简单直接但耦合度高。最佳实践建议采用Cache Aside模式,优先删除而非更新缓存,并设置重试机制和合理TTL。选择方案需权衡一致性要求、系统规模和团队能力,中大型系统推荐事件驱动方案,小型系统可考虑同步双写但需完善错误处理。
2025-09-08 14:45:09
697
原创 Java中的锁升级机制
Java锁升级机制是JVM对synchronized关键字的优化策略,通过动态调整锁状态来平衡性能与线程安全。主要包括四个阶段:无锁状态(01标志)、偏向锁(记录线程ID,适用于单线程场景)、轻量级锁(CAS自旋,适合低竞争)和重量级锁(内核态互斥,处理高竞争)。该机制采用单向升级策略,根据竞争激烈程度自动切换,在保证线程安全的同时最小化性能开销。自JDK1.6引入后显著提升了synchronized性能,使其在多场景下接近ReentrantLock的效率,而开发者无需手动干预这一透明优化过程。
2025-09-05 16:03:02
645
原创 Synchronized和ReentrantLock的区别
Java线程同步工具synchronized和ReentrantLock的核心区别在于:synchronized是JVM级别的隐式锁,自动释放但灵活性差;ReentrantLock是API级别的显式锁,需手动管理但功能更强。ReentrantLock支持可中断锁、超时获取、公平锁、多条件变量等高级特性。synchronized在JDK1.6+后性能优化良好,简单场景优先使用;复杂场景如需要精确控制时,才考虑使用ReentrantLock。选择应基于需求复杂度,多数情况下synchronized更安全简洁。
2025-09-05 15:59:36
661
原创 分库分表方案中出现数据倾斜问题怎么解决
数据倾斜是分库分表实践中常见的问题,导致部分节点负载过高而影响系统性能。主要原因包括分片键选择不当、哈希函数不合理、业务热点等。解决方案分为治本和治标:调整分片策略(更换分片键、使用复合键或优化哈希算法)和应对业务热点(二级索引、读写分离、多级缓存)。预防措施包括设计阶段充分调研、使用成熟中间件和加强监控。核心思路是确保数据均匀分布或系统能处理不均匀数据,需要根据业务场景选择合适方案。
2025-09-05 15:23:00
921
原创 分布式锁加锁失败后的等待逻辑是如何实现的
分布式锁加锁失败后的等待策略主要有两种:客户端轮询和服务端通知。客户端轮询包括简单固定间隔和带随机抖动的指数退避法,后者通过指数增长延迟和随机抖动避免"羊群效应",是Redis等简单锁的推荐方案。服务端通知如ZooKeeper的Watch机制能实时响应锁释放,效率最高但实现复杂。生产环境通常结合两种策略:先快速重试,失败后转为指数退避,并设置总超时。选择策略需权衡实现复杂度、系统压力和应用场景需求。
2025-09-05 14:58:09
578
原创 Mysql的行级锁到底锁的是什么东西
摘要:MySQL InnoDB的行级锁实际上是锁定索引项而非数据行本身。通过聚簇索引操作时直接锁定索引记录,通过二级索引则先在二级索引加锁再回表锁定主键索引。若查询未使用索引,会导致全表扫描并升级为表锁,严重影响并发性能。行锁分为记录锁、间隙锁和临键锁三种类型。关键实践建议包括确保查询有效使用索引、优先使用主键/唯一索引、控制事务时长以及理解不同隔离级别的锁策略差异。良好的索引设计是保证行级锁效用的前提条件。
2025-09-05 14:15:31
861
原创 RabbitMq如何实现幂等性
摘要:在分布式系统中,RabbitMQ等消息队列可能因网络抖动、故障导致消息重复投递。实现消息幂等性需由消费者完成,常见方案包括:1)业务逻辑天然幂等(如查询);2)唯一键控制(最推荐),通过数据库唯一约束防止重复;3)状态机控制(适用于订单等有状态业务);4)Redis缓存去重(高性能但可靠性较低)。建议优先采用唯一键方案,可结合多种方法,消息设计需包含全局唯一ID,并养成"先查询后处理"的习惯。本质上,消息队列提供"至少一次"投递保证,而"恰好一次&qu
2025-09-04 18:08:03
968
原创 线程池可实用工具类
本文介绍了一个高效通用的Java线程池管理工具类ThreadPoolManager,主要特点包括:1)支持IO/CPU密集型任务自动配置;2)提供Builder模式配置线程池参数;3)内置监控指标采集功能;4)实现优雅关闭和智能拒绝策略;5)支持任务包装器和动态参数调整。该工具类采用最佳实践设计,包含线程池指标监控、异常处理、资源清理等机制,并提供了与SpringBoot集成的示例。通过自动计算线程数、有界队列管理和智能重试等特性,有效提升了线程池的安全性和健壮性,适用于各种Java应用场景。
2025-08-14 11:10:38
255
原创 Java线程池原理以及使用
Java线程池的核心在于线程复用和任务队列管理,通过合理配置核心线程数、最大线程数、队列容量和拒绝策略来优化性能。关键点包括:区分CPU密集型和IO密集型任务设置线程数、使用有界队列防止OOM、自定义线程工厂便于监控、正确处理任务异常。需特别注意避免使用Executors默认工厂方法,而应手动创建ThreadPoolExecutor,并关注线程泄漏、死锁风险等问题。最佳实践包括压力测试调优、实施监控告警以及实现优雅关闭机制。
2025-08-14 09:04:51
767
原创 Spring-rabbit使用实战七
Spring AMQP中@RabbitListener监听单队列与多队列的核心区别在于:单队列提供独立的线程处理、错误隔离和优先级设置,适合关键业务;多队列则共享线程和错误处理机制,适合逻辑相同的业务场景。最佳实践建议:高优先级业务采用单队列监听,相关业务使用多队列统一处理,并可通过混合策略优化系统性能。合理选择模式可提升吞吐量30%-50%,同时需配合监控和动态调优实现最佳效果。
2025-08-09 11:22:16
670
原创 Spring-rabbit使用实战六
本文提出了一种优雅实现Spring RabbitMQ多交换机多队列绑定的方案。通过配置驱动设计和工厂模式,实现了3个交换机各绑定3个队列的灵活配置。方案包含:1) 使用枚举集中管理交换机、队列和路由键配置;2) 工厂类自动创建交换机和绑定关系;3) 抽象消费者基类统一异常处理;4) 通用生产者服务。该设计具有高扩展性,支持动态添加新交换机和自定义绑定逻辑,同时提供了命名规范、监控增强等最佳实践建议。这种配置驱动的实现方式显著提高了代码复用性,简化了系统维护,适合需要处理多种消息类型的业务场景。
2025-08-05 17:00:07
725
原创 Spring-rabbit使用实战五
RabbitMQ交换机核心功能与最佳实践摘要:交换机是RabbitMQ消息路由的核心组件,主要承担消息分发、路由决策、生产消费解耦等功能。根据业务场景可选择Direct(精确路由)、Topic(通配匹配)、Fanout(广播)等类型。建议遵循"业务域优先"原则控制交换机数量(通常≤20个/微服务),避免过度创建导致资源浪费。生产环境需配置持久化、备用交换机和业务隔离,并监控关键指标(消息流入速率、无法路由率等)。通过合理设计交换机结构,在保证系统灵活性的同时降低维护复杂度。
2025-07-31 18:16:51
636
原创 如何理解时间复杂度
摘要:时间复杂度衡量任务规模(n)扩大时所需操作步骤的增长趋势。O(1)表示固定步骤(如数组直接访问);O(n)是线性增长(如遍历查找);O(logn)高效对数增长(如二分查找);O(n²)为平方级增长(如嵌套循环)。关键关注最坏情况下的增长趋势,忽略常数影响。不同复杂度在数据量小时差异不大,但大数据时差距显著:O(n²)可能极慢,而O(logn)仍高效。理解复杂度有助于选择合适算法(如快速排序优于冒泡排序)和数据结构(ArrayList随机访问O(1)优于LinkedList的O(n)),对处理海量数据尤
2025-07-30 18:12:37
905
原创 Spring-rabbit使用实战四
摘要:Spring RabbitMQ应用中,队列创建数量和消费者线程配置直接影响系统性能。队列数量受RabbitMQ内存、文件描述符和磁盘限制,建议小型应用5-10个,中型10-30个,大型50+个。消费者线程配置需考虑并发数(推荐CPU核心数×2)、最大并发数(初始×4)和预取值(50-200)。关键参数包括concurrency、max-concurrency和prefetch,可通过SimpleMessageListenerContainer定制线程池。生产环境需监控线程利用率、消息积压和处理时延,适
2025-07-30 17:40:54
727
原创 HashMap为什么引入红黑树结构
JDK1.8中HashMap引入红黑树结构,主要解决哈希冲突严重时链表查询性能退化问题。当链表长度超过8且容量≥64时转换为红黑树,将最坏时间复杂度从O(n)降至O(logn)。设置6作为退化阈值避免频繁转换。这种设计在空间开销与性能保障间取得平衡:基于泊松分布,正常使用很少触发树化,仅在哈希分布异常时提供性能保障。红黑树的引入显著提升了HashMap在极端情况下的健壮性,是JDK1.8的重要优化。
2025-07-30 14:27:17
854
原创 Spring-rabbit使用实战三
本文详细介绍了SpringBoot项目中RabbitMQ的完整配置参数,分为六大模块:1)基础连接配置(服务器地址、端口、认证信息等);2)生产者配置(消息确认、重试机制);3)消费者配置(ACK模式、并发控制);4)安全与高级配置(SSL加密、连接池);5)高可靠性场景配置示例;6)重要注意事项(消息可靠性组合、并发优化、死信队列等)。重点推荐生产环境中启用SSL加密、手动ACK、消息重试等机制,并提供了最优参数建议。
2025-07-28 11:50:51
1144
原创 Spring-rabbit使用实战二
摘要:本文介绍了如何在SpringBoot项目中通过RabbitMQ实现按业务路由到不同队列的实战方案。采用Direct路由模式,详细说明了交换机、队列的配置绑定关系,以及生产者和消费者的实现方法。关键实现包括:定义DirectExchange和业务队列、使用RoutingKey精确匹配、手动ACK确保可靠性、JSON消息序列化等。还提供了动态路由键管理、死信队列处理异常消息等优化技巧,以及生产环境下的可靠性保障措施。该方案适用于订单处理、日志分级等需要定向分发的业务场景,完整代码结构清晰,可直接集成到项目
2025-07-28 11:45:57
757
原创 Spring-rabbit使用实战一
本文系统介绍了Spring-rabbit框架在项目中的应用。作为SpringAMQP的RabbitMQ实现模块,Spring-rabbit通过RabbitTemplate、@RabbitListener等组件简化了消息中间件的使用,支持声明式配置和多种交换机路由策略。文章详细阐述了其核心功能:实现服务解耦、异步处理、流量削峰和可靠性保障,并提供了电商订单处理的典型应用示例,包括依赖配置、队列定义、消息发送与消费实现。此外,还介绍了生产者确认、消费者确认等高级特性,以及SpringCloud中的扩展应用。Sp
2025-07-28 11:37:05
973
原创 超详细Git安装与配置教程
最后注意:签名的作用是区分不同操作者身份,用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码。键盘win+R,输入CMD,进入终端,输入git --version查看版本信息。2、下载完成之前,双击下载好的exe文件进行安装。进入git操作界面,输入上面的用户名和邮箱。5、默认编辑机器材使用Vim,点击下一步。4、点击next,选项默认即可。点击install,进行安装。安装完成,点击finish。3、选择自己的安装目录。
2024-07-15 22:33:59
762
转载 Java面试题复习
转:http://blog.csdn.net/yanghaitao_1990/article/details/51757308一、Java基础 1.String类为什么是final的。 2.HashMap的源码,实现原理,底层结构。 3.反射中,Class.forName和classloader的区别 4.session和cookie的区别和联系,session的生命周
2018-01-22 15:48:39
295
转载 Java类的各种成员初始化顺序如:父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺序
转:http://blog.csdn.net/qq_27093465/article/details/70292221class B extends A A类也就是父类里面有静态代码块,普通代码块,静态方法,静态成员变量,普通成员变量,普通方法。子类也是这样,然后继承之后,关于程序打印输出的结果,涉及到Java类的各种成员的初始化顺序。经测试,得到如下结论:1.父类【静态成员】和【静态代码块】,按
2018-01-19 15:13:37
404
转载 Java 反射中,class.forName()和classLoader的区别
1、java中class.forName()和classLoader都可用来对类进行加载。不同:1)class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块,还会执行给静态变量赋值的静态方法 2)classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行
2018-01-19 14:49:19
7859
1
原创 枚举类 Enum 使用
关键字 enum 可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能。public enmu StatusEnum{ NOT_CLOSE("0","未关闭"), IS_CLOSE("1","已关闭"), CLOSEING("2","执行中"), CLOSE("3","完成"); private
2016-11-07 14:54:47
500
原创 UML系列图-用例图
用例图是指由参与者(Actor)、用例(Use Case)以及它们之间的关系构成的用于描述系统功能的静态视图。 用例图(User Case)是被称为参与者的外部用户所能观察到的系统功能的模型图,呈现了一些参与者和一些用例, 以及它们之间的关系,主要用于对系统、子系统或类的功能行为进行建模。帮助开发团队以一种可视化的方式理解系统的功能需求。 用例图由参
2016-03-31 14:04:33
798
转载 Java并发编程:synchronized
虽然多线程编程极大地提高了效率,但是也会带来一定的隐患。比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据。今天我们就来一起讨论下线程安全问题,以及Java中提供了什么机制来解决线程安全问题。 一.什么时候会出现线程安全问题? 二.如何解决线程安全问题? 三.synchronized同步方法或者同步块一 什么时候会出现
2016-03-31 13:38:03
333
转载 Java并发编程:Thread类的使用
在前面2篇文章分别讲到了线程和进程的由来、以及如何在Java中怎么创建线程和进程。现在来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知识:线程的几种状态、上下文切换,然后接着介绍Thread类中的方法的具体使用。 一.线程的状态 二.上下文切换 三.Thread类中的方法一 线程的状态 在正式学习Thread类中的具体方法
2016-03-30 16:40:34
317
转载 Java并发编程:线程和进程的创建
在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务。下面先讲述一下Java中的应用程序和进程相关的概念知识,然后再阐述如何创建线程以及如何创建进程一.Java中关于应用程序和进程相关的概念二.Java中如何创建线程三.Java中如何创建进程一 java中应用程序和进程 在Java中,一个应
2016-03-30 16:03:09
307
转载 Java多线程基础:进程和线程之由来
Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通使用的,需要在实践中不断积累。由于并发肯定涉及到多线程,因此在进入并发编程主题之前,需要了解一下进程和线程的由来,这对后面对并发编程的理解将会有很大的帮助。一.操作系统中为什么会出现进程?二.为什么会出现线程?三.多线程并发一 操作系统中为什么会出现进程说起进程的由来,我们需要从操作系统的发展历史谈起。
2016-03-30 14:32:36
301
转载 java 对数据库的基本操作
1.数据库连接通过读取配置文件的方式来获取连接的一些数据信息,提高它的可维护性。定义数据库配置文件:jdbc.propertiesdriver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/hncu?useUnicode=true&characterEncoding=UTF-8 username=root pas
2016-03-29 15:49:45
356
转载 探究java中的String、StringBuilder以及StringBuffer
一 String 类String类的实现在 \jdk1.6.0_14\src\java\lang\String.java 文件中。打开这个类文件就会发现String类是被final修饰的:public final class String implements java.io.Serializable, Comparable, CharSequence{
2016-03-10 15:39:42
323
原创 选择排序,冒泡排序
简单排序算法–选择排序,冒泡排序1、选择排序 原理:每一趟从待排序的数据元素中选出最小的元素(或最大),顺序放在已经排好序的数列的最后,直到全部待排序的元素排完。 初始数据:【 63 4 24 1 3 15 】第一趟:【15 4 24 1 3 】 63 第二趟:【15 4 3 1 】24 63 第三趟:【1 4 3 】15
2015-11-24 16:05:33
535
Nginx+Tomcat+Mencached负载均衡集群部署笔记.doc
2016-11-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅