自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 手撸XXL-JOB(四)——远程调用定时任务

Socket是Java网络编程的基本组件之一,用于在应用程序之间提供双向通信,Socket提供了一种标准的接口,允许应用程序通过网络发送和接收数据,在Java中,Socket可以分为客户端Socket和服务端Socket两种类型。YangJobClientManager负责监听端口和管理定时任务的执行,它会监听我们配置的yang-job.execute.port端口号,然后当接收到消息时,将消息转为入参,并取出对应的定时任务执行类,执行对应的代码。

2024-05-14 21:31:55 1036 1

原创 手撸XXL-JOB(三)——本地定时任务管理平台

为解决上述问题,我们可以通过事件的方式,进行解耦。在我的第一份实习中,遇到的项目,就是用事件的方式,来进行解耦,一开始我很不理解这种方式,因为发送的事件太多了,从开始到结束将近10个事件,每次看代码都要从一个事件处理类,跳到另一个事件处理类,但是后来看了一些DDD的书籍后,有点理解这种做法了,这种应该就是属于领域事件,因为这些事件,将不同子域串联起来,比如从收单到支付再到账户等域,通过领域事件,将这些不同的域串联起来,此外又不会使两个域之间存在强耦合的代码,从而方便后续的维护。

2024-05-14 21:05:28 942

原创 手撸XXL-JOB(二)——定时任务管理

在上一节中,我们介绍了SpringBoot中关于定时任务的执行方式,以及ScheduledExecutorService接口提供的定时任务执行方法。假设我们现在要写类似XXL-JOB这样的任务调度平台,那么,对于任务的管理,是尤为重要的。接下来我们将一步一步,实现一个任务调度管理类。

2024-05-14 21:04:44 866

原创 手撸XXL-JOB(一)——定时任务的执行

启动项目,执行结果如下。我们可以看到,executeFixedDelay在任务执行完毕后,间隔5秒才执行下一个任务,也就是说,两个任务之间间隔7秒,而executeFixedRate在任务执行开始后,间隔5秒执行下一个任务,也就是两个任务之间间隔5秒。fixedDelay和fixedRate很相似,但又略有不同,其中fixedDelay表示在某次任务执行完毕后,间隔fixedDelay的时间再执行,而fixedRate表示在某次任务执行开始后,间隔fixedRate的时间再执行。

2024-05-14 21:03:43 1000

原创 Redis学习6——Redis分布式锁

Redisson是一个在Redis基础上实现的Java驻内存数据网络,它不仅提供一系列的分布式java常用对象,还提供许多分布式服务,其宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能将精力更多集中在处理业务逻辑上。

2024-05-06 10:36:04 1047

原创 Redis学习5——Redis应用之签到

在很多时候,我们遇到用户签到的场景,用户进入应用时,获取用户当天的签到情况,如果没有签到,用户可以签到,一般这种功能,可以通过set数据结构或bitMap来实现,但bitMap和set相比,其占用的空间更小,因此我们选择使用bitMap来实现签到的功能。位图由一系列二进制位组成,每个位可以被设置为1或0,当我们在处理需要高效存储和操作大量二进制位数据的适合,位图是一个非常有用的工具。我们通过Redis可视化工具,查看bit的值,可以看出其二进制值与我们操作的一致。

2024-05-06 10:35:28 433

原创 Redis学习4——Redis应用之限流

Redis作为一个内存数据库其读写速度非常快,并且支持原子操作,这使得它非常适合处理频繁的请求,一般情况下,我们会使用Redis作为缓存数据库,但处理做缓存数据库之外,Redis的应用还十分广泛,比如这一节,我们将讲解Redis在限流方面的应用。我们可以将请求打造成一个zset数组,每一次请求进来时,value保持一致,可以用UUID生成,然后score用当前时间戳表示,通过range方法,来获取某个时间范围内,请求的个数,然后根据这个个数与限流值对比,当大于限流值时,进行限流操作。

2024-05-06 10:14:25 801

原创 Redis学习3——Redis应用之缓存

注意,不能先删除cache,在写db,因为在并发的情况下,可能存在,请求1删除缓存,然后写db,并且写db操作还没结束,这时请求2获取缓存,此时因为缓存被删除了,因此会从数据库读数据, 并存入缓存,这个时候的数据是未更新的,当请求2结束后,请求1写db结束,此时就会造成数据库和缓存中的数据不一致。上面的代码,存在一些问题,当请求1查询id=1的用户,从缓存中查询不到时,会查询数据库,然后将数据更新到数据库,然后请求2查询id=1的用户,从缓存中查询到,便直接返回,这是理想的情况。

2024-05-06 10:13:43 1177

原创 Redis学习2——SpringBoot整合Redis,Redis工具类

依赖和配置pom.xmlSpringBoot整合Redis,需要引入spring-boot-starter-data-redis依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </depen

2024-05-06 10:13:04 483

原创 Redis学习1——redis简介、基础

Redis(Remote Dictonary Server) 是由Salvatore Sanfilippo开发的key-value缓存数据库,基于C语言开发。目前市面上,Redis和MongoDB是当前使用最广泛的NoSQL,而就Redis技术而言,它的性能十分优越,可以支持每秒十几万此的读/写操作,其性能远超数据库,并且还支持集群、分布式、主从同步等配置,原则上可以无限扩展,让更多的数据存储在内存中,更让人欣慰的是它还支持一定的事务能力,这保证了高并发的场景下数据的安全和一致性。

2024-05-06 10:12:19 825 1

原创 手撸Mybatis(五)——连接数据库进行insert,update和delete

可以看出,这里因为我们使用的是parameterType是int而不是java.lang.Integer,所以会报错,但是一般情况下,像int,float,long等小写,一般我们也会使用的,而且用的频率比java.lang.Integer的频率更大,那么,我们其实可以添加一个假名,将int这些小写的方式和对应的包装类关联起来。首先,我们在IUserMapper接口上,添加一个updateUserById方法。再次运行测试方法,这次没有报错了,然后我们查看数据库,结果如下,说明删除成功了。

2024-05-03 16:22:16 788

原创 手撸Mybatis(四)——连接数据库进行简单查询

这里将和结果相关的解析,抽取到parseResult方法中,此外,因为数据库是字段是下划线格式,类的属性是驼峰格式,因此,这里引入了Guava依赖,方便使用它的CaseFormat类进行格式转化。首先,我们修改DefaultMybatisSqlSession中,在该类中,执行我们的sql语句,其中,执行sql和对sql查询结果进行处理的内容,收敛在execute方法中。首先,我们修改MybatisSqlStatement,添加resultType字段。

2024-05-03 16:20:46 1007

原创 手撸Mybatis(三)——收敛SQL操作到SqlSession

在上一章,当我们调用mapper的方法时,最终是通过在MapperProxy中获取对应的MybatisStatement,然后打印出sql信息的,但是如果后续操作数据库是,也在MapperProxy中执行sql的话,不太方便管理。在上一章中,我们实现了读取mapper配置并构造相关的mapper代理对象,读取mapper.xml文件中的sql信息等操作,现在,在上一章的基础上,我们接着开始链接数据库,通过封装JDBC,来实现我们数据库操作。在使用jdbc之前,我们先引入mysql的依赖。

2024-05-03 16:17:46 1324

原创 手撸Mybatis(二)—— 配置项的获取

然后修改MapperProxy,接收MybatisSqlStatement数组,在执行的时候,根据执行方法,找到对应的MybatisSqlStatement,获取mapper Xml对应的sql语句,并打印出来。在mybatis中,一般我们会定义一个mapper-config.xml文件,来配置数据库连接的相关信息,以及我们的mapperxml文件存放目录。mybatis-config.xml的内容如下,对于每一个环境,都有对应的数据源信息,此外,mappers标签存储的是mapper.xml文件的位置。

2024-05-03 16:16:22 425

原创 手撸Mybatis(一)——代理mapper

在使用mybatis的时候,我们一般只需要定义mapper的接口,并添加相应的@Mapper注解,然后实现对应的xml文件即可,而不需要对mapper接口进行具体的实现。其实本质上,这些mapper接口是有实现的,但不是我们手动通过implement来实现,而是通过代理的方式进行实现。因此,对于Mybatis的手撸,首先要关注的,就是如何对mapper进行代理。像上述的这种方法,我们每次要获取一个Mapper,就要new一个对应的MapperProxyFactory,这样不太方便。然后创建对应的测试方法。

2024-05-03 16:14:38 305

原创 Executor线程池

Executors是一个工厂类,提供了创建几种预配置线程池实例地方法,如果不需要应用任何自定义地微调,可以调用这些方法创建默认配置地线程池。Executors工厂类提供地线程池有以下几种:1)newCachedThreadPool(): 创建一个可缓存地线程池,这个线程池地线程数量可以根据需要自动扩展,如果有可用的空闲线程,就会重用它们;如果没有可用的线程,就会创建一个新线程,适用于执行大量的短期异步任务。

2024-04-29 11:10:30 515

原创 继承和多态

多态是方法或对象具有多种形态。它的前提是两个对象(类)之间存在继承关系,也就是说它是建立在继承的基础上的。一个对象的编译类型与运行类型可以不一致,编译类型在定义对象时就确定了,不能改变,而运行类型是可以变化的。@OverrideSystem.out.println("学生在学习");@OverrideSystem.out.println("老师在教学生");

2023-10-15 20:31:11 169

原创 SpringBoot整合Swagger3.0

controller层,用@Tag注解描述这个controller类的具体功能,然后@Operation注解描述某个方法的具体功能,@Parameters用来记录方法中需要的参数,每个参数的含义。启动项目,访问http://localhost:8080/documentation/swagger-ui/index.html。我们配置Security的配置类,来解除对接口文档访问的拦截。在dto类里面,使用schema来描述类的信息和类的属性。重启项目,然后重新访问接口文档,发现被拦截了。

2023-05-23 10:25:09 1434

原创 dubbo处理自定义异常

在实际项目中,我们不可避免地需要使用自定义的异常,一般这个异常会继承RuntimeException,然后我们通过@RestControllerAdvice注解,拦截业务异常类,做一些处理,但是在使用dubbo构建项目时,会发现provider抛出自定义异常,然后在消费者端,不会捕捉到我们的自定义异常,而是以RuntimeException的形式被捕获。

2023-05-20 19:15:30 1902

原创 SpringBoot整合Caffeine

Caffeine 是基于Java 8 开发的、提供了近乎最佳命中率的高性能本地缓存组件,Spring5 开始不再支持 Guava Cache,改为使用 Caffeine。Caffeine与其他本地缓存的性能比较如下:1 . 自动加载条目到缓存中,可选异步方式2 . 可以基于大小剔除3 . 可以设置过期时间,时间可以从上次访问或上次写入开始计算4 . 异步刷新5 . keys自动包装在弱引用中6 . values自动包装在弱引用或软引用中7 . 条目剔除通知8 . 缓存访问统计。

2023-05-15 14:36:07 4266 1

原创 SpringBoot整合Redis实现分布式锁

SpringBoot整合redis实现分布式锁

2023-05-11 19:01:45 1905

原创 使用TrieTree(字典树)来实现敏感词过滤

字典树(TrieTree),是一种树形结构,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串,如01字典树)。主要思想是利用字符串的公共前缀来节约存储空间。很好地利用了串的公共前缀,节约了存储空间。字典树主要包含两种操作,插入和查找。字典树具有以下规则:-1. 根节点不包含字符,其他节点包含一个字符。从根节点到某一节点经过的字符连接起来构成一个字符串。如图中的 him 、 her 、 cat 、 no 、 nova。一个字符串与 Trie 树中的一条路径对应。

2023-05-01 14:36:52 1629

原创 SpringBoot自定义注解

修饰符:访问修饰符必须为public,不写默认为pubic;关键字:关键字为@interface;注解名称:注解名称为自定义注解的名称注解类型元素:注解类型元素是注解中内容,根据需要标志参数,例如上面的注解的value;Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.参数成员只能用public或默认(default)这两个访问权修饰。

2023-04-30 14:17:40 4810 1

原创 SpringBoot中线程池应用

比 CPU 核心数多出来的一个线程是为了防止线程偶发的缺页中断,或者其它原因导致的任务暂停而带来的影响。I/O 密集型任务(2N): 这种任务应用起来,系统会用大部分的时间来处理 I/O 交互,而线程在处理 I/O 的时间段内不会占用 CPU 来处理,这时就可以将 CPU 交出给其它线程使用。1.2 不同业务用不同的线程池。配置线程池的时候要根据当前业务的情况对当前线程池进行配置,因为不同的业务的并发以及对资源的使用情况都不同,而且当多个业务使用同一个线程池时,可能会因为线程池使用不当导致死锁。

2023-04-22 18:43:18 2970 1

原创 dubbo学习

而与Failsafe不同的是,Failback策略会将这次调用加入内存中的失败列表中,对于这个列表中的失败调用,会在另一个线程中进行异步重试,重试如果再发生失败,则会忽略,即使重试调用成功,原来的调用方也感知不到了。Dubbo调用类别有四种,分别是同步,异步,并行以及广播调用。在特殊场景下,异步调用可提高性能,比如要远程调用A、B、C,分别用时1s,2s,3s,如果是同步的话,用时6秒,如果异步调用,同时去执行这三个接口,理想情况下用时3秒,不过前提是ABC这三个方法没有参数依赖并且没有顺序依赖。

2023-03-25 15:52:13 182

原创 SpringBoot文件切片

SpringBoot文件切片

2023-03-11 20:25:46 645

原创 SpringBoot整合RabbitMQ

SpringBoot整合RabbitMQ

2022-12-06 21:11:11 323 2

原创 SpringBoot整合Dubbo

Springboot

2022-10-19 21:19:31 6578

原创 SpringBoot阶段总结

SpringBoot总结

2022-09-20 20:24:29 205

原创 SpringBoot整合mybatis-plus

springboot整合mybatis-plus

2022-08-28 19:09:41 150

原创 SpringBoot学习

SpringBoot学习笔记

2022-08-05 12:24:51 280

原创 Java-多线程入门学习

Java多线程入门

2022-07-24 17:52:03 81

原创 java访问xml配置文件

xml访问

2022-06-14 20:31:20 811

原创 SpringBoot框架整合Shiro框架

SpringBoot框架整合Shiro框架最近在学习Shiro框架,做个笔记记录一下修改pom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/

2022-05-25 10:11:38 265

原创 springboot实现学生管理系统

SpringBoot实现学生管理系统一、创建springboot项目点击下一步点击下一步,选择要添加的依赖点击下一步,再点击完成修改pom.xml如下<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocati

2022-05-07 19:02:13 5912 6

原创 2021IDEA创建springboot项目

2021IDEA创建SpringBoot项目创建新项目,选择maven项目,选择quickstart修改项目名选择仓库位置点击完成,文件目录如下修改pom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schem

2022-05-04 09:22:39 1107

原创 SSM整合实现学生管理系统

SSM整合实现学生管理系统我们这里使用的是IDEA社区版,通过maven项目进行整合首先先创建一个maven项目,选择webapp的工件项目创建完毕后,我们先在pom.xml引入相关依赖<dependencies> <!--spring相关依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-co

2022-04-24 14:28:57 1649 2

原创 SpringMVC实现学生管理小系统

SpringMVC实现学生管理小系统我们这里使用的是IDEA社区版,先创建一个maven项目,然后导入依赖,即我们在pom.xml添加下列依赖:<?xml version="1.0" encoding="UTF-8"?><!-- $Id: pom.xml 642118 2008-03-28 08:04:16Z reinhard $ --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http

2022-04-22 10:09:49 1022 2

原创 MyBatis+Struts2

MyBatis+Struts2MyBatis框架整合Struts2框架,这里我们创建的maven项目先在Pom.xml文件下添加相关依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ma

2022-04-11 12:22:25 590

原创 Hibernate+Struts2

Hibernate+Struts2这里采用Maven项目进行整合pom.xml文件添加相关依赖<?xml version="1.0" encoding="UTF-8"?><!-- $Id: pom.xml 642118 2008-03-28 08:04:16Z reinhard $ --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSc

2022-04-09 12:33:53 1330

学生管理系统1.0(SpringBoot+mybatisPlus+thymeleaf)

学生管理系统1.0版本,实现简单的学生信息增删改查; 技术栈采用SpringBoot+mybatisPlus+thymeleaf,整合mysql数据库,实现对学生信息和学生所属学院信息的简单快速的增删改查,并通过thymeleaf搭建简单的前端页面。 采用MVC三层架构(即controller层、service层和dao层); 后续会继续完善,添加对应的异常处理和鉴权。

2023-10-15

空空如也

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

TA关注的人

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