自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 大型系统性能优化问题

监控与定位瓶颈:不要盲目优化。先上监控!使用APM工具(如SkyWalking, Arthas)和数据库慢查询日志,找到最耗时的接口和最慢的SQL。从索引和SQL入手:这是成本最低、效果最显著的优化。解决慢查询,优化索引。引入缓存:缓解数据库的读压力。架构升级:当单机数据库到达瓶颈时,实施读写分离和分库分表。代码级优化:贯穿始终,优化业务逻辑,使用连接池、批处理和异步。优化是一个持续的过程,需要根据实际的业务场景和监控数据来不断调整策略。

2025-10-31 13:27:12 1070

原创 关于序列化

想象一下,你想把一个精美的乐高模型从北京寄到上海。你不能直接把拼好的模型寄过去,因为它体积庞大且易碎。你会怎么做?你会把它拆解成一个个独立的乐高积木块,整齐地放进箱子(变成一个数据流),然后寄出去。对方收到后,再根据图纸重新拼装回原来的模型。序列化:将一个内存中的对象转换成可以存储或传输的格式的(通常是二进制流,也可以是json、XML)过程.反序列化:将之前序列化得到的格式重新转换为一个内存中对象的过程。

2025-10-31 12:35:59 640

原创 volatile底层实现原理

如果不用volatile,步骤2和3可能被重排序,导致另一个线程在第一次检查时,看到instance不为nul(步骤3已执行),但对象还未初始化完成(步骤2未执行),从而访问到一个不完整的对象。这是一个“全能型”屏障,同时具有其他三种屏障的效果,但开销也最昂贵。在一个 volatile 变量写操作之前,JVM 会插入一个 StoreStore 屏障,之后会插入一个 StoreLoad 屏障。作用:确保 Store1 的数据刷新到主内存(对其他处理器可见)的操作先于 Store2 及所有后续存储操作。

2025-10-21 17:16:26 635

原创 Java的垃圾回收算法和策略

在 JVM 中,垃圾指的是那些在程序运行过程中已经不再被任何地方引用的对象。这些对象占据了堆内存空间,却已经毫无用处,回收它们释放出的空间可以用于创建新的对象。CMS: 它的“并发”体现在与用户线程交替工作,以减少停顿时间。但它会产生碎片,并且在并发阶段会占用一部分线程资源,导致应用程序变慢。G1。

2025-10-20 02:15:20 552

原创 注解和反射

反射机制允许程序在运行时(而非编译时)检查、获取和操作类、接口、字段、方法等组件的信息。它打破了Java的封装性,可以“看透”类地内部结构。简单来说,反射就是在运行时动态地认识一个类,并与之交互。

2025-10-20 01:29:39 838

原创 注解~~~~~~

详见: https://blog.youkuaiyun.com/zhijingege/article/details/148950026?

2025-10-18 17:04:06 627

原创 线程池的一些了解

*** 自定义线程池工具类*//*** 创建固定大小线程池* @param corePoolSize 核心线程数* @param maximumPoolSize 最大线程数* @param keepAliveTime 空闲线程存活时间* @param unit 时间单位* @param queueCapacity 任务队列容量* @param threadNamePrefix 线程名称前缀* @param allowCoreThreadTimeOut 是否允许核心线程超时。

2025-10-14 19:11:16 865

原创 关于高并发的一连串问题分析(未完成)

高并发场景下,我们可以将请求异步处理,先把已在处理的消息返回给前端,然后把一个个的请求丢到消息队列中(Kafka、RocketMq、RabbitMq)一个个进行处理,这样可以缓解短时间高并发带来的影响;使用es做搜索引擎解决分库分表带来的搜索难题;根据业务场景选择策略。

2025-09-07 21:24:05 263

原创 【关于线程的一些总结】

如果队列中有任务,就继续执行队列中的任务,如果队列为空,会根据有我们线程池的配置,比如说核心线程数超时时间、能否允许核心线程数回收等来决定是否结束;主要由Thread类来实现,他提供两个关键的方法:start()和run(),调用start方法会触发地城的native()和start0向操作系统申请资源并等待CPU调度,当线程被CPU调用后会回调Thread的run方法,然后执行run方法:因此启动线程的方式其实hi有Thread的start方法;

2025-09-06 18:15:52 606

原创 优雅翻译前端返回中文描述

(可以自定义对字段的翻译,也有如上的6种效果)@OverrideSystem.out.println("拓展功能:自定义对字段的翻译")@ApiModelProperty(value = "数据字典的通知类型")效果:{"xzppppp":"12","xzpppppName":"hahaha"}

2025-06-27 15:15:25 574

原创 分布式ID生成的几种方案(后续待补充)

使用数据库的ID自增策略,如MySQL的auto_increment。并且可以使用两台数据库分别设置不同步长,生成不重复ID的策略来实现高可用。Redis的所有命令操作都是单线程的,本身提供像incr和increby这样的自增原子命令,所以能保证生成的ID肯定是唯一有序的;算法核心思想是结合机器的网卡、当地时间、一个随机数来生成UUID;高可用性:确保任何时候都能正确的生成ID;本地生成,生成简单且性能好,没有网络消耗;唯一性:确保生成的ID是全网唯一的;

2024-04-09 11:55:55 635

原创 JVM的小结

线程私有线程共享。

2024-03-07 16:49:28 668

原创 关于装载类子系统

自定义类加载器(Custom ClassLoader):Java允许我们自定义类加载器,只需要继承java.lang.ClassLoader类,并重写findClass方法即可。这样可以让Java类具有动态加载和热加载的能力,提高了Java程序的灵活性。

2024-03-07 11:40:03 1002

原创 关于三色标记算法

三色标记算法是一种用于垃圾收集得算法,主要用于解决在并发垃圾收集中可能出现得对象引用更新问题。在JVM中,这种算法主要应用于CMS(ConcurrentMarkSweep)收集器和G1(Garbage-first)收集器。

2024-02-19 14:52:08 1123

原创 关于String 的创建与内存存储

字符串常量池(String Pool,也称 String Table),在 JDK1.7 之前存放在方法区内,在 JDK1.7 及之后版本,字符串常量池的位置更改到了堆内存中。

2024-02-18 16:56:12 1001

原创 【关于forEach的一些问题】

今天使用流对一个需求列表进行分组,分组后得到一个map集合我需要循环着一个map集合,同时需要在循环外初始化一个变量,在循环内累加;代码如下:但是着端代码是存在问题的,直接就编译报错了;因为Lambda表达式中引用的局部变量必须是final或者effectively final的,这里count在Lambda表达式中被赋值,这使得它不再是final或effectively final的,因此编译器会报错;这样编译不再报错,但是运行结果,supplyCount始终 为0,createSupply(

2023-12-19 10:24:41 1330

原创 【redis实现自增流水并设置过期时间】

传递给它,并在Spring应用程序中使用该类来获取自增的两位流水号,并且每分钟重置。命令来实现递增操作。首先,我们根据当前日期和时间生成一个唯一的键,然后使用。如果还有其他问题,请随时提问。如果你需要一个自增的两位流水号,可以使用Redis的。如果递增后的值为1,表示新的一分钟开始了,我们使用。将流水号格式化为两位字符串,并返回生成的流水号。在这个修正后的示例中,我们使用Redis的。方法设置键的过期时间为1分钟。方法对该键的值进行递增操作。命令结合一些逻辑来实现。

2023-10-25 14:48:27 1864

原创 【Java常见的几种设计模式】

简述Java常见的几种设计模式

2023-10-13 10:47:44 359

原创 【给图片添加水印水印】

【代码】【给图片添加水印水印】

2023-07-25 13:37:54 286

原创 自己实现的security

自己实现的security

2022-09-20 11:00:47 161

原创 spring Security初体验

security整合

2022-08-29 16:13:08 192

原创 nginx和gateway的区别

gateway与nginx的区别

2022-08-24 18:47:22 5783 1

原创 MQ消息积压问题

消费积压

2022-06-29 13:58:53 436

原创 redis数据类型

五种常见类型:string、hash、list、set、zsetstring大多数场景可以用作缓存,value为json字符串hash购物车(用户ID作为hashKey,商品ID为内层key,商品的简单信息json作为value)listStack(栈) = LPUSH + LPOPQueue(队列) = LPUSH + RPOPBlocking MQ (阻塞队列) = LPUSH + BRPOP(有数据进来才读取,实现类似监听的功能)使用场景:微博消息,公众号消息,使用栈的结构,先进

2022-05-23 17:48:42 128

原创 springcloud-Ribbon

基本用法:注入一个RestTemplate,并使用@loadBalanced注解标注RestTemplate,从而使RestTemplate具备负载均衡的能力。当spring容器启动时,使用#loadBalanced注解修饰RestTemplate会被添加拦截器,拦截器中使用了LoadBalancerClient处理请求,从而达到负载均衡的目的。LoadBalancerClient是springCloud提供的一个非常重要的接口,他继承自ServicelnstanceChoose,该接口实现类是Rib

2022-05-22 21:27:17 303

原创 消息重复问题

在消息传递过程中,如果出现传递失败的情况,发送发会执行重试,重试的过程就又可能会产生重复消息,对使用消息队列的业务系统来说,如果没有对重复消息进行处理,就又可能会导致系统数据出现错误。消费重复的情况是必然存在在MQTT协议中,给出了三种传递消息是提供的服务质量标准,这三种服务质量从低到高依次是:At most once:至多一次;在消息传递时,最多会被送达一次,换一个说法就是,没有什么消息可靠性保证,允许丢消息,一般都是一些对消息可靠性要求不高的监控场景使用,可以接受数据少量丢失。At least

2022-05-20 16:28:29 1284

原创 消息的可靠传递

检查是否丢失消息的方法我们可以利用消息队列的有序性来检验是否丢失消息:在producer端,我们给每个消息附加一个连续的递增序号,然后在consumer端来检查这个序号的连续性。如果消息没有丢失,consumer收到消息的序号必然是连续递增的,否则,我们可以通过确实的序号来确定丢失的是哪条消息,方便进一步排查大多数消息队列的客户端序号注入到消息中,在consumer收到消息的拦截器检测序号的连续性,这样不会入侵代码,也方便这部分检测的逻辑关闭或者删除。在分布式环境下需要注意以下这几个问题:首先,像

2022-05-17 16:48:02 249

原创 分布式事务

事务四大特性:1、原子性:事务作为一个整体,要么全部成功要么全部失败2、隔离性:多个事务并发执行时,事务与事务间相互独立,互不影响3、一致性:数据库操作的前后数据要保持一致4、持久性:已经提交的事务对数据库的修该是永久的。为什么要使用分布式事务当一个服务中有多个数据库操作,而且需要调用别的微服务的时候,本地的事务管理器无法管理本项目外的事务;当本项目中出现异常需要回滚时,无法回滚本项目外的事务,这就导致的数据不一致,本质上来说分布式事务就是为了保证数据库的数据一致性;CAP定理C:一致性

2022-05-13 10:38:00 492

原创 几种消息中间件的对比

消息队列的本质是将同步处理结果转换成异步处理,一步会带来相应的好处,但也有弊端。好处:1、可以在模块、服务、接口等不同粒度上实现解耦2、订阅/消费模式可以在数据粒度上解耦3、可提高系统的并发能力,集中力量办大事(同步部分),碎片时间做小时(异步部分)4、可提高系统可用性,因为缓冲了系统负载弊端:1、降低了数据一致性,如要保持强一致性,需要高代价的补偿(如分布式事务,对账)2、有数据丢失风险,如宕机重启,如果要保障队列可用,需要额外机制保障(如双或容灾)总体来说,消息队列的使用场景很多,如秒

2022-05-12 20:57:43 551 1

原创 关于JVM的垃圾回收

堆内存划分:老年代:年轻代:Eden区:Survivor区:(1)From(2)To分配策略1:优先在Eden区分配多数情况下,对象在Eden区分配,当Eden区没有足够空间分配时,虚拟机将发起一次minorGCMinor GC和Full GCMinor GC也称为Young GC 指发生新生代的垃圾收集动作,回收频率较高,回收速度快Full GC也成为了Major GC 一般会回收老年代、年轻代、方法区的垃圾,回收速度比Minor GC慢十倍。分配策略2:大对象直接进入老年代

2022-05-12 10:58:02 201

原创 JVM内存模型

1.类加载器启动类加载器扩展类加载器应用程序类加载器自定义加载器双亲委派模型如果一个类接受到请求,他首先将请求交给父类加载器,直至找到启动类加载器,如果父类加载器加载失败,当前类加载器才会自己加载类。2.运行时数据区线程共享:方法区、堆线程私有:虚拟机栈、本地方法栈、程序计数器3.执行引擎4.本地库接口类加载器将代码转换成字节,然后通过运行时数据区将字节码加载到内存中,执行引擎在内存中将字节码翻译成系统能够执行的命令,交由CPU执行而这个过程需要使用对应语言的本地库接口。...

2022-05-07 11:06:33 247

原创 spring bean 生命周期

1.实例化bean对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入一个尚未初始化的依赖容器会调用createBean进行实例化。对于ApplicationContext容器,当容器启动结束后,便实例化所有的bean,容器通过获取BeanDefinition对象中的信息进行实例化。并且这一步仅仅是简单的实例化,并未进行依赖注入,实例化对象呗包装在BeanWrapper对象中,BeanWrapper提供了设置对象属性的接口,从而避免了使用反射机制.

2022-05-07 10:42:16 135

原创 数据库的事务

A:原子性有undo log日志保证,它记录了需要回滚的日志信息,事物回滚时撤销已经执行成功的sqlC:一致性由其他三大特性保证、程序代码要保证业务上的一致性I:隔离性有MVVC来保证D:持久性由内存+redo log 来保证,MySQL修改数据同时在内存和redo log记录这次操作,宕机的时候可以从redo log恢复InnoDB redo log 写盘,InnoDB事物进入prepare状态,如果前面prepare成功,binlog写盘,再据需将事务日志持久化到binlog,如果持久化成功,

2022-05-05 10:36:34 1147

原创 数据库和缓存数据的一致性问题

1、先更新MySQL,再更新redis,如果更新redis失败,可能仍然不一致2、先删除redis缓存数据,再更新MySQL,再次查询的时候讲数据添加到缓存仲,这种方案解决1方案的问题,但是在高并发下性能比较低,而且仍然会出现数据不一致的问题,比如线程1删除了redis的数据,正在更新MySQL,此时另外一个查询再查询,那么会吧MySQL仲老数据又查到redis中。3、延时双删,步骤是:先删除redis缓存数据,再更新MySQL,延时几百毫秒再删除redis缓存数据,这样就算在更新MySQL时,其他线程

2022-05-05 10:26:19 1446

原创 MySQL锁

按照锁的粒度分类1、行锁:锁某行数据,锁粒度最小,并发度高2、表锁:锁整张表,所粒度最大,并发最低3、间隙锁:锁的是一个区间还可以分为:1、共享锁(读锁):一个事务给某行数据加了读锁,其他事务也可以读,但不能写2、排他锁(写锁):一个事务够某行数据加了写锁,其他事务不能再加读锁,且不能写还可以分为:1、乐观锁:并不会真正的去锁某行记录,而是通过一个版本号来实现2、悲观锁:上面的行锁,表锁都是悲观锁在事务隔离级别实现中,就需要利用锁来解决欢度(Innodb解决了幻读的问题)...

2022-05-05 10:18:40 538

原创 关于MySQL索引的一些总结

基本原理1、把创建了索引的列的内容进行排序2、对排序结果生成倒排表3、在倒排表内容上拼上数据地址4、在查询的时候,先拿到倒排表的内容,在取出数据地址链,从而拿到具体数据;B+树在MySQL中,一个page(页)就等于16KB在查询的时候,每个查询的最小单位是一个pageB+树就是在B树基础上,叶子节点之间多了个指针,结构如下图:索引类型:1.普通索引index :加速查找2.唯一索引主键索引:primary key :加速查找+约束(不为空且唯一)唯一索引:unique:加速查找+

2022-05-04 13:14:05 241

原创 MySQL索引及性能优化

性能下降的表现1.执行时间长2.等待时间长性能下降的原因查询语句写的不好,各种连接,各种子查询导致用不上所以或者没有建立索引建立的索引失效,建立了索引,在真正执行时,没有用上建立的索引管理查询太多join服务器调优及配置参数导致,如果设置的不合理,比例不恰当,也会导致性能下降,sql面man系统架构问题通用的优化方案设计优化:表的设计合理化(符合三大范式,有时候要进行反三大范式)索引优化:添加适当的索引sql优化:写出高质量的sql,避免索引失效架构优化:分表技术,主从复制,

2022-05-04 11:37:10 142

原创 2021-05-30

Spring资源管理Spring资源管理为什么 Spring 不使用 Java 标准资源管理?Java 标准资源管理Java URL 协议扩展基于 java.net.URLStreamHandlerFactory 扩展协议Spring 资源接口资源接口內建实现Spring Resource 接口扩展可写资源接口编码资源接口Spring 资源加载器Resource 加载器Spring 通配路径资源加载器通配路径 ResourceLoader路径匹配器Spring 通配路径资源扩展依赖注入 Spring Res

2021-05-30 20:49:01 157

原创 springboot源码解读

springboot:parent依赖原理起步依赖:spring-boot-starter-parent项目环境属性锁定:spring-boot-dependencies锁定依赖版本:小结:我们的项目继承spring-boot-starter-parent父级的作用是什么从上面可以看出:管理项目的maven插件锁定框架的依赖版本管理springboot配置文件spr...

2020-04-04 22:58:20 223

原创 POI常用API

依赖: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version> </dependency> ...

2020-03-20 20:49:36 1963

空空如也

空空如也

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

TA关注的人

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