自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 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 2712 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 34331 5

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

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

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

原创 Group_Concat分组连接函数的使用

从查询结果我们可以看出来,确实是根据class_id班级id进行分组处理了,但是有一个问题,就是我们最后的连接结果存在相同的值,比如存在多个深圳重复的,但是我们想要让它不重复,那么怎么把每一组的address去重后连接呢?当使用group_concat函数方法的时候,一般都会配合group by分组语句使用,并且select的查询结果字段只能是group by分组的字段;但是假如我们现在又来了新的需求,我们想要每一个分组的address按照降序排列,该怎么做呢?可以看到这次我们已经把重复的城市都给去掉了;

2025-01-09 17:18:49 215

原创 spring cloud版本和spring boot版本必须匹配,否则会报错

上一个异常确实消失了,但是又出现了上图中的新的异常:Correct the classpath of your application so that it contains a single, compatible version of org.springframework.context.ConfigurableApplicationContext。我们都换成是2.5.6试下,但是发现还是不行;这是什么原因造成的呢?

2024-12-19 15:16:22 235

原创 引入一个依赖之后项目启动异常

这里的异常意思说的是,我的idea里面运行spring-security-config依赖里面编译好的代码的时候使用的是jdk8,但是spring-security-config 版本5.4.0里面编译的时候使用的是jdk17,不匹配,所以出现了异常。解决方法有两个:一个是提升我的idea里面jdk的版本到17,另外一个就是降低spring-security-config依赖的版本,小于5.4.0,知道这个版本里面编译的代码使用的是jdk8或者以下;

2024-12-19 11:21:35 175

原创 使用hutool工具构建Tree树形结构

{id=1, parentId=0, name=浙江省, sunshineDuration=5.55, children=[{id=2, parentId=1, name=杭州市, sunshineDuration=6.55, children=[{id=3, parentId=2, name=西湖区, sunshineDuration=7.55}, {id=4, parentId=2, name=萧山区, sunshineDuration=7.56}]}]},name就是当前节点的名字;

2024-11-25 13:51:59 1249

原创 如何捕获正则表达式匹配到的值?以及如何限制获取正则表达式匹配到的值?

需求:假如有很多个字符串,一个正则表达式格式可以匹配很多个字符串,那么我们怎么能知道每次匹配的字符串是什么样的呢?这个时候就需要捕获正则表达式匹配的值了。那如果我们现在觉得这种捕获不安全,想要禁止通过代码捕获正则表达式的值呢?这个时候需要怎么改写正则表达式呢?怎样使用java代码捕获呢?

2024-11-14 09:38:48 365

原创 各种AI工具网站

各种AI工具网站

2024-11-01 09:33:43 224

原创 深入理解Nginx

2012年,Nginx荣获年度云计算开发奖(2012 Cloud Award for Developer ofthe Year),并成长为世界第二大Web服务器。全世界流量最高的前1000名网站中,超过25%都使用Nginx来处理海量的互联网请求。Nginx已经成为业界高性能Web服务器的代名词。那么,什么是Nginx?它有哪些特点?我们选择Nginx的理由是什么?如何编译安装Nginx?这种安装方式背后隐藏的又是什么样的思想呢?本章将会回答上述问题。

2024-10-31 17:54:28 727

原创 OAuth 2.0

第一步,A 应用在命令行向 B 发出请求。上面 URL 中,

2024-10-12 17:37:16 1685

原创 智能高清视频监控--天下安防

我们的视频,它的大小很大,所以一般不会在网络中直接进行传输,否则它占据的带宽就太多了,影响网络的整体速率。那假如我们的网络现在是无线的wifi网络,如果它的网络带宽是16M,并且现在有四个人连接这个wifi,那么这四个人的网速最大是4m/s,也就是说当这四个人下载视频的时候(从网络一端数据到这个人的手机也就是网络另一端),这个下载速率最多4m/s。等到我们的视频码流传输到网络的另一端之后,另一端可以通过原视频压缩的算法进行再次的解压还原成原视频,这样在网络的另外一端就可以直接的观看了。

2024-09-30 17:47:22 1019

原创 LambdaQueryWrapper和QueryWrapper的区别?

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

2024-08-23 14:24:01 259

原创 @PostConstruct注解的使用

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

2024-08-01 15:34:22 217

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

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

2024-06-27 15:33:08 496

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

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

2024-06-21 14:48:25 1641

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

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

2024-06-18 15:01:20 359

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

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

2024-06-18 14:50:36 315

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

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

2024-06-18 14:15:18 1700

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

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

2024-06-16 19:24:36 646

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

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

2024-06-16 19:10:12 230

原创 类Copy方法:BeanUtils.copyProperties

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

2024-06-16 18:16:19 264

原创 导出excle表

如下图:

2024-06-16 17:55:47 490

原创 Validation校验

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

2024-06-16 11:32:28 1040

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

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

2024-05-28 17:11:03 1344

原创 PageHelper分页和ThreadLocal

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

2024-05-26 19:15:01 768

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

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

2024-05-22 12:11:18 512

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

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

2024-05-22 10:23:52 540

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

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

2024-05-22 10:11:23 446

原创 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 930

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

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

2024-05-21 12:34:12 1208

原创 @RequestBody注解

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

2024-05-20 17:13:10 1419

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

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

2024-05-20 12:07:01 401

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

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

2024-05-20 11:22:41 780

原创 Netty中的流式传输

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

2024-05-19 00:32:08 784

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

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

2024-05-18 23:27:40 836

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

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

2024-05-18 21:39:34 934

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

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

2024-05-18 13:07:51 1132

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

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

2024-05-17 18:36:26 889

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

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

2024-05-17 18:30:12 1322

空空如也

空空如也

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

TA关注的人

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