自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring源码剖析(一):编译 spring 源码(2022最新版)

目录1. 项目克隆2. 下载gradle3. 更改spring在项目中gradle下载位置4. 阿里云配置,修改bulid.gradle文件, 注意加在了哪,可以用“ mavenCentral()”定位一下5. 命令行运行 gradlew.bat, 成功的结果如下:6. 导入idea预编译7. 正式导入idea(要导好一会儿)8. 改用idea构建,主要为了提速9. 新建测试模块10. 为自己的模块添加spring依赖11. 创建自己的测试类总结:参考:版本说明:JDK:11Springframe

2021-11-22 17:25:43 4863 5

原创 SpringBoot 直接返回 Json格式对象(报错:返回对象为空{})

文章目录1 需求描述2 代码展示3 原因分析4 解决方案5 效果展示6 结束语1 需求描述我们现在要干一个什么事情呢,我们要在浏览器输入一个请求地址,然后我们的后端就给我返回一个User对象即可,并且我希望以Json的格式返回。这个需求很明确,我们先直观的展示一下效果。发送请求:接受结果:2 代码展示行了,明确了需求我们开始整活儿。首先我们老规矩还是先展示一下目录结构(其中标红的文件使我们今天要用到的):接下来是具体的文件内容首先呢我们展示一下User.java文件package co

2022-01-19 21:18:40 2379

原创 Spring Boot 实战(二):Filter过滤器

文章目录概述2 实战2.1 版本声明2.2 目录展示2.3 创建controller类2.4 创建过滤器类2.5 配置Servlet注解扫描路径结果展示概述Filter是依赖于Servlet容器,属于Servlet规范的一部分,Filter的执行由Servlet容器回调完成,Filter的生命周期由Servlet容器管理。他实际的效果就是当请求来的时候经先做一些事情再到service,请求返回的时候也先做一些事情,最后返回给客户端。整体的流程大概是下边这个样子:2 实战2.1 版本声明运行环境

2022-01-13 14:06:38 801 4

原创 Spring Boot 实战(一):用 Junit 对 Controller 类进行单元测试(MockMvc详细注释)

实战篇:用 Junit 对 Controller 类进行单元测试(MockMvc详细注释)

2022-01-11 09:30:00 4012 1

原创 详解Redis —— 发布与订阅(下)

文章目录1-34 发送消息4.1 将消息发送给频道订阅者4.2 将消息发送给模式订阅者5 查看订阅信息5.1 PUBSUB CHANNELS5.2 PUBSUB NUMSUB5.3 PUBSUB NUMPAT1-34 发送消息当一个Redis客户端执行PUBLISH 命令将消息message发送给频道channel的时候,服务器需要执行以下两个动作:1 )将消息message发送给channel频道的所有订阅者。2)如果有一个或多个模式pattern与频道channel相匹配,那么将消息mes

2022-01-06 16:00:00 261

原创 详解Redis —— 发布与订阅(上)

1 概述Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE 等命令组成。通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者( subscriber):每当有其他客户端向被订阅的频道发送消息( message)时,频道的所有订阅者都会收到这条消息。举个例子,假设A、B、C三个客户端都执行了命令:SUBSCRIBE "news. it"那么,订阅关系将会是下边这个样子:这时候某个客户端执行发布命令时,其他客户端就会收到消息:

2022-01-05 20:08:05 1069 1

原创 详解 Redis 对象(下)

文章目录1 类型检查与命令多态2 内存回收3 对象共享4 对象的空转时长1 类型检查与命令多态Redis中用于操作键的命令基本上可以分为两种类型。其中一种命令可以对任何类型的键执行,比如说DEL命令、EXPIRE 命令、RENAME命令、TYPE命令、OBJECT命令等。而另一种命令只能对特定类型的键执行,比如说:SET、GET、APPEND、STRLEN等命令只能对字符串键执行;HDEL、HSET、HGET、HLEN等命令只能对哈希键执行;RPUSH、LPOP、LINSERT. LLEN等

2021-12-31 08:00:00 64 2

原创 详解 Redis 对象(中)

文章目录1 列表对象1.1 编码转换1.2 列表命令实现2 哈希对象2.1 编码转换2.2 哈希命令的实现3 集合对象3.1 编码转换3.2 集合命令的实现4 有序集合对象4.1 编码转换4.2 有序集合的命令实现今天咱么接着上回的文章接着聊!1 列表对象列表对象的编码可以是ziplist或者linkedlist。举个例子如果是链表作为底层实现那大概就是下边这个鬼样子:注意: linkedlist编码的列表对象在底层的双端链表结构中包含了多个字符串对象,这种嵌套字符串对象的行为在稍后介绍的

2021-12-31 07:00:00 187

原创 详解 Redis 对象(上)

文章目录1 对象类型与编码1.1 类型1.2 编码和底层实现2 字符串对象2.1 编码转换2.2 字符串的命令实现在之前的文章里,我们陆续介绍了Redis用到的所有主要数据结构,比如简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合等等。Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种我们前面所介绍的数据结构。1 对象类型与编码每个

2021-12-30 16:04:11 111 1

原创 Redis 数据结构(五)—— 压缩列表

文章目录1 压缩列表的构成2 压缩列表节点的构成2.1 previous_entry_length2.2 encoding2.3 content3 连锁更新4 压缩列表API1 压缩列表的构成压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型( sequential )数据结构。一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值。大概长下边这个样子:下边是详细的属性值介绍:2 压缩列表节点的构成还是整个图看看节点啥样子?

2021-12-30 07:00:00 365

原创 Redis 数据结构(五)—— 整数集合

文章目录1 整数集合的实现2 升级3 升级的好处1)提升整数集合的灵活性2)节约内存4 降级5 整数集合API整数集合(intset) 是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。举个例子,如果我们创建一个 只包含五个元素的集合键,并且集合中的所有元素都是整数值,那么这个集合键的底层实现就会是整数集合:redis> SADD numbers 1 3579(integer) 5redis> OBJECT

2021-12-29 16:34:23 86

原创 Redis 数据结构(四)—— 跳跃表

文章目录1 跳跃表简介2 跳跃表的实现2.1 跳跃表整体结构2.2 跳跃表节点层:前进指针跨度后退指针分值和成员2.3 跳跃表3 跳跃表API完了,今天介绍的这个东西一下子就给我整蒙了,咱也不知道啥是跳跃表啊!稳住,慢慢来!1 跳跃表简介跳跃表( skiplist)是-一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。和链表、字典等数据结构被广泛地应用在Redi

2021-12-29 16:00:58 734

原创 Redis 数据结构(三)—— 字典

文章目录1 字典的实现1.1 哈希表1.2 哈希表节点(dictEntry)1.3 字典结构2 哈希算法3 解决键冲突4 rehash4.1 扩展时机4.2 收缩时机4.3 rehash过程4.4 渐进rehash5 字典常用API关于字典这个数据结构的内容就稍微的有那么一点多了,redis数据库就可以看成是一个字典,那我们就来看看字典的内部究竟是如何实现的吧~1 字典的实现Redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对。接下

2021-12-28 22:51:50 638

原创 Redis 数据结构(二)—— 链表

1 链表和链表节点的结构1.1 节点结构节点的结构大概长下边这个样子:那么,把这些节点就连起来就成了这个样子:1.2 链表结构链表自然除了要把这些节点连起来,还得保存一些其他的信息,不然也太简单了,对吧。那么链表的结构大概长下边这个样子:head:指向链表的表头的指针tail:指向链表的表尾的指针len:记录链表的长度dup:函数用于复制链表节点所保存的值free:函数用于释放链表节点所保存的值match:函数则用于对比链表节点所保存的值和另一个输入值是否相等结构都介绍完了

2021-12-28 21:02:03 611

原创 Redis 数据结构(一)—— 简单动态字符串(SDS 和 C字符串的区别)

1. SDS 的定义简单动态字符串大概是下边这个鬼样子,储存了下边这些东西:已有字符串长度buff空闲的长度buff字符数组2. SDS和C字符串的区别至于SDS和C字符串的区别,我们先来个表吧,先大概看一看,然后一条一条的解释。获取字符串多长更快了!这个解释起来简单,SDS结构体里存了当前字符串的长度,直接读就行,时间复杂度为O(1),而C字符串没存长度,统计长度的时候要把字符串从头到尾的遍历一遍,时间复杂度O(n)。不会有缓冲区溢出!这个也好解释,对于C字符串进行字符

2021-12-27 21:54:18 842

原创 归并排序 递归与非递归写法 (运行方式见上篇文章)

// 分两半,各自排序,然后merge(a, l, m, r) [l,m] [m+1,r] /** * 归并排序思想: 首先分成两部分,将两部分分别排序,之后 merge 到一起 三个函数(主函数 递归划分 merge) * */ // 递归方法实现 public static void mergeSort1(int[] a){ // 对一段区间进行排序 process(a,0,a.length-1); } // 对一段 闭区间 进行排序 private static vo

2021-12-10 20:52:44 487

原创 快速排序思想 以及 递归与非递归实现(含对数器,详细注释)

基本思想:小于等于的放左边,大于的放右边,p在中间,p为数组最右一个数,小于等于区初始为-1实现逻辑:当前数 <=p,当前数 和 小于等于区 的 后一个数 进行交换,小于等于区 外扩,当前数 跳下一个当前数 >p,当前数 直接跳下一个遍历到数组末尾停止进阶思想:小于的放左边,大于的放右边,等于p的在中间,p为最右一个数,小于区的初始为-1,大于区初始为 a.length-1实现逻辑:当前数 <p,当前数 和 小于区 的 后一个数 进行交换,小于区外扩,当前数 跳下一

2021-12-06 22:46:31 596

原创 实战:Java 字节码文件结构(.class)上

概述class 文件也称字节码文件,他是JVM执行的具体文件格式,他并不是JAVA所特有的,任何语言只要他能编译成字节码文件他就能在JVM上执行,同时也就具备了跨平台的特性。今天我们就来聊一下 Class 文件的结构。Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符。Class文件值存储数据只有两种数据类型:无符号数和表。无符号数: u1(表示1字节无符号数)、u2(表示2字节)、u4、u8表: 多个无符号数或其他

2021-12-01 22:07:18 242

原创 字节面试高频算法题:反转链表(递归 and 非递归 详细注释)

文章目录题目:分析:Java代码:leetcode地址题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例 1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]示例 2:输入:head = [1,2]输出:[2,1]示例 3:输入:head = []输出:[]分析:翻转链表,没啥好分析的,注意有递归和非递归两种写法Java代码:/** * Definition for singly-linked list. * public c

2021-11-28 22:57:00 222

原创 阿里面试题:LRU 缓存机制(手写双链表,详细注释)

文章目录题目描述示例LRU性质分析Java解法(详细注释)leetcode 地址题目描述运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果

2021-11-27 22:17:28 674 2

原创 用Java给暗恋对象们群发一份表白邮件(SpringBoot版)

文章目录设置发送者邮箱开启POP3/SMTP服务获取授权码保存更改代码实战1. 创建Spring Boot项目2. 选择mail插件3. 代码目录4. 更改配置信息(application.properties文件)5. 编写邮件服务(EmailService.java)6. 编写测试类(testEmailService.java)7. 运行文件8. 结果展示参考接下来让我们应用主流框架,为暗恋的女孩们群发一封表白邮件,万一能中一个呢!运行环境: JDK 1.8、Intellij IDEA 2021、

2021-11-26 17:51:25 1108 3

原创 Java虚拟机(JVM)垃圾回收机制(GC)详解(下)——垃圾收集器

HotSpot 常用的垃圾收集器我们昨天早下班了,很惭愧,今天接着讲具体的垃圾回收器,先把昨天的图和文章放上来。Java虚拟机(JVM)的垃圾回收机制(GC)详解(上)Serial收集器运行区域: 新生代主要特点: 单线程,采用上篇文章提到的复制算法进行清理,并且清理时要停掉所有的用户线程,也就是系统会停顿。ParNew收集器运行区域: 新生代主要特点: Serial收集器收集器的多线程版本,它运行是也会停掉所有的用户线程,只是相当于有了多个清扫工人来打扫。但需要注意的是,在单CPU

2021-11-25 16:28:57 247 4

原创 Java虚拟机(JVM)的垃圾回收机制(GC)详解(上)

如何判断垃圾?简单来说我们不用了,但是还占用着内存空间就是垃圾。我们需要一种方法判断哪些是我们不会在用的对象,目前有以下几种主流的方法:引用计数法对每个对象都保存一个计数器,当对象被引用时,计数器就加一,引用失效计数器就减一。当计数器为零时,就代表了此对象可以回收了。但是,此方法存在的一个问题就是,当对象间循环引用时就无法被垃圾回收器回收。可达性分析法从GC Roots进行遍历,如果不可达,就视为可以回收。那么哪些对象可以作为GC Roots呢?在java语言中主要有以下几种:虚拟机栈(栈帧

2021-11-25 13:26:21 347 2

原创 Java虚拟机 内存区域(JVM运行时数据区)理论+实战

本文会对JVM运行时数据区(java内存区域)进行详细的介绍,并对介绍中提到的OOM异常进行实战演示。运行编译器: Intellij IDEA虚拟机类型: HotSpot操作系统: win11JDK: 1.8文章目录理论介绍1. 程序计数器2. Java 虚拟机栈3. 本地方法栈4. Java 堆5. 方法区(元数据区MetaSpace)6. 字符串常量池7. 直接内存实战演示1. Java 堆 溢出JVM参数设置(注意参数之间有空格):设置位置:测试代码:结果展示结果分析2. 虚拟机栈和本地

2021-11-24 20:07:06 675 5

原创 基于TCP协议的Socket通信 JAVA多线程版(详细注释)

文章目录TCP连接流程代码实战1. 目录结构2. 代码详解客户端代码 Client.java服务端代码 Server.java服务端多线程代码 ServerThread.javaTCP连接流程整个的连接流程如图所示,需要注意的是服务器端创建了两个socket,一个用于监听,一个用于接受具体的连接,而本文所主要采用的多线程客户-服务器socket通信,主要是将连接成功的socket交给不同的线程去处理,来执行不同的数据传输任务(图中蓝色部分),从而服务器可以继续监听来自其他客户端的连接不被阻塞住。代码

2021-11-24 14:51:17 925 1

原创 Intellij IDEA项目打jar包 无bug

(工程实现,还未深入)不要用idea自带的打包方式!!!!!(十次九次出错…)在pom.xml 中添加插件:<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution>

2021-11-23 10:47:19 455

原创 非要把它讲清楚 happens-before原则 和 Volatile 关键字

目录什么才是安全的并发程序?如何写出安全的并发程序?底层如何实现?在上次的文章中我们聊了Java 内存模型(JMM)非要把它讲清楚,Java内存模型(JMM),那是JVM层面的规范,来去解决并发编程中带来的缓存一致性的问题。但是我们想要写出安全的并发程序,具体要怎么做呢?我们应该如何应用这些规则,或者触发这些规则呢?希望大家在读之前要明确自己的目的,我们现在要写的是并发程序,我们要解决的是在并发情况下出现的问题,不能只从单线程的角度思考。在这个前提下我们思考如下问题:什么才是安全的并发程序?简单来说

2021-11-18 22:51:58 237

原创 非要把它讲清楚,Java内存模型(JMM)

在解释 java内存模型 之前,我们先来大概了解一下内存模型。内存模型是操作系统层的概念,它规定了当cpu执行程序时,如何与内存进行数据交互。为什么要规定这个东西呢?因为这个东西很复杂,不好搞。具体来说,我们现代计算机的体系结构中,为了优化cpu的处理效率,在处理器和主存之间往往有多级缓存(例如,L1、L2、L3级缓存)。这就意味着同一个数据可能会出现在多个地方,我们十分希望它们都是一致的,但是往往有很多线程在同时的读写,导致一致性很难保证。我们称此类问题为缓存一致性问题在多线程并发过程中,可以

2021-11-12 20:19:30 599

原创 什么是进程?

我尽量用通俗的语言解释什么是进程。先来个定义:我们把一个运行中的程序就叫做进程。这句话很短很抽象。往往对这种比较抽象的东西,不如来描述一下,他是用来干啥的,有啥特性大家就意会了。如此一来,我们便经常听到这样的描述“进程是操作系统中资源分配的基本单位”。我们来分析一下这句话。进程是谁进行资源分配的基本单位?—— 操作系统操作系统进行资源分配只认进程,进程会不会将自己的资源细分操作系统不管。我要发女朋友,只需要你告诉我需要几个就行,至于你右手几个左手几个是你的事情。为啥要进行资源

2021-11-07 00:21:32 561

原创 MySQL 存储引擎 1— InnoDB记录结构

目录InnoDB 的行格式COMPACT 行格式REDUNDANT 行格式溢出列DYNAMIC 行格式和 COMPRESSED 行格式啥是存储引擎呢? 简单来说就是数据的存储一般是在硬盘,而数据的处理一般是在内存,但是这两者速度差距又比较大,势必会影响处理速度,存储引擎就是在这个问题上想了想办法。那具体是啥办法呢?我们需要处理数据时,要把数据都从硬盘搞到内存是不太现实,因为又不是都有用,再说了就是都有用空间也不应定够,空间够时间也不允许。所以就得一块一块的搞过来,InnoDB就是先把数据分了页,一页一般

2021-10-20 22:52:10 128

原创 MySQL 支持的字符集 和 比较规则

你有没有过关于MySQL编码方式字符集报错的问题呢?那就让我们一起了解一下吧 hhh目录查看支持字符集查看比较规则字符集和比较规则的应用级别划分客户端和服务器通讯使用的字符集查看支持字符集我们可以通过如下语句查看MySQL中支持的字符集:SHOW (CHARACTER SET|CHARACTER) [LIKE 匹配模式];我们可以看到,如下显示:其中:Charset 表示字符集缩写。Description 表示简单描述。Default collation 代表此字符集应用的比较规则。

2021-10-14 22:30:30 251

原创 MySQL 的启动项、配置文件 和 系统变量

目录启动项命令行修改 (当次生效)配置文件修改 (永久生效)配置文件优先级系统变量查看系统变量设置系统变量启动项重新启动才生效命令行修改 (当次生效)禁止TCP/IP网络通信mysqld --skip-networking设置默认存储引擎mysqld --default-storage-engine=MyISAM (不能有空格)配置文件修改 (永久生效)mysql 会去多个地方找配置文件,主要按以下顺序(UNIX):路径名备注/etc/my.cnf

2021-10-13 20:29:16 320

原创 MySQL 客户端和服务端的通信

目录连接方式TCP/IP命名管道和共享内存UNIX域套接字服务器处理1. 连接管理2. 解析优化查询缓存语法解析查询优化3. 存储引擎连接方式TCP/IP客户端和服务器都是一个进程,他们可能并不在一个主机中,因此他们可以通过TCP协议进行通信。客户端程序可以用 -P 指定连接的端口。 服务端可以用 -P 指定运行监听的端口。(默认端口为3306)命名管道和共享内存Windows 可以用, 客户端和服务器在同一台机器UNIX域套接字UNIX 可用,客户端和服务器在同一台机器服务器处理当服务端

2021-10-12 21:44:09 599 1

原创 MySQL bin目录下的启动脚本

mysqld代表MySQL服务器程序,启动了他就是启动了MySQL服务进程。mysql_safemysqld_safe 是以一个启动脚本。它会间接调用 mysqld 并持续监控它的运行状态。当进程出现错误时,它还可以对其进行重启。另外,使用 mysqld_safe 启动 MySQL服务器程序时,它会将服 程序出错信息和其它诊断信息输出到错误日志(.err 文件),以方便后期查找发生错误的原因。总节:1. 启动脚本 2. 监控有问题重启 3. 记录错误mysql.server它也是启动脚本,会间接

2021-10-12 21:41:41 863 1

原创 (官网)Docker 入门篇(一)—— 定位和设置

(官网)Docker 入门篇(一)—— 定位和设置这几篇系列文章都是来源于官网的文档:https://docs.docker.com/get-started/,自己看的时候顺便翻译了一下 :)预计阅读时间: 4分钟目录(官网)Docker 入门篇(一)—— 定位和设置下载并安装 Docker开始教程Docker 面板什么是容器?什么是容器镜像?CLI 引用欢迎! 我们很高兴你想学Docker。这个教程包含了如何使用 Docker 的一步一步的说明。在这个教程中,你将学习如何:生成并运行一个

2021-06-20 13:03:16 226 1

原创 详解浏览器缓存之HTTP缓存

文章目录什么是浏览器缓存?浏览器的缓存分类硬缓存协商缓存当我们在地址栏输入URL的时候浏览器发生了什么?新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入什么是浏览器缓存?缓存一词应该大家都不陌生,最基本的功能之一就是提高

2020-12-04 13:39:44 362 1

空空如也

空空如也

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

TA关注的人

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