- 博客(27)
- 收藏
- 关注
原创 仿小红书交流社区(微服务架构)
在单体项目中,使用 ThreadLocal 就可以满足要求,但在微服务项目,存在微服务间调用的问题,这时 ThreadLocal 就不能保证全局上下文,需要放置拦截器,将信息放在请求头中,保证透传。这个项目提供的注册方式手机验证码,当尝试通过手机号注册时,会先检查数据库,如果存储则返回原有账户,如果不存在则新加一个账户插入到数据库中,用户的 Id,是由上文提到的分布式 id 服务生成的。用户在注册成功后,默认设置为普通用户,并将用户的角色缓存在 redis 中,供后续网关鉴权使用。
2025-07-03 20:51:05
891
原创 Spring 源码阅读(循环依赖、Bean 生命周期、AOP、IOC) - 5.2.15.RELEASE
先说 “一级缓存” 作用,变量名为singletonObjects,结构是Map<String, Object>,它是单例池,将初始化好的对象存入,供其他线程使用。若无一级缓存,无法保证 Spring 单例属性。直接看 “三级缓存”,变量名为singletonFactories,结构是Map<String, ObjectFactory<?>>,其Value是对象的代理工厂。三级缓存作用是存放对象的代理工厂,核心是通过工厂生成 “半成品单例 Bean” 以打破循环依赖。
2025-05-25 10:40:27
611
原创 ThreadPoolExecutor源码阅读以及手写简单线程池 —— JDK17
如果想知道线程是否正在执行任务,只需要调用 Woker 的 tryLock 方法,根据是否加锁成功就能判断,加锁成功说明当前线程没有加锁,也就没有执行任务了,在调用 shutdown 方法关闭线程池的时候,就时用这种方式来判断线程有没有在执行任务,如果没有的话,会尝试打断没有执行任务的线程。这段代码主要为了并发情况下,线程数量的问题,其内部的循环尝试通过 CAS 增加线程的数量 c,如果成功则通过 retry 退出外部循环继续向下执行,如果失败,则继续尝试,直到成功或者条件不符。
2025-05-10 18:00:46
842
原创 MyDB - 手写数据库
当释放一个 DateItem 引用时,会将对应的 references 减一,如果 references 为零, 则会清除该缓存,对应的 page 引用也减一,如果此时 page 的引用也为零,就会将该 page 写回磁盘中。可以注意到,被选择的页,会直接从 PageIndex 中移除,这意味着,同一个页面是不允许并发写的。此框架的作用是向上提供缓存,向下读取文件,使用引用计数的方式来处理缓存,当从缓存读取一个数据,对应的计数加一,当上层应用不在使用该缓存时,对应的计数减一,当计数为零时,会写回文件。
2025-05-05 19:42:46
571
3
原创 MySQL学习总结
侧重点不同:覆盖索引着重于查询所需的数据能直接从索引中获取,避免回表;而索引下推侧重于在索引遍历过程中对部分查询条件进行提前过滤,减少回表的数据量。应用条件不同:覆盖索引要求查询字段必须包含在索引中;索引下推则要求查询条件中有多个可以使用索引的条件。优化效果不同:覆盖索引能够完全避免回表操作;索引下推则是减少回表的次数,在一定程度上提高查询效率。
2025-04-29 20:20:29
910
原创 SQL学习总结
存储过程是一组为了完成特定任务而预先编译并存储在数据库中的 SQL 语句集合。你可以把它想象成编程里的函数,它接收输入参数,执行一系列操作,还能返回结果。触发器是在插入、更新和删除语句前后自动执行的一堆SQL代码。在建立二级索引时,主键会自动加入二级索引中。视图可以简化查询,也可以提供一层抽象。事件是根据计划执行的任务或者一些。视图不存放数据,它只是查询的结果。
2025-03-31 20:21:30
991
原创 Java-动态代理学习总结
类似与Spring中的AOP,是对原有代码的增强,也是对原有代码的封装在Java中,代理(Proxy)是一种设计模式,用于控制对某个对象的访问。代理模式通过创建一个代理对象,来替代原始对象,以实现对原始对象的访问控制。代理对象和原始对象实现相同的接口,客户端对象可以透明地使用代理对象。
2025-02-17 19:57:30
335
原创 SpringCloud学习总结
Component //自定义断言Config> {@Override@Override@Overrideif (first!@Validated@NotEmpty@NotEmpty- name: Vip #自定义断言args:value: lei此断言判断https://cn.bing.com/user=lei,如果user不等于lei则拒绝访问@Component@Override@Override}));
2025-01-31 21:52:29
705
1
原创 NIO学习总结
而引入Selector后,可以将Channel注册在Selector上(相当于Channel添加到Selector这个集合中),每个由这个Channel所触发的事件,会放在SelectionKey中,然后由selector.select()进行阻塞,一旦有事件发生,就会处理。这段代码处理accept事件,并将客户端的channel注册在selector上,对可读事件进行反应,下次客户端发来数据,该channel会触发可读事件并添加到SelectionKey中,等待处理。将多个buffer写入同一个文件中。
2025-01-01 10:31:33
911
原创 JUC学习总结
文章目录锁锁机制原理Mark WordCAS重量级锁轻量级锁偏向锁volatile关键字Lock和Condition接口LockCondition可重入锁公平锁和非公平锁读写锁锁降级和锁升级原子类并发容器CopyOnWriteArrayListConcurrentHashMap阻塞队列线程池线程池的使用锁锁机制原理synchronized使用的锁就是存储在Java对象头中的,在Java中,对象存储在内存中,而每个对象内部,都有一部分空间用于存储对象头信息,其中就包含锁的信息monitorenter
2024-12-27 17:11:17
775
原创 操作系统—段、页、虚拟内存
虚拟内存(Virtual Memory)是操作系统提供的一种技术,它允许程序使用比实际物理内存更大的地址空间。页(Page)是另一种内存管理方式,它将内存划分为固定大小的块,称为页框(Frame),同时将程序的逻辑地址空间划分为相同大小的块,称为页。假如说直接将程序的程序段、数据段直接放入内存中,有可能会造成内存浪费,比如两个段之间有一小段内存,不会被使用,造成浪费,这就是内存碎片。从用户角度看,内存是一段连续空间,可以自由地将程序的段放入内存中,而虚拟内存可以将数据放入内存的页中。
2024-12-23 15:57:10
315
原创 Java并发编程基础篇
的线程的ThreadLocalMap中以该线程为key,赋的值的为值来创建当前线程的对应的HashMap,在Java中,启动main函数时,其实启动的是一个JVM的进程,尔main函数所在的线程是主线程。是进程的一个执行路径,一个进程可以有多个线程,线程之间共享进程的资源。:使用完这些变量后要及时删除,否则可能会造成内存溢出。在线程中对ThreadLocal赋值时,实际上是。是系统分配资源的基本单位,
2024-12-09 19:28:39
303
原创 mybatis复杂查询一对一,一对多
这段 MyBatis 配置代码用于查询。这段 MyBatis 配置代码用于查询。表的数据,并通过关联查询获取。表的数据,并通过关联查询获取。
2024-11-29 21:08:16
502
原创 反射与注解
注解是提供一种为程序元素设置元数据的方法,理解起来还是一样的,程序元素就是指接口、类、属性、方法,这些都是属于程序的元素,那啥叫元数据呢?就是描述数据的数据(data about data)通过class对象获取类的方法,但在使用方法时,要指名那个对象。运行结果发现输出为真说明类的class对象在内存中是唯一的。将上述代码的class文件反编译后。可以通过反射获取构造器来构造对象。可以看出注解本质是一个接口。
2024-11-28 21:15:27
384
原创 SpringBoot3+Vue3 前后端分离项目基于Jwt的校验方案
使用redis实现黑名单功能,用户在退出登录时会将token的uuid存放在redis数据库上,用户在每次请求数据时,后端会校验。用户每次向后端请求数据,会携带token,在SpringSecurity过滤链中进行校验。包装成一个map,并转存到消息队列中,还有将验证码存入到redis中,供后续验证。首先用户向后端请求验证码,来验证邮箱是否正确,以此来判断用户是否可以重置密码。在队列的监听器中,监听器根据队列里的内容发送对应邮件。用户在请求验证码时,后端会将用户的。实现mapper,service。
2024-11-27 09:46:41
606
原创 王爽汇编总结
实际上在执行cal指令会将cal的下一个指令压入栈,在执行ret的指令时,会将栈顶的数据pop给IP。在内存中指令和数据没有差别,都是二进制信息,cpu将CS:IP指向的内存视为指令。观察红色方框,发现汇编指令与源代码不符,这样因为数据与指令混在一起,而在内存中。在debug中查看,代码先执行一遍s代码,然后执行loop,相当于c++中的。汇编中的数组与c++类似,不过汇编中的数组偏移的单位是字节。在c++中函数的目的是可以重复调用某段代码,在汇编中使用。,观察上图的栈帧,发现此时的栈顶数据正是。
2024-11-21 11:41:40
907
原创 HTML个人知识总结
name 属性用于指定表单元素的名称。这个名称在表单提交时会作为键与对应的值一起发送到服务器id 属性用于指定元素的唯一标识符。在同一个HTML文档中,每个id必须是唯一的。
2024-09-27 16:39:41
468
原创 基于Servlet实现上传和下载文件
基于servlet可以实现前后端分离,前端的html页面中可以用form表单,后端可以在service方法中实现上传与下载
2024-09-17 17:10:15
836
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人