自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 用 explain 如何优化sql性能?

对于互联网公司来说,随着用户量和数据量的不断增加,慢查询是无法避免的问题。一般情况下如果出现慢查询,意味着接口响应慢、接口超时等问题。如果是高并发的场景,可能会出现数据库连接被占满的情况,直接导致服务不可用。慢查询的确会导致很多问题,我们要如何优化慢查询呢?主要解决办法有:监控sql执行情况,发邮件、短信报警,便于快速识别慢查询sql打开数据库慢查询日志功能简化业务逻辑代码重构、优化异步处理sql优化索引优化其他的办法先不说,后面有机会再单独介绍。

2024-05-23 13:57:03 638

原创 SpringBoot 实现 RAS+AES 自动接口解密

接口安全老生常谈了过年之前做了过一款飞机大战的H5小游戏,里面无限模式-需要保存用户的积分,因为使用的Body传参,参数是可见的。为了接口安全我,我和前端约定了传递参数是:用户无限模式的积分+“我们约定的一个数字”+用户id的和,在用Base64加密,请求到服务器我再解密,出用户无限模式的积分;如下:可是过年的时候,运营突然找我说无限模式积分排行榜分数不对:这就很诡异了,第二名才一万多分,第一名就40多万分!!!!一开始我以为是我解密有问题,反复看了好几变,可就两三行代码不可能有问题的!!!没办法我去

2024-05-23 13:53:34 366 1

原创 我使用缓存,踩过的7个坑

缓存在我们日常工作中,经常会使用,但如果用不好坑也挺多的。这篇文章总结了我工作中使用缓存遇到过的7个坑,还是非常有参考价值的,希望对你会有所帮助。

2024-05-23 13:50:45 516

原创 Spring Event 别瞎用!从线上事故中,我总结了6 条最佳实践!

今天我们重点聊聊使用 Spring Event 最为关键的几个问题。这是我司线上生产环境实际踩坑后,总结的极为宝贵的经验!Spring Event框架实现了基于事件的发布订阅机制。开发者可以自定义事件,在某些业务场景发布事件,Spring 会将该事件广播给监听该事件的监听者。监听者可以实现Spring 的监听者接口注册自己,也可以使用注解注册自己。这是Spring Event 的简短介绍,网上有大量的入门级教程,我在此不过多赘述,进入正文!

2024-04-24 13:47:58 609

原创 6 款 工具,轻松分析定位 JVM 问题!

你可能一开始会比较畏惧使用复杂的工具去排查问题,又或者是打开了工具感觉无从下手,但是随着实践越来越多,对 Java 程序和各种框架的运作越来越熟悉,你会发现使用这些工具越来越顺手。这篇文章中介绍下如何使用 JDK 自带工具来分析和定位 Java 程序的问题。

2024-04-24 13:46:17 388

原创 消息队列的七种经典应用场景

在笔者心中,是高并发解决方案三剑客。在职业生涯中,笔者曾经使用过 ActiveMQ 、RabbitMQ 、Kafka 、RocketMQ 这些知名的消息队列。这篇文章,笔者结合自己的真实经历,和大家分享消息队列的七种经典应用场景。

2024-04-02 15:26:34 929

原创 MySQL定时任务,解放双手,轻松实现自动化

创建事件或定时任务可以解决很多重复性工作,配合着动态 sql 和存储过程能起到实时更新数据功能,不需要人工干预,提高了工作效率,让我们有更多的时间学习和处理其它问题。

2024-04-02 15:25:06 379

转载 Synchronized原理解析——如果你愿意一层一层剥开我的心

同步代码块是通过monitorenter和monitorexit来实现,当线程执行到monitorenter的时候要先获得monitor锁,才能执行后面的方法。当线程执行到monitorexit的时候则要释放锁。同步方法是通过中设置ACCSYNCHRONIZED标志来实现,当线程执行有ACCSYNCHRONI标志的方法,需要获得monitor锁。每个对象维护一个加锁计数器,为0表示可以被其他线程获得锁,不为0时,只有当前锁的线程才能再次获得锁。

2024-03-18 14:00:39 33

原创 6 个技术点带你理解 Kafka 高性能背后的原理

本文介绍了 Kafka 实现高性能用到的关键技术,这些技术可以为我们学习和工作提供参考。

2024-03-15 13:27:07 797

原创 4 种策略让 MySQL 和 Redis 数据保持一致

Read Through 和 WriteThrough 的流程类似,只是在客户端查询数据A时,如果缓存中数据A失效了(过期或被驱逐淘汰),则缓存会同步去数据库中查询数据A,并缓存起来,再返回给客户端。可见,最后缓存中的数据A和数据库中的数据 A 是一致的,理论上可能会出现一小段时间数据不一致,不过这种概率也比较低,大部分的业务也不会有太大的问题。可见,最后缓存中的数据 A 跟数据库中的数据 A 是不一致的,缓存中的数据A是旧的脏数据。客户端1 更新缓存中数据 A,缓存同步更新数据库中数据 A,再返回结果。

2024-03-15 13:26:08 1223 1

原创 RocketMQ为什么这么快?我从源码中扒出了10大原因!

在传统IO中,如果想将用户缓存区的数据放到内核缓冲区,需要经过CPU拷贝而基于零拷贝技术可以减少CPU拷贝次数,常见的有两种:mmap()sendfile()mmap()是将用户缓冲区和内核缓冲区共享,操作用户缓冲区就好像直接操作内核缓冲区,读写数据时不需要CPU拷贝Java中可以使用MappedByteBuffer这个API来达到操作内核缓冲区的效果sendfile()主要是用于文件传输,可以通过sendfile()将一个文件内容传输到另一个文件中或者是网络中。

2024-03-13 15:38:30 848

原创 MySQL锁(读锁、共享锁、写锁、S锁、排它锁、独占锁、X锁、表锁、意向锁、自增锁、MDL锁、RL锁、GL锁、NKL锁、插入意向锁、间隙锁、页锁、悲观锁、乐观锁

在 MySQL 中,当发生死锁时,MySQL 使用一种叫做"最小成本回滚"(InnoDB 中称为"最小编号事务回滚")的策略来选择一个事务作为牺牲者并进行回滚,最小成本回滚策略是 MySQL 的默认行为,它会自动选择牺牲者并回滚事务。最小成本回滚策略的原理是选择最小成本的事务作为牺牲者。

2024-03-11 13:43:21 404

原创 一次线上JVM GC 长暂停排查,加班搞了好久

综上,我们得出结论,swap和GC同一时候发生会导致GC时间非常长,JVM严重卡顿,极端的情况下会导致服务崩溃。主要原因是:JVM进行GC时,需要对对应堆分区的已用内存进行遍历,假如GC的时候,有堆的一部分内容被交换到swap中,遍历到这部分的时候就须要将其交换回内存;更极端情况同一时刻因为内存空间不足,就需要把内存中堆的另外一部分换到SWAP中去,于是在遍历堆分区的过程中,会把整个堆分区轮流往SWAP写一遍,导致GC时间超长。

2024-03-11 13:32:12 847

原创 多线程这些线程安全的坑,你在工作中踩了么?

由线程引起的问题往往在测试中难以发现,到了线上就会造成重大的故障和损失使用多线程的问题很大程度上源于多个线程对同一变量的操作权,以及不同线程之间执行顺序的不确定性例如有一段很简单的扣库存功能操作,如下:csharp复制代码活跃性问题指的是,某个操作因为阻塞或循环,无法继续执行下去最典型的有三种,分别为死锁、活锁和饥饿死锁最常见的活跃性问题是死锁。

2024-03-09 15:38:08 342

原创 如何避免MYSQL主从延迟带来的读写问题?

GTID 的全称是,全局事务 ID,是一个事务在提交的时候生成的,是这个事务的唯一标识。MYSQL开启 GTID 模式的方式是 在启动一个 MySQL 实例的时候,加上参数和。每个事务是和GTID 值一一对应的,每个MYSQL实例会维护一个GTID 集合,来表示实例执行过的事务。在slave节点上,通过可以看到 GTID集合,如下图所示,,表示这对主备关系使用了 GTID 协议。,是备库收到的所有日志的 GTID 集合。,是备库所有已经执行完成的 GTID 集合。

2024-03-09 15:32:49 356

原创 面试官:JVM有哪些优化手段?

在 HotSpot 虚拟机中,热点代码(Hot Code)是指那些被频繁执行的代码。热点代码的执行次数在不同的 JDK 版本和不同的 JVM 中是不同的,例如,它在 JDK 21 Client 模式下为 1500 次,Server 模式下为 10000 次,这个值可以通过 JVM 参数设置。方法调用次数:当一个方法被调用一定次数后,会被视为热点代码并触发即时编译。这个次数在不同 JDK 版本中可能有所变化,并且可以通过 JVM 参数 -XX:CompileThreshold 进行设置。回边计数。

2024-03-08 13:15:29 812

原创 六种方式,教你在SpringBoot初始化时搞点事情!

在实际工作中总是需要在项目启动时做一些初始化的操作,比如初始化线程池、提前加载好加密证书.......那么经典问题来了,这也是面试官经常会问到的一个问题:有哪些手段在Spring Boot 项目启动的时候做一些事情?方法有很多种,下面介绍几种常见的方法。

2024-03-08 13:11:23 767

原创 一个你可能不曾注意的小东西,Spring依赖注入Bean类型的8种情况

到这Spring能够注入的Bean的8种类型就讲完了,其实这8种类型可以分为以下几种功能:单一注入,就是注入一个单一的对象集合注入,可以注入数组或者集合延迟注入,比如@Lazy、ObjectFactory、ObjectProvider、JSR-330 Provider安全注入,不存在不会抛异常,比如Optional、ObjectProvider这几种方式并不是互斥的,比如说延迟注入也可以注入的是一个集合,前面举的MyBaisPlus自动装配时ObjectProvider的使用就是很好的例子。

2024-03-08 13:09:45 779

原创 面试官:说说微服务灰度发布的底层实现?

微服务中的灰度发布(又称为金丝雀发布)是一种持续部署策略,它允许在正式环境的小部分用户群体上先部署新版本的应用程序或服务,而不是一次性对所有用户同时发布全新的版本。这种方式有助于在生产环境中逐步验证新版本的稳定性和兼容性,同时最小化潜在风险,不影响大部分用户的正常使用。

2024-03-07 13:34:05 946

原创 SpringBoot实现各种参数校验,写得太好了,建议收藏!

业务需求总是比框架提供的这些简单校验要复杂的多,我们可以自定义校验来满足我们的需求。自定义非常简单,假设我们自定义加密id(由数字或者a-f的字母组成,32-256自定义约束注解// 默认错误消息String message() default "加密id格式错误";// 分组Class

2024-03-07 13:33:15 1612

原创 分库分表如何管理不同实例中几万张分片表?

框架成员中的和都提供了自动化管理分片表的功能,可以统一维护大量的分片表,避免了手动编写脚本和维护分片表的繁琐工作,极大程度减少分库分表的开发和维护成本,提升效率和可靠性。这里咱们先使用来实际操作一下,方式后续会有单独的文章详细讲解,就不在这里展开了。上边为逻辑表配置分片规则,应用程序内执行对逻辑表的DDL操作,就可以很轻松的管理分片表。不过,默认的分片管理还是有局限性的,我们在设计分片规则时往往会根据不同的业务维度来划分,例如按天、月、按季度生成分片表并分布到不同数据源中等。

2024-03-06 13:54:13 1170

原创 工作中常用的6种设计模式

使用设计模式的宗旨:封装变化的部分,维护不变的宗旨好处:提高代码拓展性,程序更优雅更健壮对开源框架设计模式的使用,要提高鉴赏能力考虑可读性,不可为了设计模式而过度设计采石之人,应有建设大教堂的愿景。

2024-03-06 13:52:34 861

原创 一次线上JVM GC 长暂停排查,加班搞了好久

综上,我们得出结论,swap和GC同一时候发生会导致GC时间非常长,JVM严重卡顿,极端的情况下会导致服务崩溃。主要原因是:JVM进行GC时,需要对对应堆分区的已用内存进行遍历,假如GC的时候,有堆的一部分内容被交换到swap中,遍历到这部分的时候就须要将其交换回内存;更极端情况同一时刻因为内存空间不足,就需要把内存中堆的另外一部分换到SWAP中去,于是在遍历堆分区的过程中,会把整个堆分区轮流往SWAP写一遍,导致GC时间超长。

2024-03-06 13:51:49 771

原创 SpringBoot+Minio实现上传凭证、分片上传、秒传和断点续传

minio:@Component/*** 对象存储服务的URL*//*** Access key就像用户ID,可以唯一标识你的账户*//*** Secret key是你账户的密码*//*** 默认文件桶*/...@Beantry {现在启动服务即可。

2024-03-05 13:23:04 1111

原创 SpringBoot + Apache tika 轻松实现各种文档内容解析

Apache tika是Apache开源的一个文档解析工具。Apache Tika可以解析和提取一千多种不同的文件类型(如PPT、XLS和PDF)的内容和格式,并且Apache Tika提供了多种使用方式,既可以使用图形化操作页面(tika-app),又可以独立部署(tika-server)通过接口调用,还可以引入到项目中使用。本文演示在spring boot 中引入tika的方式解析文档。

2024-03-05 13:22:22 687

原创 Spring中最常用的11个扩展点

我们一说到spring,可能第一个想到的是IOC控制反转) 和AOP(面向切面编程)。没错,它们是spring的基石,得益于它们的优秀设计,使得spring能够从众多优秀框架中脱颖而出。除此之外,我们在使用spring的过程中,有没有发现它的扩展能力非常强。由于这个优势的存在,让spring拥有强大的包容能力,让很多第三方应用能够轻松投入spring的怀抱。比如:rocketmq、mybatis、redis等。今天跟大家一起聊聊,在Spring中最常用的11个扩展点。

2024-03-04 19:32:39 1345 1

原创 分库分表如何管理不同实例中几万张分片表?

框架成员中的和都提供了自动化管理分片表的功能,可以统一维护大量的分片表,避免了手动编写脚本和维护分片表的繁琐工作,极大程度减少分库分表的开发和维护成本,提升效率和可靠性。这里咱们先使用来实际操作一下,方式后续会有单独的文章详细讲解,就不在这里展开了。上边为逻辑表配置分片规则,应用程序内执行对逻辑表的DDL操作,就可以很轻松的管理分片表。不过,默认的分片管理还是有局限性的,我们在设计分片规则时往往会根据不同的业务维度来划分,例如按天、月、按季度生成分片表并分布到不同数据源中等。

2024-03-04 19:28:23 1002

原创 Spring 中一个少见的引介增强 IntroductionAdvisor

说白了,就是在生成代理对象的时候,把我们在 Advisor 中设置好的接口也考虑进去,这样生成的代理对象同时也是该接口的实现类,当然,在我们提供的 Advice 中,必须也要实现该接口,否则代理对象执行接口中的方法,找不到具体实现的时候就会报错了。getInterfaces:这个方法还比较重要,生成代理对象的时候,代理对象需要实现哪些接口,就是从这个地方定义的,这里返回 Animal,所以将来我拿到手的代理对象就实现了 Animal 接口,就能调用 Animal 中的方法了。

2023-07-26 13:45:24 477

原创 Java 大数字运算之 BigDecimal 类

在 Java 中提供了用于大数字运算的类,即 java.math.BigInteger 类和 java.math.BigDecimal 类。这两个类用于高精度计算,其中 BigInteger 类是针对整型大数字的处理类,而 BigDecimal 类是针对大小数的处理类。今天主要讲一下 BigDecimal 类。

2023-07-26 13:42:08 418

原创 带你深入分析 Spring 所提供的缓存 Cache 抽象详解的核心原理探索

缓存的工作机制是先从缓存中读取数据,如果没有再从慢速设备上读取实际数据,并将数据存入缓存中。通常情况下,我们会将那些经常读取且不经常修改的数据或昂贵(CPU/IO)的且对于相同请求有相同计算结果的数据存储到缓存中。它能够让数据更加接近于使用者,下图所示。复制代码这个图表示在应用程序和数据源之间添加了一个缓存层。在访问数据时,应用程序首先会尝试从缓存层中获取数据。如果数据已经存在于缓存中,则直接返回。否则,需要从数据源获取数据,并将其存储到缓存中,以便以后能够更快地获取相同的数据。

2023-06-05 09:55:50 300

原创 Record 模式提升了 Java,能实现更具表现力的编码

由于在 JEP 432 和 JEP 405 中进行了反馈驱动的增强,JEP 440,最终确定的记录模式(Record Patterns)已从 JDK 21 从 Proposed to Target 状态提升为 Target 状态。其中包括可变变量记录的 varargs 模式、匹配任何值但不声明模式变量的未命名模式,以及可以应用于任意类而不仅仅是记录类的值模式。记录模式的这种演变扩展了模式匹配,以解构记录类的实例,从而支持了更复杂的数据查询。的实例,新的记录模式都允许对其进行测试,并直接解构其组件。

2023-06-05 09:55:47 724

原创 这里有一个源码调试方法,短小精悍,简单粗暴,但足够好用。

但是这个技巧确实非常的简单,简单到一句话就能说明白,所以正如标题说到的“短小精悍,简单粗暴,但足够好用”,这篇文章也会非常的短。反正不管怎么样吧,这样在你的项目里面有一份“源码”了,这个“源码”和 JDK 里面的源码一模一样,这样你就能随便进行修改了。首先,把问题换个问法,既然我能把源码注释了,那说明我能修改源码。所以我提供的这个方法好像用处并不是很大,但是我当年看 Dubbo 源码的时候,就是这样的看的。但是我一般使用这个方法的时候,CV 过来时,会把类名称重命名一下,以示区分,其他的啥都不改。

2023-05-30 13:47:23 353

原创 一次redis主从切换导致的数据丢失与陷入只读状态故障

调整运行时maxmemory时同时调整配置文件maxmemory保持一致--。将配置文件maxmemory设置为0--表示不限制内存使用。正是因为对redis的认识和经验不足,没有想过到运行时配置与静态配置不一致可能导致的问题,这次不可避免的踩坑了。但是,作为一个本职RD,半路接手基本靠自学的兼职运维,要考虑到maxmemory的运行配置与静态配置一致性问题好像也确实不是那么的理所当然🤔。

2023-05-30 13:47:01 643

原创 一篇文章告诉你什么是Java内存模型

在单线程系统中,代码按照顺序从上往下顺序执行,执行不会出现问题。int a = 1;int b = 2;程序从上往下执行,最终c的结果一定会是3。但是在多线程环境中,代码就不一定会顺序执行了。代码的运行结果也有不确定性。在开发中,自己本地没问题,一行行查看代码也没有问题,但是在高并发的生产环境就会出现违背常理的问题。单核的cpu改成多核的cpu,每个cpu都有自己的缓存。多个线程可以在cpu线程切换。代码可能根据编译优化,更新代码的位置。这些优化会导致可见性原子性以及有序性。

2023-05-30 13:46:34 303

原创 Java并发工具合集JUC大爆发

如果不足够小,就必须分割成两个子任务,每个子任务在调用invokeAll方法时,又会进入compute方法,看看当前子任务是否需要继续分割成孙任务,如果不需要继续分割,则执行当前子任务并返回结果。优先执行线程 ,用于在线程到达屏障时,优先执行barrierAction,方便处理更复杂的业务场景,一般用于数据的整理以及汇总,例如excel插入一样,等所有线程都插入完了,到达了屏障后,barrierAction线程开始进行保存操作,完成后,接下来由其他线程开始进行插入,然后到达屏障接着就是保存,不断循环。

2023-04-19 13:17:53 828

原创 我把Solon打包成了native image,速度快的惊人

AOT 是 Ahead-Of-Time 的简写,指运行前编译,与之对应的是 JIT,即 Just-In-Time,即时(动态)编译,边运行边编译。Solon AOT 实际上是指Solon AOT 优化,帮助 GraalVM 更好的将 Solon 应用编译为本机可执行程序(native image),大体思路是构建时,检查应用上下文,找到被使用的类、方法、字段等,并做出相应的决策。Java 类(通常是动态代理)RuntimeNativeMetadata 运行时元数据,包括反射,资源,序列化等。

2023-04-19 11:58:58 470

原创 基于Mongodb分布式锁简单实现,解决定时任务并发执行问题

我们日常开发过程,会有一些定时任务的代码来统计一些系统运行数据,但是我们应用有需要部署多个实例,传统的通过配置文件来控制定时任务是否启动又太过繁琐,而且还经常出错,导致一些异常数据的产生网上有很多分布式锁的实现方案,基于redis、zk、等有很多,但是我的就是一个用了mysql和mongo的小应用,不准备引入其他三方中间件来解决这个问题,撸一个简单的分布式锁来解决定时任务并发执行的问题,加锁操作的原子性和防死锁也都要支持,这里我使用mongodb写了AllInOne的工具类。

2023-04-19 11:55:41 373

原创 池技术:连接池,线程池,内存池,进程池等汇总分析

这样,池技术通过缓存和重用资源,减少了资源创建和销毁的时间。网站性能优化:在构建高性能网站时,可以使用 HTTP 连接池、数据库连接池、线程池等池技术,同时结合缓存(如 Redis 缓存、CDN 缓存)、异步编程(如 AJAX、异步 I/O)以及负载均衡(如反向代理、DNS 负载均衡)等技术,共同提高网站性能。大数据处理:在大数据处理场景中,可以使用线程池、进程池等并行计算技术,同时结合资源预留、负载均衡(如 Hadoop 分布式文件系统、Spark 调度器)等技术,以提高数据处理性能和资源利用率。

2023-04-19 11:54:35 656

原创 Spring Boot入门与进阶

Spring Boot是基于Spring框架的一种轻量级、快速开发的Java应用程序框架。它旨在简化Spring应用程序的初始设置和开发过程,使开发者能够更快地构建独立的、基于生产级的Spring应用程序。Spring Boot提供了自动配置、嵌入式Web容器、快速应用程序启动等功能,使得开发者无需关注底层的配置,可以专注于业务逻辑的实现。

2023-04-19 11:53:15 689

原创 再也不怕面试官问:详解Synchronized和Lock的实现原理及使用场景

一般情况建议使用Synchronized,在JDK1.5之前Lock优于Synchronized,但在JDK1.5之后对Synchronized进行了优化,后面在性能方面基本与Lock一样且使用简单(有作者说"Synchronized是亲生的,JDK还是会一直优化他不会让Lock优于它")。

2023-04-19 11:52:31 879

空空如也

空空如也

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

TA关注的人

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