自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

qq_16570607的博客

热爱技术的一枚妹子

  • 博客(182)
  • 资源 (2)
  • 收藏
  • 关注

原创 CountDownLatch锁的应用

【代码】CountDownLatch锁的应用。

2023-09-06 10:07:49 136

原创 java任务太大,分批执行

【代码】java任务太大,分批执行。

2023-08-08 09:26:09 199 1

原创 java线程池的使用

【代码】java线程池的使用。

2023-08-08 09:20:31 179

原创 redis分布式锁的使用

分布式锁工具类LockUtils.javapackage com.shein.pmj.utils;import lombok.extern.slf4j.Slf4j;@Slf4jpublic final class LockUtils { /** * 分布式锁,根据业务情况传入缓存失效时间 * PS:上面的tryGetLock,自增和设置失效时间不是原子的,如果redis自增后, * 系统正好挂了,此时还未设置时效时间,那么定时任务当天就无法执行了(出现概率

2023-08-08 09:11:39 140

原创 复杂SQL优化实例

重写为 JOIN 之后,子查询的选择模式从 DEPENDENT SUBQUERY 变成 DERIVED,执行速度大大加快,从7秒降低到2毫秒。比如下面 UPDATE 语句,MySQL 实际执行的是循环/嵌套子查询(DEPENDENT SUBQUERY),其执行时间可想而知。这种写法不仅存在额外的开销,还使得整个语句显的繁杂。在前端数据浏览翻页,或者大数据分批导出等场景下,是可以将上一页的最大值当成参数作为查询条件的。不难看出子查询 c 是全表聚合查询,在表数量特别大的情况下会导致整个语句的性能下降。

2023-06-06 17:21:56 591 1

原创 复杂SQL实践-MYSQL

题目:现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。窗口函数总体上可以分为序号函数, 分布函数, 前后函数, 首尾函数和其他函数。MySQL从8.0版本开始支持窗口函数。限定条件:第二天再来。会过滤掉不符合的记录。

2023-05-30 21:24:39 584

原创 ERP与MES集成

下面我们以ERP与MES集成为例,与大家分享下系统间的数据集成,常见的接口方式如下图所示:

2023-05-22 15:46:14 95

原创 物联网网络通讯知识

RS485是一个物理接口,DTU和传感器就是通过RS485接口进行连接的。标准的串行工业协议。可以支持RS485,RS232接口。举个简单的例子,服务器下发读取雨量计的命令:分别对应的该传感器的通信id,功能码等。如下图,这是一串指令。

2023-05-20 11:08:06 499

原创 实现布隆过滤器

它实际上是由一个很长的二进制数组+一系列hash算法映射函数,用于判断一个元素是否存在于集合中。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

2023-05-16 11:27:08 119

原创 k8s简单记录

while true;每隔3秒向文件中写入当前时间。创建一个/tmp/hello.txt 文件。“/bin/sh”,“-c”, 使用sh执行命令。

2023-05-15 15:45:27 546

原创 spring项目里的大事务优化

少用@Transactional注解将查询(select)方法放到事务外事务中避免远程调用事务中避免一次性处理太多数据非事务执行异步处理。

2023-05-15 10:22:18 504

原创 oracle的OLAP 函数

*OLAP(On-line Analytical Processing,联机分析处理)**是在基于数据仓库多维模型的基础上实现的面向分析的各类操作的集合。

2023-05-11 22:26:04 160

原创 Dockerfile部署java项目

要想退出 container 时,让 container 仍然在后台运行着,可以使用“docker exec -it”命令。这是一个多步骤的dockerfile,第一步git下载代码,第二步使用maven进行打包,第三步将运行时环境准备好,并设置命令。将DockerFile 配置文件放到 maven项目目录内,和pom.xml同级。/bin/bash:在container中启动一个bash shell。自动检测的文件名为Dockerfile ,使用。: 保持标准输入打开,默认为false;

2023-05-09 16:06:13 1135

原创 SQL知识汇总

为了应对这种业务场景,MySQL有一种专有语法,一条SQL语句实现插入或更新,可单条可批量。使用要点表要求必须有主键或唯一索引才能起效果,否则insert或update无效。该语法是根据主键或唯一键来判断是新增还是更新。VALUES() 后面应为需要更新的字段,不需要更新的字段不用罗列。遇到已存在记录(根据唯一键或主键)时,自动更新已有的数据;如果表中有多个唯一键(可以是单列索引或复合索引),则任意一个唯一键冲突时,都会自动更新数据。

2023-05-03 17:32:54 1876

原创 SpringBoot单元测试断言 assertions

断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是 org.junit.jupiter.api.Assertions 的静态方法。加断言可以避免对数据库的误操作,以及缩短测试流程(断言失败就不再执行之后的代码了)上面一个是我测试建的,如果要新建应该选第二个:Create New Test…待测试的Service方法就不贴了,根据自己的实际情况写逻辑就行;也可以设置异常报文,第一个参数是期望值,第二个参数是实际值。会弹出新建测试类的框。

2023-04-18 15:00:10 1554

原创 sql优化总结

在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。

2023-04-18 14:30:55 359

原创 JAVA代码优化实践

这样做的好处是,减少了读写文件的次数,而我们都知道读写文件是非常耗时的操作。最关键的地方是定义了一个buffer字节数组,把从1.txt文件中读取的数据临时保存起来,后面再把该buffer字节数组的数据,一次性批量写入到2.txt中。IO流想必大家都使用得比较多,我们经常需要把数据写入某个文件,或者从某个文件中读取数据到内存中,甚至还有可能把文件a,从目录b,复制到目录c下等。因为这个例子中,从1.txt文件中读一个字节的数据,就会马上写入2.txt文件中,需要非常频繁的读写文件。

2023-04-17 18:05:15 345

原创 Java Stream API的使用

日常编程工作中,Java集合会经常被使用到,且经常需要对集合做一些类似过滤、排序、对象转换之类的操作。为了简化这类操作,Java8添加了一套新的Stream API,使用方式就像写SQL一样,大大简化了这类处理的实现代码量与可读性。

2023-04-17 17:19:54 322

原创 多线程事务怎么回滚?

1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败,则全部回滚。2,在spring中可以使用@Transactional注解去控制事务,使出现异常时会进行回滚,在多线程中,这个注解则不会生效,如果主线程需要先执行一些修改数据库的操作,当子线程在进行处理出现异常时,主线程修改的数据则不会回滚,导致数据错误。3,下面用一个简单示例演示多线程事务。

2023-04-17 15:41:56 261

原创 Java的CPU 飙升700%优化的真实案例

最近负责的一个项目上线,运行一段时间后发现对应的进程竟然占用了700%的CPU,导致公司的物理服务器都不堪重负,频繁宕机。那么,针对这类java进程CPU飙升的问题,我们一般要怎么去定位解决呢?

2023-04-17 11:14:47 297

原创 Thread类的常用方法及使用场景

下面就介绍一些Thread类API基本用法。包括sleep,join,yield,interrupt。

2023-03-31 15:35:21 207

原创 runnable和callable的区别

runnable和callable的区别主要在于它们的用途和实现方式。主要区别:orcallable的执行,被ExecutorService执行or作为FeatureTask的参数or使用FeatureTask这里还有一个很好的总结

2023-03-31 11:42:10 977

原创 Snowflake算法生成分布式全局唯一ID

3)22~62位(共41bit)表示时间戳,最大值2^41=2 199 023 255 552(单位:ms),意味着在这么多时间内我们可以肆意妄为地制造ID。1)0~11位(共12bit)表示序列号,最大值2^12=4096,意味着在一个时间单位(例如1毫秒)内最多可以生成4096个ID;2)12~21位(共10bit)表示机器id,最大值2^10=1024,意味着支持的最大集群规模为1024台机器。4) 63位(共1bit)最高位是符号位,不使用,设置为固定值“0”。

2023-03-31 10:38:44 89

原创 索引失效-sql

下面的例子中,dept_id是一个varchar2型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描。如果被索引的列中有很多null,就不会使用这个索引。如果没有使用基于函数的索引,那么where子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。通过把用 or 语法替代不等号进行查询,就可以使用索引,以避免全表扫描:上面的语句改成下面这样的,就可以使用索引了。但是把函数应用在条件上,索引是可以生效的,把上面的语句改成下面的语句,就可以通过索引进行查找。

2023-03-28 17:35:09 557

原创 Java中的双冒号“::”

形如 ClassName::methodName 或者 objectName::methodName 的表达式,叫做方法引用(Method Reference)。看看编译器是如何根据 “晦涩难懂” 的 Method Reference 来推断开发者的意图的。方法引用的格式是类名::方法名。一般是用作Lambda表达式。

2023-03-21 16:18:04 5023

原创 java8之在Map中新增的好用api

java8之后,常用的Map接口中添加了一些非常实用的函数,可以大大简化一些特定场景的代码编写,提升代码可读性。

2023-03-21 15:54:16 256

原创 Java 判空新写法,干掉 if else

在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示在这种情况下,有如下代码这种写法,在user为null时,是有可能报NullPointerException异常的。为了解决这个问题,于是采用下面的写法这种写法是比较丑陋的,为了避免上述丑陋的写法,让丑陋的设计变得优雅。JAVA8提供了Optional类来优化这种写法,接下来的正文部分进行详细说明。

2023-03-20 16:20:35 147

原创 mybatis批量插入5000+条数据

在我们的项目中,会不停地使用批量插入这个方法,而因为MyBatis对于含有的语句,无法采用缓存,那么在每次调用方法时,都会重新解析sql语句。乍看上去这个foreach没有问题,但是经过项目实践发现,当表的列数较多(20+),以及一次性插入的行数较多(5000+)时,整个插入的耗时十分漫长,达到了14分钟,这是不能忍的。总结一下,如果MyBatis需要进行批量插入,推荐使用 ExecutorType.BATCH 的插入方式,如果非要使用插入的话,需要将每次插入的记录控制在 20~50 左右。

2023-03-20 15:50:59 1037

原创 Java的CPU 飙升700%优化的真实案例

最近负责的一个项目上线,运行一段时间后发现对应的进程竟然占用了700%的CPU,导致公司的物理服务器都不堪重负,频繁宕机。那么,针对这类java进程CPU飙升的问题,我们一般要怎么去定位解决呢?

2023-03-19 11:44:11 1183

原创 软考知识点

软考知识点

2022-10-14 16:55:25 117

原创 sql调优

sql关键字的执行顺序关键字的顺序不可以颠倒SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...sql关键字执行顺序FROM > WHERE > GROUP BY > HAVING > SELECT的字段 > DISTINCT > ORDER BY > LIMITwhere子句中不能使用聚合函数作为表达式,聚合函数如下:COUNT(*)——统计元组个数。C

2022-03-16 12:45:21 136

原创 面试题及答案-java后端

#{变量名}可以进行预编译、类型匹配等操作,#{变量名}会转化为jdbc的类型。select * from tablename where id = #{id}假设id的值为12,其中如果数据库字段id为字符型,那么#{id}表示的就是’12’,如果id为整型,那么id就是12,并且MyBatis会将上面SQL语句转化为jdbc的select * from tablename where id=?,把?参数设置为id的值。${变量名}不进行数据类型匹配,

2022-03-10 14:06:55 1401

原创 docker的4种网络模型

我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:host模式,使用–net=host指定。container模式,使用–net=container:NAME_or_ID指定。none模式,使用–net=none指定。bridge模式,使用–net=bridge指定,默认设置。下面分别介绍一下Docker的各个网络模式。host模式众所周知,Docker使用了Linux的 Namespace 技术来进行资源隔离,如

2022-03-05 10:35:15 613

原创 Spring Cloud Hystrix 线程池队列的正确配置

背景有一次在生产环境,忽然出现了不少笔还款单被挂起,后来排查缘由,发现是内部系统调用时出现了Hystrix调用异常。在开发过程当中,由于核心线程数设置的比较大,没有出现这种异常。放到了测试环境,偶尔有出现这种状况,后来在网上查找解决方案,网上的方案是调整maxQueueSize属性就行了,当时调整了一下,确实有所改善。可没想到在生产环境跑了一段时间后却又出现这种了状况,此时我第一想法就是去查看maxQueueSize属性,但是maxQueueSize属性是设置值了。当时就比较纳闷了,为何maxQueueS

2022-03-05 09:47:18 2512

原创 java编码技巧

如果列表里面的内容与上次相比并无区别,则不往下处理熔断规则表设计CREATE TABLE `degrade_rule` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `resource_name` varchar(256) NOT NULL COMMENT '资源名称', `count` double NOT NULL COMMENT '慢调用时长,单位 毫秒', `slow_ratio_threshold` d

2022-03-04 15:49:33 364

原创 如何优雅的关闭Java线程池

线程中断在程序中,我们是不能随便中断一个线程的,因为这是极其不安全的操作,我们无法知道这个线程正运行在什么状态,它可能持有某把锁,强行中断可能导致锁不能释放的问题;或者线程可能在操作数据库,强行中断导致数据不一致混乱的问题。正因此,JAVA里将Thread的stop方法设置为过时,以禁止大家使用。一个线程什么时候可以退出呢?当然只有线程自己才能知道。所以我们这里要说的Thread的interrrupt方法,本质不是用来中断一个线程。是将线程设置一个中断状态。当我们调用线程的interrupt方法,它

2022-03-03 15:19:27 1049

原创 MQ延迟机制

延迟机制延迟队列延迟队列——消息进入到队列之后,延迟指定的时间才能被消费者消费AMQP协议和RabbitMQ队列本身是不支持延迟队列功能的,但是可以通过TTL(Time To Live)特性模拟延迟队列的功能TTL就是消息的存活时间。RabbitMQ可以分别对队列和消息设置存活时间在创建队列的时候可以设置队列的存活时间,当消息进入到队列并且在存活时间内没有消费者消费,则此消息就会从当前队列被移除;创建消息队列没有设置TTL,但是消息设置了TTL,那么当消息的存活时间结束,也会被移除;一般

2022-03-03 13:15:57 939

原创 java设计模式实际应用场景实例

常用设计模式策略模式、模板方法、工厂模式、单例模式业务场景营销拉新活动。实例一:工厂模式+抽象定义抽象业务接口public abstract class AwardAbstract { public abstract Boolean award(String userId);}定义具体业务实现类// 头条渠道发放奖励业务public class TouTiaoAwardService extends AwardAbstract { @Override publi

2022-03-02 11:26:33 764

原创 索引树B+结构

一次完整的磁盘IO所花费的时间读写磁头在磁盘扇区上读取或者写入数据,一次磁盘IO所花费的时间:寻道时间指的是读写磁头移动到正确半径上所需要的时间,寻道时间越短,磁盘IO操作越快。一般我们的寻道时间是3-15ms,主流的磁盘寻道时间是5ms。旋转延迟时间找到正确的磁道后,读写磁头移动到正确位置上所消耗的时间。我们一般去磁盘旋转周期的一半作为旋转延时的近似值。7200转/分 -> 120转/秒 一半: 1/240秒 = 4.17ms数据传输指的是将数据从磁盘盘片读取或者写入的时间,一

2022-01-21 10:22:04 180

原创 Git提交解决冲突

一、git命令在提交代码前,没有pull拉最新的代码,因此再次提交出现了冲突解决方法如下两种:1.保留你本地的修改git merge --abortgit reset --merge合并后记得一定要提交这个本地的合并(add–>commit–>push–>pull)然后在获取线上仓库:git pull2.down下线上代码版本,抛弃本地的修改不建议这样做,但是如果你本地修改不大,或者自己有一份备份留存,可以直接用线上最新版本覆盖到本地git fetch --allg

2021-12-11 10:55:50 13736

《Java并发编程实战》

《Java并发编程实战》深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容,最后介绍了一些高级主题,如显式锁、原子变量、非阻塞算法以及如何开发自定义的同步工具类。 《Java并发编程实战》适合Java程序开发人员阅读。

2017-10-20

spring-framework-reference

spring-framewok api 文档

2017-08-26

空空如也

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

TA关注的人

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