自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis的基础知识

文章目录Redis的基础知识一些基本命令Redis的执行效率为什么那么快?以及为什么Redis是单线程的?Redis的基础知识一些基本命令redis默认有16个数据库,在redis.conf配置文件中可以看到,如下图:默认使用的是第0个,可以使用select切换数据库!如下图:set命令可以存储键格式set key value,get命令可以取出指定的键对应的值格式get key,如下图:dbsize命令可以查看当前数据库的大小,也即是当前数据库里面存放了多少条数据,如下图:keys

2021-02-17 12:21:01 2683 10

原创 MyBatisPlus中向数据库表中插入数据,MyBatisPlus中使用@TableId注解来实现自增序列id自动插入的功能

MyBatisPlus的@TableId注解的使用这个注释主要用于对应数据库表的实体类中的主键属性。写法:@TableId(value=“数据库主键字段”,type = IdType.六种类型之一)例如:@TableId(value=“user_id”,type = IdType.AUTO )1、注解中type的值的含义 //IdType.ID_WORKER_STR 默认的;底层使用了雪花算法;类型为Integer //IdType.AUTO 数据库自增;数据库上也要勾上自增

2021-01-12 14:36:40 31968 5

原创 SpringSecurity用户认证设置用户名和密码的三种方式

文章目录SpringSecurity用户认证设置用户名和密码的三种方式首先明白几个单词的意思:SpringSecurity默认的用户认证1.通过配置文件进行用户认证2.通过配置类进行用户认证There is no PasswordEcoder mapped for the id "null"异常异常出现原因解决办法在内存中存取密码方式PasswordEncoder接口3.通过自定义编写用户细节实现类(需要查询数据库)进行用户认证SpringSecurity用户认证设置用户名和密码的三种方式首先明白几个单

2020-12-20 16:52:55 6613 2

原创 LambdaQueryWrapper和QueryWrapper的区别?

可以看到,因为我们这里使用的是LambdaQueryWrapper,因此我们这里的eq方法的第一个参数可以通过实体类的get方法代替,比如这里写的就是AccessUser::getLoginName,但如果我们使用的是QueryWrapper的话,那么我们这里必须要写数据库的字段名字,也就是必须要写login_name。如果是QueryWrapper,那么我们只能方法里面只能写数据库表里面的字段的名字;但如果是LambdaQueryWrapper的话,我们可以写DO实体类的get方法代替。

2024-08-23 14:24:01 222

原创 @PostConstruct注解的使用

比如一个类使用了@Component注解修饰,那么当启动SpringBoot项目的时候,这个类就会被自动的注入到IOC容器中,而一旦这个类注入到IOC容器中之后,那么被@PostConstruct注解修饰的方法就会立马被执行。当一个类注入到IOC容器之后,这个类中被@PostConstruct注解修饰的方法会被调用。

2024-08-01 15:34:22 167

原创 使用xxl-job执行定时任务

这里最关键的配置其实就有三个,一个是JobHandler属性,它是指定我们的定时任务的名字的,和我们java代码中的定时任务的名字一致,也就是上面java定时任务类中的@XxlJob注解的值;接着在我们自己的项目中写我们想要执行的定时任务,比如我们现在是想执行一个日志定时任务,就是每隔10s输出一下日志信息,我们的定时任务要如何写呢?然后一个执行器可以执行多个定时任务,为了减轻执行器的负担,我们还可以横向扩展执行器,就是我们可以再加一些执行器,去执行不同的定时任务;

2024-07-24 11:28:01 1472

原创 使用MappingJackson2HttpMessageConverter把java对象转换成json字符串

【代码】使用MappingJackson2HttpMessageConverter把java对象转换成json字符串。

2024-06-27 15:33:08 406

原创 mysql中的lead函数和over函数

over函数是用来分组加排序的,然后等over函数分好组排好序之后,再使用lead函数去找当前分组内的下一行数据的某个字段值,具体是哪个字段由over函数指定,如果当前分组内没有下一条数据的话,那么返回null空值。我们有一个销售表,有很多类型的产品,我们想要根据产品id分组,然后再根据产品销售时间排序,我们想要显示下个月的销售额,以及下个月增加的销售额。lead函数的功能:取出当前分组的下一条数据的某个字段的值,如果当前分组内已经是最后一条数据了,那么会返回null。

2024-06-21 14:48:25 1012

原创 为什么动态代理接口中可以不加@Mapper注解

我们上面的UserMapper上面没有加@Mapper注解,按道理来说UserMapper这个类应该是注入不到IOC容器里面的,但是为什么我们程序的运行效果仍然是正常的呢?这是因为你的启动类上加了mapper扫描,这样启动的时候可以直接把动态代理接口下面的所有动态代理接口注入到IOC容器当中,因此我们就不用手动的通过@Mapper注解把动态代理接口注入到IOC容器中了。

2024-06-18 15:01:20 293

原创 MyBatisPlus可以自动把我们的业务对应的动态代理接口注入到父类baseMapper属性中,因此我们可以省略对应的mapper动态代理接口

当我们给MyBatisPlus自带的service服务实现类指定第一个类的泛型为UserMapper动态代理接口的时候,其实程序内部就会自动的去IOC容器中找UserMapper类型的bean,找到之后会直接注入到ServiceImpl类的baseMapper属性中。因此我们再UserServiceImpl方法里面可以直接使用baseMapper动态代理接口,其实也就相当于是我们的UserMapper动态代理接口。类似于上面这样,我们要单独写一个UserMapper属性,并且从IOC容器里面取值。

2024-06-18 14:50:36 267

原创 使用MyBatisPlus让数据库和实体类字段自动映射

因为解析的时候是直接把User实体的name属性当做了插入语句的列名,而实际上我们需要的是user_name,因此这里就会出现异常了。那我就突然想到,会不会当我们使用MyBatisPlus自带的查询方法的时候,我们使用@TableField注解的查询也会自动映射呢?就是实现起来过于复杂,要写的东西太多了,因此我们后续又出现了MyBatisPlus提供的映射方式,就是我们可以直接通过注解映射。数据库表中的字段名字,与实体类中的属性名字不一致,我们想要让二者映射起来的时候,该怎么操作?

2024-06-18 14:15:18 1260

原创 @EqualsAndHashCode(callSuper = false和ture)的区别

可以看出虽然两个猫的名字不同,但是比较结果仍然是true,因为名字是父类的字段,而我们callSuper的值指定的为false,因此只会比较子类Cat中的属性字段color,不会比较父类中的属性字段name,只要两个猫的颜色相同,返回结果就是true;如果我们把callSuper的值指定为true,那么比较的时候也会顺带着比较父类字段的值,也就是会比较name字段,因为两个猫的名字不同,所以返回结果为false。

2024-06-16 19:24:36 575

原创 为什么重写Equals方法的时候必须同时重写HashCode方法?

但是问题是,假如此时对象重写了equals方法,把原来的比较地址换成了比较内容,那么两个不同地址的对象它的比较结果就可能相同。假如我们现在往一个hashmap集合存键值对,我们知道hashmap内部使用的结构是 散列表+链表+红黑树的形式,首先会根据对象的HashCode值计算出键值对对应的散列表的索引,那假如两个对象的hashCode值不同,存放一个键值对之后,计算的另外一个键值对对应的散列表索引就和第一个不一样,这样就会直接的把数据存储到散列表对应数组的地方,这两个对象会被当成是两个不同的对象。

2024-06-16 19:10:12 207

原创 类Copy方法:BeanUtils.copyProperties

比如有时候我们想要把数据库里面的数据导出到excel表中,比如想要把数据库中的用户数据导出到excel表格中;假设我们程序代码中与数据库对接的实体类是User,用于展示到前端的实体类是UserVO,那么用于导出到excel表中的类就应该是UserDTO实体类。因此我们导出excel的时候,肯定会牵涉到把User类转换成UserDTO实体类的操作;

2024-06-16 18:16:19 217

原创 导出excle表

如下图:

2024-06-16 17:55:47 438

原创 Validation校验

服务端接收前端传递的请求从参数的时候,可以对请求参数进行自动校验。场景:通过postman向服务端发送一个注册用户的请求,请求参数包括了userName用户名和password用户密码,并不是所有的用户名和密码都可以被注册进来的,因此我们就可以通过Validation来个请求参数格式的校验,如果格式不正确那么我们直接就会抛出异常。

2024-06-16 11:32:28 987

原创 HTTP请求拦截器链以及过滤器链

我们写一个包含三个HTTP请求拦截器的拦截器链,写一个controller控制器方法,最后在postman里面调用controller控制器里面的接口方法,看看这个请求的经过路径。

2024-05-28 17:11:03 1178

原创 PageHelper分页

PageHelper可以帮助我们后端数据分页,具体的使用场景如下图:那么它的原理是什么呢?在讲述它的原理之间我们先来说下ThreadLocal和ThreadLocalMap的作用。每一个线程都有一个ThreadLocalMap集合,这个集合的key是ThreadLocal,这个集合的value是我们要存储的某个值。所以一个线程里面其实会牵涉到多个ThreadLocal对象。为什么一个线程需要设置一个专属的ThreadLocalMap呢?因为避免当前线程的数据被污染,比如说当A线程使用PageHelpe

2024-05-26 19:15:01 650

原创 SpringCloud的Config配置中心,为什么要分Server服务端和Client客户端?

它的思想是所有微服务的配置文件都放到git远程服务器上,让Server服务端对接git访问配置文件,让Client客户端对接Server服务端访问配置文件,为什么要中间加一层server呢?直接让client客户端访问git远程服务器中的配置文件不可以吗?但是如果是使用server对接git远程仓库,那么远程仓库的配置发生改变之后,server服务端会立马的检测到;而client客户端又是对接的server服务器端,因此也就相当于是当远程服务器里面的配置发生改变之后客户端微服务会立马检测到。

2024-05-22 12:11:18 489

原创 SpringCloud微服务调用的超时机制和CompletableFuture异步调用的超时机制原理一样吗?

如果主任务没有在规定的时间内完成,定时任务就会触发并执行一个操作,这个操作会中断正在执行的异步任务,并且将异常 TimeoutException 传递给后续的操作。使用SpringCloud的OpenFeign进行微服务调用的时候,如果A微服务去调用B服务的方法,1s内没有返回结果,就相当于超时了,A微服务会抛出异常。而当我们使用CompletableFuture异步执行方法的时候,也可以设置最大的等待时间,比如说设置2s,那么当前方法在2s内如果没有接收到异步方法的返回结果的话,就会抛出异常。

2024-05-22 10:23:52 474

原创 SpringCloud微服务之间可以相互调用的底层原理

综上所述,Spring Cloud微服务调用底层主要是通过HTTP或HTTPS协议进行的,这是因为HTTP协议具有通用性、灵活性和成熟度高等优点。尽管相对于TCP协议来说,HTTP的效率可能稍低,但在大多数应用场景下,这种效率差异是可以忽略不计的,特别是在没有极高并发要求的情况下。一种是通过OpenFeign调用。SpringCLoud中的一个微服务调用另外一个微服务时,底层其实是在当前微服务当中发送了一个http网络请求,这个请求可以访问到另外一个微服务的某个方法。

2024-05-22 10:11:23 367

原创 Ribbon负载均衡(自己总结的)

其实不是的,我们的多个请求来了还是给一个Eureka-Server服务器,但是我们会把这些请求分发给一个spring.application.name微服务大类里面的多个instance-id微服务实例,以减轻多个请求如果都给同一个instance-id微服务实例造成的负担。因为我们idea里面的每个微服务模块在注册到Eureka注册中心的时候,spring.application.name微服务的名字,也就是serviceid是可以一样的,但是每个微服务的instace-id实例id是不可以一样的。

2024-05-21 17:27:49 884

原创 Eureka服务注册与发现中心

我们在一个项目中通常会有各种各样的模块服务,比如说在一个电商项目中可能会有订单模块服务、付款模块服务、发货模块服务,实际项目中的每个模块服务在Eureka服务注册与发现中心都是对应client客户端;而对于Eureka服务注册与发现中心的server服务端,可以理解成是一个独立于项目之外的一个管理中心,这个管理中心不属于我们的项目模块,但它可以用来管理我们实际的项目中的各个模块之间的微服务。

2024-05-21 12:34:12 1138

原创 @RequestBody注解

http请求中,在http报文的请求体中,通常会包含多个传输的参数信息(GET请求除外),可能这些参数信息会有很多,但是对应到我们Controller控制器中接收http请求的方法,我们并不想要在方法里面写多个参数怎么办呢?而对于GET请求来说,它不是用来传输数据的,它主要是用来获取数据的,虽然没有命令禁止参数信息写在请求体里面,但是我们一般不会在请求体里面写东西,对于GET请求来说一般把它的参数信息写在请求行的uri里面。

2024-05-20 17:13:10 950

原创 @RequestMapping、@ResponseBody、@Controller注解的结合使用

客户端发送过来的请求,服务端必须要有个接收的方法,那使用哪些方法接收呢?就是使用加有@RequestMapping注解的方法接收。比如我们想让一个方法接收url为/getStudent,方法类型为get方法的请求,那么我们定义注解的时候就要写成 @RequestMapping(method = RequestMethod.GET, path = “/getStudent”)。或者我们也可以直接写成@GetMapping(path = “/getStudent”)

2024-05-20 12:07:01 327

原创 以及Spring中为什么会出现IOC容器?@Autowired和@Resource注解?

首先说一下在Spring之前,我们的程序里面是没有IOC容器的,这个时候我们如果想要得到一个事先已经定义的对象该怎么得到呢?比如我们在想要得到一个事先定义的Person对象。首先我们需要先在person.xml文件里面提前配置生成我们的Person对象,如下:

2024-05-20 11:22:41 767

原创 Netty中的流式传输

比如现在有一个场景,客户端想要往服务端冲刷10个字节的数据,然后客户端会先把10个字节的数据冲刷到网络中,接着网络会把数据冲刷到服务端应用程序中,第一个接收网络中的数据的处理器就是解码处理器,但是因为Netty的设计考虑到了TCP网络中的流式数据传输,所以Netty也要能够支持流式数据传输,因此Netty就不会一次把网络中的数据全部接收,Netty可以选择一次只接收网络中的一部分数据。但是网络冲刷数据到应用程序的解码处理器的时候,会把网络中的所有数据都一次性的冲刷到解码处理器的ByteBuf中吗?

2024-05-19 00:32:08 702

原创 Netty中为什么要优雅关闭线程池?以及异步关闭通道的时候什么时候会得到异步结果关闭通道?

先看喜爱具体的代码 如下图:可以看到我们最终会给两个线程池执行一个优雅关闭方法shutdownGracefully,那么为什么要优雅的关闭呢?优雅的关闭的时候是怎么个优雅法,它内部是怎么执行?都进行了哪些相关操作?所谓的优雅的关闭线程池就是说,如果线程池中的任何一个线程的任务队列中还有任务,那么这个时候我就不会关闭线程池,只有当线程池中的所有线程的任务队列的任务都执行完毕了,那么我才会关闭线程池。

2024-05-18 23:27:40 754

原创 Netty入站和出站的时候一定要对message消息进行解码和编码操作

Netty入站和出站的时候一定要对message消息进行解码和编码操作,要确保消息从应用程序流入网络的时候被编码成了二进制,以及消息从网络流入应用程序的时候要确保二进制被解码成了正确的类型。因为我们的数据在网络中一定是通过二进制的形式传输的,因此我们如果仅仅冲刷数据,比如说冲刷一个字符串,那么这个数据是不能被冲刷到网络中的,会冲刷失败,后续我们服务器端是读取不到的。

2024-05-18 21:39:34 901

原创 Netty中对于ChannelPipeline责任链的个人理解总结,以及对于客户端和服务端的Channel的理解

在Netty中,Channel表示是对端的连接。比如说如果是在服务器端,那么每一个客户端来连接自己,服务器就会为这个客户端创建一个Channel,所以对于服务器来说一个Channel就表示一个客户端;如果是在客户端,那么客户端可能需要连接多台服务器,客户端每连接一个服务器,就会为这个服务器创建一个对应的Channel,所以对于客户端来说也可以把一个Channel理解成一个服务器。

2024-05-18 13:07:51 1049

原创 为什么会出现线程?为什么会出现多线程?之前没有现成的时候是有什么弊端?

线程是cpu调度的最小单位,我是这样理解的,cpu先去调度一个进程,然后给进程一个执行命令,这个时候进程再去调度里面的某个线程,用过这个线程去执行计算机里面的某个任务。一个进程里面的多个线程共用进程里面的内存资源,所以多线程可能会出现共享资源问题。一个进程其实就是一个程序,一个进程里面或者说一个程序里面存在多个线程。

2024-05-17 18:36:26 866

原创 异步的方式以及它使用的几个场景

再通过future.get方法获取到副线程中异步执行的结果就好了。

2024-05-17 18:30:12 1071

原创 Netty个人总结

当我们的客户端请求并发数非常多的时候,这个时候WorkerGroup线程池中的所有NioEventLoop线程都处于忙碌状态,都有一个对应的客户端请求处理,那么新建立连接的客户端请求对应的套接字任务就会有很多,这个时候我们的等待队列的大小就需要设置的大一些。但是也不能太大,因为如果太大的话,我们维护等待队列里面的任务也是需要耗费系统性能的。所以需要设置一个合理的值,那么这个合理的值怎么判断呢?

2024-05-17 12:59:44 960

原创 TCP与HTTP的关系?

它们在TCP/IP七层通信架构的位置不同:它们对应的功能不同:HTTP协议是依赖TCP协议的:

2024-05-12 10:37:42 365 1

原创 从ElasticSearch7开始一个索引里面只允许有一个映射

就是我们的ES中的每个索引都会有一个倒排索引,会记录这个索引中关键字出现的文档id。但是如果同一个索引 的两个不同映射里面,有一个属性名字一样 但是类型不一样,Es就不知道该去找倒排索引的哪一行了,因为这两个的属性名字都一样 比如都是叫做手机名字,但是类型却不一样,所以对于ES搜索引擎来说不好处理。因为ES最初设计的时候是类比于像mysql这样的关系型数据库,比如说ES的索引就相当于是关系型数据库中的数据库;因此在最初的时候 也就意味着 一个索引里面可以有多个映射,因为一个关系型数据库里面可以有多张表嘛!

2024-04-26 11:32:41 300 3

原创 ElasticSearch搜索引擎中,在Kibana客户端使用命令的时候,千万不要加分号结尾

但是不应该啊,我前面明明已经创建了user_index索引,并且控制台也提示命令执行成功了啊?结果发现控制台确实也是有user_index索引的,证明我们的ES中确实已经有了这个索引了,那么现在问题来了,既然有这个索引,那为什么上面我们创建映射的时候却提示我们索引不存在呢?我又继续看了很久 发现了一个很细节的问题,就是上面的控制台输出的索引并不是"user_index"而是"user_index;ES中此时只有带分号的user_index 并没有不带分号的user_index 所以就会提示找不到索引了。

2024-04-26 11:02:04 334 2

原创 Windows安装ElasticSearch

ElasticSearch服务的段括号是9200,可以直接通过localhost:9200在浏览器里面访问 如下图:而Kibana,也就是ElasticSearch的客户端的端口号是5601,我们可以直接通过localhost:5601访问 如下图:7.16.2的版本需要jdk11,但我本地是jdk8,如下图:但是高版本的不用我们环境变量中的jdk,内部直接内置了,就不会有jdk冲突问题了,因此我们可以下载个高版本的ElasticSearch。因此我就换成了一个最高版本的当前8.13.2版本的 看

2024-04-25 17:30:39 1163 3

原创 创建SpringBoot和RabbitMQ的整合项目

后面是消息的一些属性 类似如我们的http协议中的request请求头的信息,包括消息的内容类型了,消息的内容编码了,消息的长度了等信息。这两个端口号特别容易搞错,千万要注意,如果配置文件里的端口号写15672,那么我们的idea里面的java程序就连接不上我们本地已经启动的rabbitmq服务器了。但是我觉得RabbitMQ应该是会有线程安全问题的,比如说因为目前看来同一个队列 两个不同的线程都是可以访问的,那这样的话有共享资源问题 就肯定会出现线程安全问题。不用写交换机和路由的具体信息。

2024-04-25 13:07:47 2029 7

原创 Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid

Druid是阿里巴巴的一个开源项目,号称为监控而生的数据库连接池,在功能、性能、扩展性方面都超过其他例如DBCP数据库连接池、C3P0数据库连接池。而且Druid已经在阿里巴巴部署了超过600个应用,通过了极为严格的考验,这才收获了大家的青睐!数据库连接池是一个存储数据库连接的缓冲区,用于重复使用这些连接,以避免在每次请求时都创建新的数据库连接。因为每次连接数据库和断开数据库都是非常耗费性能的。

2024-04-23 18:16:11 1244

原创 mysql-connector-java和spring-boot-starter-jdbc和mybatis-spring-boot-start

JDBC是使用java语言操作mysql数据库的规范,java语言必须按照这个规范写才可以操作mysql数据库。

2024-04-23 10:32:10 1239

空空如也

空空如也

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

TA关注的人

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