- 博客(71)
- 收藏
- 关注
原创 Nacos配置获取为空?Ignore the empty nacos configuration and get it based on dataId 一次完整的排错经历与解决方案
之后可以看到日志输出下面的这样信息 然后可以看到Nacos客户端成功连接到了Nacos服务器(192.168.88.128:8848),这说明网络连接和基础配置是正确的 那大概率是配置问题了。最近在部署一个Spring Cloud项目时,遇到了一个典型的Nacos配置问题:应用启动时报错数据源配置缺失,但检查代码发现配置明明已经在Nacos中配置了。所有配置Data ID都显示"Ignore the empty nacos configuration",这意味着Nacos返回了空配置。
2025-11-08 14:55:09
281
原创 MySQL前缀索引
(即前n字符的唯一性)越高,“前n字符匹配但完整值不匹配”的情况越少,性能越好。),此时前缀索引的“前n字符”若能唯一标识行,则可以避免“前n字符匹配但完整值不匹配”的情况。目标值时,该行才会被返回。如果所有“前5字符匹配”的行都不满足完整值条件,则返回空结果。看例子中的辅助索引结构,右边的叶子节点有一个红色框,里面是。)会导致选择性差,太多“前3字符匹配”的行;查询时“数据中的email不等于目标值”的情况,需要从。(仅前5个字符),因此需要通过第一步得到的主键ID,到。),这些行也会被索引“命中”。
2025-09-24 19:18:44
971
原创 非连续性内存分配:分页
2^SS示例:若S=12,则每帧大小为 4KB(2^12=4096字节)2^FF示例:若F=20,则最多支持 1,048,576 个帧(1M帧)(f, o)fF2^FS2^S物理地址=(2S×f)+o物理地址=(2S×f)+o2^S × ff+ oo✅物理地址的高F位存储帧号(f),低S位存储偏移(o),硬件可直接拼接计算地址(无需乘法运算)。通过一个例子来更好的解释。
2025-09-18 21:32:30
1394
原创 Spring如何巧妙解决循环依赖问题
循环依赖是指两个或多个Bean之间相互依赖,形成闭环的情况。例如:AService依赖BService,而BService又依赖AService。这种场景下,传统的创建顺序无法满足依赖注入的要求。
2025-09-15 18:06:49
835
原创 深入剖析Spring动态代理:揭秘JDK动态代理如何精确路由接口方法调用
这段看似简单的代码背后,隐藏着JDK动态代理的精妙设计。本文将深入剖析JDK动态代理的工作原理,揭示其精确路由的奥秘。
2025-09-05 17:03:04
934
1
原创 手写spring源码--spring前置后置处理器和spring代理机制
Bean的后置处理器,可以利用这个机制去处理我们的Bean,我可能希望对Bean创建的过程去做一些控制,因此我们需要一个接口,这个接口是spring那边的我们自己的实现类这个肯定是在自己相关代码写的,需要Component注解因为要交给spring来管理我们需要一个List保存需要对Bean前置处理和后置处理的集合,List中保存的对象就是Bean处理器接口扫描的过程中添加到list中依旧是在创建bean方法中实现前置后置处理器逻辑 这也是Bean的生命周期中的一环。
2025-08-19 10:43:26
758
原创 手写Spring容器核心原理
*** Spring配置类示例* 使用@ComponentScan指定扫描包路径*/@ComponentScan("com.zhouyu.service") // 扫描com.zhouyu.service包及其子包// 配置类可以包含其他配置信息/*** Bean定义类:封装Bean的元数据信息*/// Bean的Class类型(如UserService.class)// Bean的作用域(singleton/prototype)// Setter和Getter方法。
2025-08-18 11:30:50
450
原创 手写Spring源码–创建容器的过程
此时还有创建Bean和存入Bean的逻辑没有写,但是此时需要考虑存储和创建Bean的时候这个Bean是单例的还是多例的,我们还需要一个注解来标识这个Bean是单例还是多例。到目前为止我们就可以区分出单例Bean和多例Bean了,但是没有单例Bean随着容器的创建而创建的逻辑,根据Bean名称获取Bean的方法getBean也没完善。好了到目前为止,spring容器还有扫描相关的逻辑没有写,下面的是扫描相关了逻辑,只配置了关于@Component的。容器的构造器还需要添加单例Bean的创建逻辑。
2025-08-17 09:42:46
694
原创 redis原理篇--SkipList
首先,因为 zset 要支持随机的插入和删除,所以它,关于排序问题,我们也很容易就想到这样的树形结构,为什么 Redis 不使用这样一些结构呢?(下面详细说)
2025-08-16 10:17:06
932
原创 redis数据结构--String
redis中的所有key是字符串,所有value本质上也是字符串,比如 集合set中的每一个 成员 都是一个独立的字符串对象,列表中的每一个 元素 都是一个独立的字符串对象,整个HASH是一个对象,它内部的每一个 字段(field) 和一个字段值(value) 都是一个独立的字符串对象redis是通过c语言来实现的,但是没有直接使用c语言中的字符串,有几下几点原因\0\0\0\0:Redis因此构建了自己的字符串结构——(简单动态字符串),它通过设计一个智能结构来支持查找、二进制安全性和动态修改。
2025-08-15 08:30:17
1611
原创 redis原理篇--ZipList
对于Dict来说最大的问题就是内存的浪费(内存不连续),在整个Dict中大量的使用了指针,而ziplist的内存空间是连续的,节省了很多内 存空间,不需要通过指针来寻址找到各个节点 ,有了这个特性从开始寻找到结束的就十分方便所有的这些标识字段所占用的大小是固定的但是对于entry来说每个entry的大小是不固定的,为了节省内存空间,不同大小的entry占用不同的空间,那这里又有问题了大小不固定接下来证明去寻址遍历呢。
2025-08-13 08:45:38
665
原创 redis原理篇--Dict
Redis字典由三部分构成:字段详解: 字段详解: 值联合体 步骤2:解决哈希冲突 创建新entry: 头插法链入: 步骤3:更新哈希表状态 设计目的 平衡内存效率和性能:当平均每个桶至少存储一个元素时(LoadFactor=1),冲突概率显著增加。此时扩容可降低冲突率,但需考虑系统负载。后台进程限制原因 保护持久化操作: 设计目的 紧急避险机制: 当哈希冲突极度严重时(平均每个桶链长超过5
2025-08-12 15:32:10
1792
原创 Redis原理篇——IntSet
contents[]int8_tint8_t是C语言中的,但contents数组的实际存储类型由encodingcontentsint16_t[]contentsint32_t[]contentsint64_t[]int8_t*encodingiencodingint16_tshortint32_tintint64_tlongINT1632768encodingINT16INT32。
2025-08-11 09:36:25
727
原创 Redis原理篇--动态字符串SDS
redis中的所有key是字符串,所有value本质上也是字符串,比如 集合set中的每一个都是一个列表中的每一个都是一个整个HASH是一个对象,它内部的每一个和一个都是一个redis是通过c语言来实现的,但是没有直接使用c语言中的字符串,有几下几点原因\0\0\0\0:Redis因此构建了自己的字符串结构——SDS(简单动态字符串),它通过设计一个智能结构来支持查找、二进制安全性和动态修改。
2025-08-08 08:47:08
1360
原创 Mybatis plus链式调用
链式调用的核心思想在于:一个对象的方法在调用后,返回对象本身(通常是this),使得后续的方法可以紧接着在前一个方法调用的结果上继续调用,形成一条连续的“链条”。在 Mybatis Plus 的和中,绝大多数用于添加条件(如eqlikegtorderBy等)的方法都采用了这种设计。
2025-08-06 09:44:54
1648
原创 一文彻底搞清session、cookie、token的区别
Session:通常有效期较短(如用户不活动 30 分钟后过期),依赖于 Session ID 的传递(若 Cookie 失效或用户清除 Cookie,Session 即失效)。将编码后的 Header、编码后的 Payload 和一个密钥(Secret,只有服务器知道)通过 Header 中指定的签名算法(如 HMAC SHA256)计算生成。如果找到有效的 Session,服务器就知道当前请求来自已登录的用户,并可以使用 Session 中存储的信息处理请求(如显示用户名)。
2025-08-04 10:57:39
1760
原创 Redis 数据同步机制
在现代分布式系统中,Redis 凭借其高性能和丰富的数据结构成为核心组件。。本文将深入剖析 Redis 的三种核心同步机制:主从复制、哨兵模式与集群分片,助你构建稳健的 Redis 架构。
2025-08-03 11:03:11
641
原创 mybatis-plus逻辑删除
逻辑删除是一种优雅的数据管理策略,它通过在数据库中标记记录为“已删除”而非物理删除,来保留数据的历史痕迹,同时确保查询结果的整洁性。通过以上步骤,你可以轻松地在 MyBatis-Plus 中实现逻辑删除功能,提高数据管理的灵活性和安全性。MyBatis-Plus 的逻辑删除功能会在执行数据库操作时自动处理逻辑删除字段。同样,逻辑未删除值默认为 0,逻辑已删除值默认为 1。类型,可以配置逻辑未删除值为 0,已删除值可以使用函数如。在实体类中,对应数据库表的逻辑删除字段上添加。类型,可以配置逻辑未删除值为。
2025-08-01 16:56:48
681
原创 关于Redis持久化
仅当父进程修改数据时复制对应内存页,极大减少内存占用 9。,进程退出或服务器宕机将导致数据丢失。(文本格式),通过重放日志恢复数据。[RDB二进制数据] + [增量AOF命令]:比纯AOF提升3倍+(优先加载RDB快照)AOF重写时先以RDB格式保存全量数据。:避免突发故障导致全量数据丢失 26。后续增量命令以AOF格式追加 58。:比纯AOF节省30%+空间 57。:AOF补全RDB后的增量数据。:误操作后可通过历史快照恢复。:支持跨机房/跨区域容灾。:重启后快速重建数据集。:按配置规则执行(如。
2025-07-31 09:12:36
492
原创 Redis五大基本数据类型
Redis作为高性能的键值存储系统,其核心价值在于丰富的数据结构。本文将深入剖析Redis的五种基本数据类型,揭示其内部实现原理,并提供实际应用场景和最佳实践。
2025-07-28 15:31:04
588
原创 深入理解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
532
原创 万字解析Redission ---深入理解Redission上锁过程
调用tyrLock其实就是下面的方法,如果说没有指定锁的过期时间,可以看到这边设置为了-1再往下追,,只需要先看tryAcquire就行,这是获取锁的核心,tryLock后面还有一堆东西现在先不用管这里将等待时间转化为毫秒,获取了当前线程id,当前时间再往下追,可以看到会根据有没有设置锁的超时时间,调用不同的方法,没有设置的话调用的话会进入下面的代码设置看门狗时间getLockWatchdogTimeout,默认是30秒这里也是30*1000化为了毫秒。
2025-07-25 16:47:22
1872
原创 Java八大基本类型
类型内存默认值典型场景byte1字节0二进制数据、紧凑数组short2字节0兼容性场景、小范围整数int4字节0通用整数计算(默认选择)long8字节0L极大整数(时间戳、天文数字)float4字节0.0f低精度科学计算double8字节0.0d高精度计算(默认浮点)char2字节'\u0000'单个字符处理booleanfalse逻辑判断。
2025-07-24 16:58:50
751
原创 String、StringBuffer与StringBuilder
与StringBuffer共享AbstractStringBuilder。String的不可变性不是简单的限制,而是。:锁定当前StringBuffer实例。:所有"修改"操作都返回新对象。:预分配额外空间避免频繁复制。:相同字面量共享内存(通过。:每个public方法使用。:禁止继承破坏不可变性。
2025-07-23 11:40:39
616
原创 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
1846
原创 关于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
742
原创 Java中的intern()方法
时,若常量池中已存在等值字符串,则返回其引用;并返回引用(JDK7+的行为,详见下文)。当创建字符串字面量(如。Java为了优化字符串内存占用,设计了。若不存在,将字符串放入池中再返回引用。这种机制避免了重复字符串的内存浪费。若存在,直接返回池中的引用;不再复制字符串,而是。
2025-07-20 16:32:02
739
原创 tcp三次握手
若仅进行两次握手,当延迟的SYN报文到达时,服务端会误创建新连接,导致客户端收到无效数据,且服务端资源被耗尽(经典的SYN洪水攻击即利用此缺陷)。:第三次握手可携带应用层数据(如HTTP请求),但需谨慎处理,因为连接尚未完全确认。:声明最大报文段大小(以太网MTU 1500 - 40字节TCP/IP头):客户端随机生成初始序列号(ISN),避免历史报文冲突。:显式确认收到客户端序列号(期待下次收到J+1):通告接收窗口大小(流量控制关键)(避免服务端资源被无效占用)(防止旧报文干扰新连接)
2025-07-19 10:02:10
665
原创 黑马点评实现登录功能--基于redis(通俗易懂)
刷新token的拦截器 用于token刷新,如果还是使用之前的拦截器,我们只是拦截了部分资源请求并刷新过期时间,但是还有其他访问不需要携带用户信息的资源,那用户一直访问这些资源,按理来说token因该刷新,可是原本的代码无法做到这一点。在redis中还能这么做吗,肯定不行这个key是“code”那不完全重复了吗,session之所以可以是因为每次http请求都是独立的互不影响,但是redis是数据库。2.在保存用户信息的时候我们使用用户user对象作为value使用"user"作为key。
2025-07-17 09:47:01
501
原创 HTTP vs HTTPS
首先,由客户端向服务器发起加密通信请求,也就是 ClientHello 请求。服务器收到客户端的第三个随机数(pre-master key)之后,通过协商的加密算法,计算出本次通信的「会话秘钥」。客户端收到服务器的回应之后,首先通过浏览器或者操作系统中的 CA 公钥,确认服务器的数字证书的真实性。上面第一项的随机数是整个握手阶段的第三个随机数,会发给服务端,所以这个随机数客户端和服务端都是一样的。服务器收到客户端请求后,向客户端发出响应,也就是 SeverHello。这种设计使其默认端口为。
2025-07-16 20:35:55
1090
原创 黑马点评实战片笔记---基于session登录
比如:在当前这个服务器上用户已经完成了登录,Session中存储了用户的信息,能够判断用户已登录,但是在另一个服务器的Session中没有用户信息,无法调用显示没有登录的服务器上的服务。在分布式集群环境中,会话(Session)共享是一个常见的挑战。默认情况下,Web 应用程序的会话是保存在单个服务器上的,当请求不经过该服务器时,会话信息无法被访问。Tomcat提供了Session拷贝功能,通过配置Tomcat可以实现Session的拷贝,但是这会增加服务器的额外内存开销,同时会带来数据一致性问题。
2025-07-15 16:38:25
1076
原创 关于事务的传播方式
1.REQUIRED传播行为定义了。它决定了新方法是加入已有的“事务组”,还是自己单开一个“新项目组”,或者干脆不参与“项目组”(事务)。和。methodA内部调用了methodB。1.REQUIRED如果当前存在事务则加入该事务;如果当前没有事务,则新建一个事务。最常用的设置。适用于大多数业务逻辑,保证操作在同一个事务边界内。你在项目组A (methodA现在需要完成一个子任务 (methodB如果项目组A已经存在(有事务),你就直接在组A内完成子任务(加入事务)。
2025-07-12 11:13:46
1115
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅