- 博客(46)
- 收藏
- 关注
原创 深入理解Redission释放锁过程
这里调用解锁方法unlockInnerAsync同样返回了RFutrue,当lua脚本执行完过后,RFutrue就会变成完成状态,回调用回调函数onComplete,lua脚本就是再unlockInnerAsync里执行的,我们接着往下追。可以看到map存储的是锁的名称和entry对象 entry对象里面放入了线程id,所以释放的时候先从entry移除线程id,如果没有了线程id再从map里移除entry对象。再往下追unlcokAsync这个异步方法。调用unlock方法,往下追。
2025-07-26 12:31:59
337
原创 万字解析Redission ---深入理解Redission上锁过程
调用tyrLock其实就是下面的方法,如果说没有指定锁的过期时间,可以看到这边设置为了-1再往下追,,只需要先看tryAcquire就行,这是获取锁的核心,tryLock后面还有一堆东西现在先不用管这里将等待时间转化为毫秒,获取了当前线程id,当前时间再往下追,可以看到会根据有没有设置锁的超时时间,调用不同的方法,没有设置的话调用的话会进入下面的代码设置看门狗时间getLockWatchdogTimeout,默认是30秒这里也是30*1000化为了毫秒。
2025-07-25 16:47:22
1532
原创 Java八大基本类型
类型内存默认值典型场景byte1字节0二进制数据、紧凑数组short2字节0兼容性场景、小范围整数int4字节0通用整数计算(默认选择)long8字节0L极大整数(时间戳、天文数字)float4字节0.0f低精度科学计算double8字节0.0d高精度计算(默认浮点)char2字节'\u0000'单个字符处理booleanfalse逻辑判断。
2025-07-24 16:58:50
674
原创 String、StringBuffer与StringBuilder
与StringBuffer共享AbstractStringBuilder。String的不可变性不是简单的限制,而是。:锁定当前StringBuffer实例。:所有"修改"操作都返回新对象。:预分配额外空间避免频繁复制。:相同字面量共享内存(通过。:每个public方法使用。:禁止继承破坏不可变性。
2025-07-23 11:40:39
570
原创 TCP头部
为例,假设客户端(Client)向服务器(Server)发送数据包,但未收到ACK确认。服务端使用固定端口(如HTTP=80, HTTPS=443):SSH/Telnet的中断命令(Ctrl+C)客户端通常使用临时端口(1024-65535):0-65535(0-1023为知名端口):5(最小20字节)到15(最大60字节):基于时钟的随机算法(RFC 6528):指定TCP头部长度(以4字节为单位):当URG=1时,指示紧急数据结束位置。:通过选项扩展窗口大小(最高1GB)SYN+ACK:连接建立响应。
2025-07-22 14:19:50
1521
原创 关于TCP四次挥手
FIN(Finish)标志表示发送方已完成数据发送,希望关闭连接。MSL(Maximum Segment Lifetime)通常为30秒或1分钟。2MSL = 2 × MSL(典型值为60秒或120秒):当前序列号(u为已发送数据的最后字节序号+1):确认序列号(w为被动关闭方的最后序列号)FIN包可以携带数据(但通常不携带)通知应用层连接关闭(触发EOF)接收FIN包,检查序列号有效性。FIN包可能重传,确保可靠性。:确认序列号(确认FIN包)接收方需要显式确认FIN包。:确认被动关闭方的FIN。
2025-07-21 15:06:59
604
原创 Java中的intern()方法
时,若常量池中已存在等值字符串,则返回其引用;并返回引用(JDK7+的行为,详见下文)。当创建字符串字面量(如。Java为了优化字符串内存占用,设计了。若不存在,将字符串放入池中再返回引用。这种机制避免了重复字符串的内存浪费。若存在,直接返回池中的引用;不再复制字符串,而是。
2025-07-20 16:32:02
507
原创 tcp三次握手
若仅进行两次握手,当延迟的SYN报文到达时,服务端会误创建新连接,导致客户端收到无效数据,且服务端资源被耗尽(经典的SYN洪水攻击即利用此缺陷)。:第三次握手可携带应用层数据(如HTTP请求),但需谨慎处理,因为连接尚未完全确认。:声明最大报文段大小(以太网MTU 1500 - 40字节TCP/IP头):客户端随机生成初始序列号(ISN),避免历史报文冲突。:显式确认收到客户端序列号(期待下次收到J+1):通告接收窗口大小(流量控制关键)(避免服务端资源被无效占用)(防止旧报文干扰新连接)
2025-07-19 10:02:10
619
原创 黑马点评实现登录功能--基于redis(通俗易懂)
刷新token的拦截器 用于token刷新,如果还是使用之前的拦截器,我们只是拦截了部分资源请求并刷新过期时间,但是还有其他访问不需要携带用户信息的资源,那用户一直访问这些资源,按理来说token因该刷新,可是原本的代码无法做到这一点。在redis中还能这么做吗,肯定不行这个key是“code”那不完全重复了吗,session之所以可以是因为每次http请求都是独立的互不影响,但是redis是数据库。2.在保存用户信息的时候我们使用用户user对象作为value使用"user"作为key。
2025-07-17 09:47:01
412
原创 HTTP vs HTTPS
首先,由客户端向服务器发起加密通信请求,也就是 ClientHello 请求。服务器收到客户端的第三个随机数(pre-master key)之后,通过协商的加密算法,计算出本次通信的「会话秘钥」。客户端收到服务器的回应之后,首先通过浏览器或者操作系统中的 CA 公钥,确认服务器的数字证书的真实性。上面第一项的随机数是整个握手阶段的第三个随机数,会发给服务端,所以这个随机数客户端和服务端都是一样的。服务器收到客户端请求后,向客户端发出响应,也就是 SeverHello。这种设计使其默认端口为。
2025-07-16 20:35:55
980
原创 黑马点评实战片笔记---基于session登录
比如:在当前这个服务器上用户已经完成了登录,Session中存储了用户的信息,能够判断用户已登录,但是在另一个服务器的Session中没有用户信息,无法调用显示没有登录的服务器上的服务。在分布式集群环境中,会话(Session)共享是一个常见的挑战。默认情况下,Web 应用程序的会话是保存在单个服务器上的,当请求不经过该服务器时,会话信息无法被访问。Tomcat提供了Session拷贝功能,通过配置Tomcat可以实现Session的拷贝,但是这会增加服务器的额外内存开销,同时会带来数据一致性问题。
2025-07-15 16:38:25
1034
原创 关于事务的传播方式
1.REQUIRED传播行为定义了。它决定了新方法是加入已有的“事务组”,还是自己单开一个“新项目组”,或者干脆不参与“项目组”(事务)。和。methodA内部调用了methodB。1.REQUIRED如果当前存在事务则加入该事务;如果当前没有事务,则新建一个事务。最常用的设置。适用于大多数业务逻辑,保证操作在同一个事务边界内。你在项目组A (methodA现在需要完成一个子任务 (methodB如果项目组A已经存在(有事务),你就直接在组A内完成子任务(加入事务)。
2025-07-12 11:13:46
1021
原创 关于String.format
是类的静态方法,用于将指定参数按照格式字符串的规则拼接成格式化字符串。format:格式字符串,包含普通字符和格式说明符(如%d%sargs:可变参数列表,用于替换格式说明符中的占位符。
2025-07-11 14:46:02
1489
原创 MySQL主键深度解析:数据库设计的核心基石
在数据库设计中,主键(Primary Key)扮演着至关重要的角色。它不仅是每条记录的唯一标识符,更是数据库性能优化的关键因素。本文将深入探讨MySQL主键的原理、类型选择、设计策略及最佳实践,帮助您构建高效可靠的数据库系统。,决定了数据在磁盘上的物理存储顺序。在InnoDB存储引擎中,主键自动成为。:自增主键的物理存储顺序与逻辑顺序一致。:自增主键保持顺序写入,减少磁盘寻址。:99%的常规表设计。
2025-07-10 16:23:37
488
原创 存储引擎笔记
存储引擎是对于表来说的不同的表可以有不同的存储引擎,mysql5.5后默认的就是InnoDB了show engines可以显示所有存储引擎support:是否支持commentTransactions:是否支持事务。
2025-07-09 16:54:56
201
原创 MySQL4种隔离级别
在此隔离级别下,事务可以读取其他事务尚未提交的修改(脏读)。这意味着一个事务可以看到另一个事务尚未提交的中间状态数据。在此隔离级别下,事务只能读取已经提交的其他事务所做的修改。每个查询只会看到在该查询开始之前已经提交的数据。在此隔离级别下,事务在执行期间多次读取同一数据时,会看到一致的结果,即使其他事务已经修改了这些数据。MySQL 的 InnoDB 存储引擎通过多版本并发控制(MVCC)实现这一点。这是最高的隔离级别,要求事务必须顺序执行,以避免并发问题。
2025-07-09 13:49:56
1337
原创 关于ArrayList
核心定义:关键特性: 动态扩容:初始容量10,按1.5倍因子增长快速随机访问:实现接口非线程安全:多线程环境需外部同步空间优化:自动缩容(需显式调用)
2025-07-08 16:57:10
254
原创 Java Lambda 类型推断详解:filter() 方法与 Predicate<? super T>
Lambda 表达式是函数式接口的实例化简写。是流元素的类型(本例中是。Lambda 体中使用。Lambda 表达式。
2025-07-08 16:27:54
700
原创 varchar和text区别
在存储字符串时, 可以使用char、varchar或者text类型, 那么具体使用场景呢?1、char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。2、varchar可变长度,可以设置最大长度;适合用在长度可变的属性。3、text不设置长度, 当不知道属性的最大长度时,适合用text。按照查询速度: char最快, varchar次之,text最慢。1、char:char(n)中的n表示字符数,最大长度是255个字符;
2025-07-07 16:58:55
527
原创 Java泛型与Lambda的完美融合:深入解析Collectors.toMap的类型推断机制泛型魔法:T, K, U的解析之旅方法签名解密javapublic static <T, K, U>
根据上下文(方法参数位置)确定目标类型。验证Lambda体是否符合返回类型要求。:流元素的类型(输入类型))推断参数类型和返回类型。:结果Map键的类型。:结果Map值的类型。:由流元素的类型决定。
2025-07-04 17:07:21
387
原创 Fix this pattern in your application or switch to the legacy parser implementation with ‘spring.mvc.
大概率是Spring Boot 应用程序在解析 URL 映射模式时遇到了问题,看看自己接口有没有写错。
2025-07-03 14:20:06
78
原创 深度解析 Collectors.toMap 和 collect 方法
是 Java Stream API 的终端操作,用于将流中的元素累积到可变容器(如集合、Map)中。它提供了两种形式:2. 核心组件当使用 时,包含三个关键组件:Supplier:创建结果容器的工厂Accumulator:将元素添加到容器的函数Combiner:合并并行流结果的函数(用于并行处理)二、 深度解析1. 方法签名2. 参数详解 参数 类型 说明 示例 keyMapper 从元素提取键的函
2025-07-03 14:16:36
719
原创 深入剖析JSON解析底层:Jackson如何突破Java泛型限制前言:当泛型遇上JSON解析
/ 期望返回Map<String, User>结果却是:值类型被解析为Object而非User需要额外的类型转换嵌套泛型信息完全丢失本文将深入探讨Jackson库如何解决这一难题,揭示JSON解析的底层实现机制。
2025-07-02 14:39:09
601
原创 关于mybais-plus自动设置创建时间等
核心就是mybatis-plus能够自动检测@TableField(fill=...)注解,然后通过拦截器来设置创建时间等字段。这里并没有写@Component注解注入到 Spring 容器,因为在其他地方配置过了。因为 MyBatis Plus 通过接口类型识别处理器所以需要继承这个接口。:类似"动物"抽象类,必须通过"猫"/"狗"等具体子类实例化。除此之外还要写个拦截器,通过拦截器拦截并设置创建时间等字段。仅作为基础模板存在,包含所有实体共有的审计字段。可以看到这里的BaseDO声明为抽象类。
2025-07-02 14:37:14
704
原创 关于LambdaQueryWrapper
是 MyBatis-Plus 提供的一种类型安全的条件构造器,使用 Java 8 的 Lambda 表达式来引用实体类字段,避免了硬编码字段名。
2025-07-01 15:37:36
445
原创 Java静态导入
静态导入允许我们在代码中直接使用静态成员(方法或字段),而无需通过类名限定,一定是静态方法// 导入单个静态成员// 导入所有静态成员@Operation(summary = "创建物品信息")如上述代码使用静态导入后就无需使用 类名.方法 的格式了// 没有静态导入// 使用静态导入后// 等价于 CommonResult.success(data)对于编译器来说,会判断是否是静态导入,是的话会解析为全限定类名+方法// 源代码// 编译后等价于。
2025-07-01 10:15:23
329
原创 关于MapStruct手动重写却不生效的问题
可以看到这边我没有写@Mapping但是在MpStruct自动生成的转换类中手动重写了,但是为什么不生效呢,因为MapStruct 是一个编译时代码生成框架,每次编译时都会重新成。老老实实用mapping匹配命名不同的字段。会在重新编译后被覆盖。
2025-06-30 11:06:40
291
原创 Content-Type ‘application/x-www-form-urlencoded;charset=UTF-8‘ is not supported
点击发送后报错,原因大概率是接口中写了@RequestBody注解,表示接收json格式对象,但是这里传入的是表单数据。我这边是因为写@ParameterObject文档才变成表单形式的填写,如果是要求传入json,删。
2025-06-27 16:52:31
393
原创 MySQL 数据类型与 Java 类型映射全解析
本文详细解析 MySQL 数据类型与 Java 类型的对应关系,涵盖数值、日期、字符串、二进制等所有类型。
2025-06-27 16:32:10
652
原创 深入理解Arrays.asList()
底层实现是 Arrays 的内部类 ArrayList(非 java.util.ArrayList),未实现增删方法。:将传入的数组或可变参数转换为一个 List 集合。这个new调用的其实是Arrays里自定义的内部类。继承的默认实现会抛出。
2025-06-26 10:10:52
668
转载 String.valueOf()
(5)String.valueOf(double d) : 将 double 变量 d 转换成字符串 (6)String.valueOf(float f) : 将 float 变量 f 转换成字符串 (7)String.valueOf(int i) : 将 int 变量 i 转换成字符串。(2)Byte.parseByte(String s, int radix) : 以 radix 为基底 将 s 转换为 byte ,比如说 Byte.parseByte("11", 16) 会得到 17。
2025-06-25 15:20:03
38
原创 knife4j v4.0.0版本注解变化
需要注意一点的是升级为4版本后query等对象需要加上@ParameterObject,doc.html显示的才是。form参数,具体的问题可以看官方文档。
2025-06-24 10:12:42
388
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人