- 博客(80)
- 收藏
- 关注
原创 JVM性能调优全指南:高流量电商系统的最佳实践
亿级流量系统是指每天点击量达到亿级别的系统,根据淘宝官方的数据分析,每个用户一次浏览点击20~40次之间,推测每日活跃用户(日活用户)在500万左右。结合淘宝的点击数据,可以发现,能够付费的用户比例只有10%左右,即大约50万单每日成交量。通过上述 JVM 参数调优,可以有效减少不必要的 Full GC 次数,提高系统性能,确保在高并发和大促场景下的稳定性和响应速度。
2024-07-30 19:41:35 1057
原创 面试题:MySQL 索引
覆盖索引 (Covering Index),也叫索引覆盖,即查询的字段在二级索引 (非聚簇索引) 的leaf叶子节点上就可以取到数据而不需要回表查询的过程。减少IO:只需访问索引树,无需访问数据页。避免回表:可以避免磁盘的随机访问,提升查询性能。通过覆盖索引扫描限制扫描行数:通过覆盖索引可以减少扫描的数据量。
2024-07-29 16:04:01 1121
原创 MySQL中的MVCC实现原理与处理流程
MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。它是一种并发控制方法,广泛用于数据库管理系统中,以实现对数据库的并发访问。在编程语言中,它实现事务内存。MVCC在MySQL InnoDB中的实现主要是为了提高数据库的并发性能,用更好的方式处理读写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。
2024-07-26 18:27:07 1056
原创 分库分表:提升数据库性能的必备技巧
这是因为,即使SQL命中了索引,如果表的数据量超过千万,查询速度也会明显变慢。如果估算3年后,表数据量不会达到500万,则不需要分库分表。如果持续发展,仍需考虑分库分表。例如企业客户信息表可以使用客户号作为分表键,以将同一客户的信息存储在一个表中,避免全表路由。下一页时,将当前最大创建时间传递,每个节点查询大于该时间的一页数据,汇总后返回。一般来说,当单表数据量达到千万级别时,就需要分表。优点是精准返回所需数据,缺点是返回数据多,增大网络传输,造成空查。分库分表后,本地事务无效,需要使用分布式事务。
2024-07-25 19:33:58 946
原创 深入理解MySQL锁机制与性能优化:详解记录锁、间隙锁、临键锁及慢SQL查询分析
Read View 保存了当前事务开启时所有活跃(还没有提交)的事务列表,换个角度,可以理解为 Read View 保存了不应该让这个事务看到的其他的事务 ID 列表。第三种情况,当我们使用了范围查询,不仅仅命中了 Record 记录,还包含了 Gap 间隙,在这种情况下我们使用的就是临键锁,它是 MySQL 里面默认的行锁算法,相当于记录锁加上间隙锁。越靠上,表示查询效率越高。第一种情况,当我们对于唯一性的索引(包括唯一索引和主键索引)使用等值查询,精准匹配到一条记录的时候,这个时候使用的就是记录锁。
2024-07-24 16:19:12 1510
原创 MySQL体系结构与查询执行流程详解
Buffer Pool是数据库系统中的一种内存缓冲区,用于缓存表数据与索引数据,将磁盘上的数据加载到缓冲池中,避免每次访问都进行磁盘IO,从而加速数据访问。
2024-07-22 10:27:46 816
原创 MySQL InnoDB事务隔离和并发控制面试题详解
Hash 索引是一种基于 Hash 表的数据结构,用于快速查找数据。其原理是通过哈希函数将键映射到哈希表的某个位置,然后直接访问该位置的数据。优点是查找速度非常快,缺点是无法进行范围查询和顺序访问。原子性(Atomicity):事务是不可再分的最小工作单元,要么全部成功,要么全部失败。一致性(Consistency):事务执行前后,数据库状态保持一致,满足完整性约束。隔离性(Isolation):多个事务并发执行时,互不干扰,保证数据一致性。持久性(Durability)
2024-07-22 10:13:33 1016
原创 MySQL事务管理详解:特性、问题与解决方案
事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。
2024-07-19 13:53:51 1007
原创 Java垃圾收集器选择与优化策略
这些未回收的对象称为“浮动垃圾”。:最差适应算法(Worst-fit)就是在遍历空闲链表的时候,找出空闲链表中最大的分块,将其分割给申请的对象,其目的就是使得分割后分块的最大化,以便下次好分配,不过这种分配算法很容易产生很多很小的分块,这些分块也不能被使用。这些 Region 既可以包含新生代对象,也可以包含老年代对象,但新生代和老年代的区域不是物理隔离的,而是逻辑分组的。:主要使用标记-清除算法、标记-整理算法或标记-压缩算法,先标记需要回收的对象,然后清除这些对象或将存活的对象移动到一端或压缩到一端。
2024-07-18 19:16:23 838
原创 Java虚拟机内存管理及对象生命周期详解
持久代是方法区的一种实现,存储了类的元数据信息。缓存机制将保证所有加载过的类都将在内存中缓存,当程序中需要使用某个类时,类加载器先从内存的缓存区寻找该类,只有缓存区不存在,系统才会读取该类对应的二进制数据,并将其转换成。“双亲委派”是指子类加载器如果没有加载过该目标类,就先委托父类加载器加载该目标类,只有在父类加载器找不到字节码文件的情况下才从自己的类路径中查找并装载目标类。当一个类加载器负责加载某个类时,该类所依赖的和引用的其他类也将由该类加载器负责载入,除非显式地使用另外一个类加载器来载入。
2024-07-18 13:36:20 916
原创 MyBatis源码中的设计模式2
组合模式(Composite Pattern) 的定义是:将对象组合成树形结构以表示整体和部分的层次结构。组合模式可以让用户统一对待单个对象和对象的组合。比如:Windows操作系统中的目录结构,通过tree命令实现树形结构展示。在上图中包含了。
2024-07-16 20:22:05 887 1
原创 MyBatis源码中的设计模式1
建造者模式属于创建类模式,通过一步一步地创建一个复杂的对象,能够将部件与其组装过程分开。用户只需指定复杂对象的类型,就可以得到该对象,而不需要了解其内部的具体构造细节。接口,但并非标准的迭代器类。这个类传入一个字符串到构造函数,然后提供了 iterator 方法对解析后的子串进行遍历,是一个非常常用的方法类。Mybatis 采用装饰器模式实现缓存功能,通过组合而非继承,更加灵活,避免了继承关系的组合爆炸。采用了模板方法模式,实现了大部分的 SQL 执行逻辑,把几个方法交给子类定制化完成。
2024-07-16 19:13:46 1106
原创 Spring源码中的模板方法模式
模板方法模式(Template Method Pattern)是一种行为设计模式,它在操作中定义算法的框架,将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。模板方法模式的定义:在操作中定义算法的框架,并将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。模板方法中的算法可以理解为广义上的业务逻辑,并不是特指某一个实际的算法。定义中所说的算法的框架就是模板,包含算法框架的方法就是模板方法。
2024-07-12 23:55:33 932
原创 Spring中的适配器模式和策略模式
Advice的类型有:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice。每种Advice都有对应的拦截器,如MethodBeforeAdviceInterceptor、AfterReturningAdviceInterceptor、ThrowsAdviceInterceptor。适配器模式(Adapter Pattern)的原始定义是:将一个类的接口转换为客户期望的另一个接口,适配器可以让不兼容的两个类一起协同工作。
2024-07-11 21:29:33 979 2
原创 Spring中的单例模式应用详解
Spring的单例Bean与Spring Bean管理容器密切相关,每个容器都会创建自己独有的实例,所以与GOF设计模式中的单例模式相差极大,但在实际应用中,如果将对象的生命周期完全交给Spring管理(不在其他地方通过new、反射等方式创建),其实也能达到单例模式的效果。首先看单例模式,在一个JVM进程中(理论上,一个运行的JAVA程序就必定有自己一个独立的JVM)仅有一个实例,无论在程序中的何处获取实例,始终都返回同一个对象。在Spring中,所有由Spring容器管理的Bean默认都是单例的。
2024-07-11 17:39:52 673
原创 Spring中的工厂模式详解及应用示例
这些ApplicationContext子类都实现了ApplicationContext接口,提供了不同的功能和扩展性,可以根据具体的应用场景选择合适的ApplicationContext子类来管理Bean实例。配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。BeanFactory是一个大工厂,是IOC容器的根基,有繁琐的bean声明周期处理过程,可以生成各种各样的Bean。是Spring框架中最常用的IoC容器,是BeanFactory的子接口,提供了更丰富的功能和更强的扩展性。
2024-07-10 17:33:24 1737
原创 设计模式探索:装饰器模式
装饰器模式(Decorator Pattern)装饰器模式是一种结构型设计模式,允许向一个对象动态添加行为。在不改变类的接口的情况下,装饰器模式在原始类上增加额外的职责,并且支持多个装饰器嵌套使用。装饰器模式是一种结构型设计模式,旨在动态地给对象添加额外的职责。优点:灵活性: 装饰器模式允许在运行时通过添加装饰器来扩展对象的功能,比静态继承更加灵活。可扩展性: 可以对一个对象进行多次装饰,以实现不同的行为或功能。低耦合度: 装饰器模式允许开发者在不修改对象本身的情况下增加新功能。开闭原则。
2024-07-09 21:44:51 961
原创 设计模式探索:适配器模式
将一个类的接口转换为客户期望的另一个接口,适配器可以让不兼容的两个类一起协同工作。适配器模式的主要作用是把原本不兼容的接口,通过适配修改做到统一,使得用户方便使用。比如,万能充电器和多接口数据线都是为了适配各种不同的接口。为什么要转换接口?原接口和目标接口都已经存在,不易修改接口代码。抽象接口希望复用已有组件的逻辑。优点:解耦合: 适配器模式允许两个没有直接关联的类协同工作,降低了它们之间的耦合度。提高复用性: 通过适配器,可以重用现有的类,而不需要修改它们的代码。统一接口。
2024-07-09 20:22:10 1356
原创 设计模式探索:观察者模式
观察者模式用于建立一种对象与对象之间的依赖关系,当一个对象发生改变时将自动通知其他对象,其他对象会相应地作出反应。抽象主题角色把所有观察者对象保存在一个集合里,每个主题可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。观察者的抽象类,定义了一个更新接口,使得在得到主题更改通知时更新自己。实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。
2024-07-09 00:21:44 1436
原创 设计模式探索:责任链模式
责任链模式(Chain of Responsibility Pattern) 是一种行为型设计模式。避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止。降低了对象之间的耦合。增强了给对象委派职责的灵活性。简化了对象之间的连接,责任分担更加明确。不能保证每个请求一定被处理。系统性能可能会有影响。增加了客户端的复杂性。在运行时需要使用多个对象对一个请求进行处理。
2024-07-07 17:56:35 904
原创 设计模式探索:建造者模式
建造者模式(Builder Pattern),也被称为生成器模式,是一种创建型设计模式。定义:将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无需知道其内部的具体构造细节。
2024-07-07 03:39:37 987
原创 设计模式探索:策略模式
策略模式(Strategy Pattern)的原始定义是:定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。策略模式通过定义一系列算法,将每一个算法封装起来,并使它们可以相互替换,从而让算法可以独立于使用它的客户端而变化。通过使用策略模式,可以提高代码的扩展性、可读性和维护性,同时也可以消除大量的条件语句。
2024-07-06 17:27:32 1390
原创 深入解析代理模式:静态代理与动态代理的比较及JDK与CGLIB动态代理技术
静态代理适用于代理对象类型固定、接口较少、性能要求较高的情况。动态代理适用于代理对象类型不固定、接口较多、灵活性要求较高的情况。通过动态代理,可以根据接口或目标对象,计算出代理类的字节码,然后再加载到JVM中使用,使得代理对象的生成和方法调用更加灵活和动态。JDK动态代理和CGLIB动态代理是Java语言中实现动态代理的两种方式。JDK动态代理:适用于代理接口方法,性能稍低,使用反射机制。CGLIB动态代理:适用于代理普通类方法,性能较高,使用字节码生成技术。
2024-07-06 10:41:40 1266
原创 设计模式探索:代理模式
代理模式是一种结构型设计模式,通过为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和实际对象之间起到中介作用,可以在不改变真实对象的情况下增强或控制对真实对象的访问。
2024-07-06 10:05:02 934
原创 设计模式探索:单例模式
定义: 单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一种全局访问点以访问该实例。常见的场景包括身份证号码、政府等需要唯一实例的情况。单例模式通常用于那些需要在应用程序中仅存在一个实例的情况,例如配置管理器、线程池、数据库连接池等。通过使用单例模式,可以确保该类的唯一实例在整个应用程序中被共享和使用。关键元素私有的构造函数,以防止类的直接实例化。私有的静态成员变量,用于存储类的唯一实例。一个公共的静态方法,用于返回类的唯一实例。该方法负责创建实例(如果尚未创建)并返回该实例的引用。
2024-07-05 21:43:43 963
原创 并发编程面试题3
本质上是一个计数器,用于协调多个线程之间的同步。主要应用场景是在多线程并行处理业务时,需要等待其他线程处理完再进行后续操作,例如合并结果或响应用户请求。是一种信号量,用于控制同时访问某个特定资源的线程数量,常用于限流。:CountDownLatch 不能重复使用,用完即销毁。
2024-07-04 13:13:06 1362
原创 并发编程面试题2
基于addWaiter方法,先将当前Node的prev指向tail节点,再将tail指向当前节点,再让prev节点指向当前节点。Lock在线程持有锁时,执行await方法,会将线程封装为Node对象,扔到Condition单向链表中,等待唤醒。持有锁的线程如果执行了condition的await方法,线程会封装为Node添加到Condition的单向链表中,等待被唤醒并重新竞争锁资源。如果线程没有获取到资源,就需要将线程封装为Node对象,安排到AQS的双向链表中排队,并且可能会挂起线程。
2024-07-03 22:08:38 906
原创 并发编程面试题1
单例模式中的懒汉机制会有有序性问题。DCL(Double-Checked Locking)方式存在指令重排问题,可能导致NullPointerException。在Java编译时,JIT会优化指令顺序,提升执行效率。在CPU层面,也会对指令进行重新排序,提升执行效率。这种指令调整在特殊操作上可能会导致问题。
2024-07-03 14:09:53 1020
原创 Java并发编程深度解析面试题:从AQS到ConcurrentHashMap,深入理解JUC
但是因为最小单位是缓存行,你只修改了数据A,缓存行也是被写过的,CPU会认定当前缓存行失效,再次操作数据B时,会认为数据B可能也有变化,重新的去主内存拉取数据B。DCL去做的,锁的实现是基于CAS的方式去玩的。但是读锁是共享的,读锁的重入是如何实现的?CPU内部提供了L1,L2,L3缓存,其中速度最快的是L1,一般的CPU,L1缓存是以。读锁还针对最后一个获取读锁的线程,单路的将HoldCounter从ThreadLocal中取出,放到属性中,以后就不需要反复的从ThreadLocal获取。
2024-07-02 10:30:13 1055
原创 面试突击指南:Java基础面试题4
应用层:各种应用程序协议,比如HTTP、HTTPS、FTP、DNS等。表示层:加密解密、转换翻译、压缩解压缩。会话层:不同机器上的用户建立和管理会话。传输层:接受上一层的数据,对数据进行分割并传送。网络层:控制子网的运行,如逻辑编址、分组传输、路由选择。数据链路层:物理寻址,将原始比特流转变为逻辑传输路线。物理层:机械、电子、定时接口通信信道上的原始比特流传输。应用层:对应OSI的应用层、表示层、会话层。传输层:对应OSI的传输层。网络层:对应OSI的网络层。网络接口层。
2024-07-01 22:19:25 922
原创 高考后的抉择:专业优先还是学校优先?
无论是选择专业优先还是学校优先,每个选择都有其独特的优点和挑战。关键在于了解自己,明确目标,做出最适合自己的决定。在这个重要的时刻,希望每一位高考生都能做出明智的选择,开启大学新生活的大门。欢迎大家结合自己的经历,一起讨论交流,为24年的高考生们及未来的考生提供宝贵的参考建议!
2024-06-28 11:08:04 447
原创 GPT-5的到来:智能飞跃与未来畅想
GPT-5的即将登场标志着AI技术的又一次飞跃。它将为我们的工作和生活带来巨大变化,提供更多的应用场景和创新可能性。让我们共同期待这一技术变革,并积极准备迎接AI赋能下的美好未来。现在就加入讨论,分享你的见解和期待,一起畅想AI赋能下的未来吧!
2024-06-27 20:44:54 473
原创 使用systemd管理Linux下的frps服务:安装、配置及自动化操作指南
通过上述步骤,您可以在 Linux 系统下使用 systemd 管理 frps 服务,包括启动、停止、重启、查看状态以及配置开机自启动。这使得 frps 的管理变得更加方便和自动化。
2024-06-27 16:43:40 583
原创 使用FRP 0.58版本进行内网穿透的详细教程
FRP(Fast Reverse Proxy)是一款高性能的反向代理应用,主要用于内网穿透。通过FRP,您可以将内网服务暴露给外网用户,无需进行复杂的网络配置。配置frps.toml[common]配置frpc.toml[common][web]在浏览器中访问。
2024-06-27 16:13:46 4182
原创 面试突击指南:Java基础面试题3
进程:一个独立的正在执行的程序。线程:一个进程的最基本的执行单位,执行路径。多进程:在操作系统中,同时运行多个程序。多进程的好处:可以充分利用CPU,提高CPU的使用率。多线程:在同一个进程(应用程序)中同时执行多个线程。多线程的好处:提高进程的执行使用率,提高了CPU的使用率。注意在同一个时间点,一个CPU中只可能有一个线程在执行。多线程不能提高效率,反而会降低效率,但可以提高CPU的使用率。一个进程如果有多条执行路径,则称为多线程程序。
2024-06-27 10:32:17 1458
原创 面试突击指南:Java基础面试题2
基本类型大小(字节)默认值封装类byte1(byte)0Byteshort2(short)0Shortint40Integerlong80LLongfloat40.0fFloatdouble80.0dDoublebooleanfalseBooleanchar2Characterint是基本数据类型,Integer是int的封装类,属于引用类型。int默认值是0,而Integer默认值是null,因此Integer能区分出0和null的情况。
2024-06-26 20:39:52 1165
原创 深入浅出:npm常用命令详解与实践
npm(Node Package Manager)是 Node.js 的包管理工具,用于安装、管理和发布 JavaScript 包。熟悉 npm 常用命令对开发者来说非常重要,本文将深入浅出地讲解一些常用的 npm 命令及其实践。通过上述实践,我们可以初步了解 npm 的常用命令及其使用场景。熟练掌握这些命令,可以极大地提高开发效率和项目管理的规范性。安装依赖是 npm 最常用的功能之一。文件,用于管理项目的依赖和元数据。全局安装的包可以在命令行中直接使用。初始化项目可以生成一个。
2024-06-25 15:57:37 1109
原创 Redis入门与应用(2)
Redis支持的value类型包括了String、哈希表、列表、集合等,这使得Redis能够在实际业务场景中得到广泛的应用。能描述键含义的前提下适当减少键的长度,从而减少内存浪费。命令时间复杂度是O(n),当Redis保存大量键时会影响性能,线上环境禁止使用,推荐使用。命令都可以将其删除。返回删除键个数,删除不存在键返回0,支持删除多个键。命令删除旧的键,如果键对应的值比较大,会存在阻塞Redis的可能性。连接到Redis服务后,可以进入命令行模式,执行多条命令。检查键是否存在,存在返回1,不存在返回0。
2024-06-25 14:14:43 823
原创 Redis入门与应用(1)
Redis是一个开源的基于键值对(Key-Value)的NoSQL数据库,使用ANSI C语言编写,支持网络,基于内存但支持持久化。我们可以将Redis视为一个巨大的Map,对Map的操作就是get和put,通过key操作这个key所对应的value。Redis编译完成后,会生成几个可执行文件,如redis-server和redis-cli。以上是Redis的入门与应用,包括技术全景、应用场景、版本选择与安装以及启动方式。配置文件启动是最常用的方式,配置文件可以方便地修改端口、配置和增加密码。
2024-06-24 19:32:34 975
原创 面试突击指南:Java基础面试题1
Fork/Join框架是Java 7引入的一个用于并行执行任务的框架。它通过将大任务分割成若干小任务,并行执行这些小任务,最终汇总每个小任务的结果来得到大任务的结果。
2024-06-23 21:56:47 913
sql语言初级教程及学习资源
2024-06-12
中国行政区划数据获取(java版本生成插入sql)
2024-06-11
maven下载、安装、配置与使用教程(windows、Linux)
2024-06-11
elasticsearch-7.14.0和ik分词器
2024-06-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人