- 博客(89)
- 收藏
- 关注
原创 【SpringBoot篇】如何使用CommandLineRunner实现缓存预热
这是 Spring Boot 中非常典型的应用场景。• 根据业务需求选择同步或异步预热,并做好异常处理和幂等性设计。与 Spring Boot 的启动流程无缝集成,无需额外配置。• 对于分布式环境,需额外协调多实例的预热任务。(例如重启时),避免因重复预热导致数据不一致。确保预热逻辑在启动流程的最后一步执行。• 避免全量数据预热,防止启动时间过长。,此时所有 Bean(包括缓存组件如。)已初始化完成,避免依赖未就绪的问题。,确保逻辑在依赖就绪后执行。(如首页配置、热门商品)。• 缓存预热操作需支持。
2025-04-06 14:15:53
314
原创 【Spring篇】Spring的生命周期
通过掌握 Bean 的生命周期,可以更好地利用 Spring 的扩展能力(如自定义初始化、资源管理),同时避免因生命周期管理不当导致的资源泄漏或状态错误。在 Bean 定义加载后、实例化前修改 Bean 的定义(如修改属性值)。在 Bean 初始化前后插入自定义逻辑(如 AOP 代理、属性加密)。在 Bean 初始化前执行自定义逻辑(如修改 Bean 属性)。:容器启动时(单例 Bean)或请求时(原型 Bean)。在 Bean 初始化后执行自定义逻辑(如生成代理对象)。标记在方法上,容器会调用该方法。
2025-03-25 17:55:31
1114
原创 【SpringBoot篇】SpringBoot的自动装配原理
只有条件满足时,才会自动配置对应的Bean,比如数据源、MVC组件等。同时,如果开发者自己配置了Bean,Spring Boot会优先使用用户定义的,而不是默认的。“自动装配减少了手动配置的重复工作,通过约定大于配置的理念,让开发者只需关注业务代码,同时也能通过自定义配置覆盖默认行为,平衡了效率和灵活性。中的配置类 → 根据条件注解筛选有效的配置 → 将符合条件的Bean注入容器。,自动组装项目所需的Bean,无需手动编写大量配置。文件,加载其中注册的自动配置类。),则自动配置的Bean不生效。
2025-03-25 10:29:57
187
原创 【分布式】如何使用RocketMQ实现下单-库存-支付这个场景的分布式事务问题
场景中,通过消息队列实现最终一致性,需保证三个微服务的操作最终一致,且在支付失败或库存不足时触发回滚补偿。使用 RocketMQ 事务消息,确保本地事务与消息发送的原子性。若消息发送失败,订单创建事务回滚。开启消费者重试(默认重试16次),若最终消费失败,消息进入死信队列(需人工干预)。同一订单的消息发送到同一队列(MessageQueue),保证顺序消费。:依赖消息队列的可靠性和重试机制,天然支持服务宕机容错。:依赖消息消费速度,不适用于实时性要求高的场景。,触发库存回滚和订单取消。,订单服务取消订单。
2025-03-13 14:49:38
631
原创 【Spring】Spring是如何解决循环依赖问题的
不过要注意,构造器注入的循环依赖是无法解决的,因为构造器注入需要先完成实例化,而实例化的时候就需要依赖的Bean已经存在。需要提醒他们在遇到循环依赖时,检查异常信息,确定是哪种类型的循环依赖,以及Spring是否支持解决。总结一下,回答中需要涵盖:三级缓存机制、处理流程(实例化、提前暴露引用)、构造器注入和原型Bean的限制,以及如何避免循环依赖的建议。另外,Spring只能解决单例作用域的Bean的循环依赖。首先,我得回忆一下循环依赖的定义,就是两个或多个Bean相互依赖,比如A依赖B,B又依赖A。
2025-03-12 21:51:43
1104
原创 我用一个“图书馆借书”的比喻来解释 MVCC,保证你 3 分钟彻底搞懂!
即使作者 A 提交了,读者 B 在整个借书期间只能看到最初拿到的旧版本。:每次借书都拿最新的规则手册(每次查询生成新 ReadView)。类似你截图保存了朋友圈,之后别人删了或改了,你看到的还是截图内容。根据规则,不能看未提交的修改,于是去拿复印的旧版本(通过。(类似 MVCC 的数据版本),大家各看各的,互不干扰!看到原书被作者 A(ID=100)正在修改(未提交)。直接读原书的最新内容(看到作者 A 修改后的版本)。:读者不会看到未提交的修改(规则手册禁止)。
2025-02-24 14:39:32
334
原创 关于VO、BO、DTO、PO、Entity、DO的说法
在开发的过程中,我们不可避免的使用到了各种POJO类,一个优秀、整洁、易维护的代码,少不了对这些相似POJO类的区别,以下整理了多数POJO类后缀的定义与前端的交互类,一般在controller层,做为接口的入参接收类、出参返回类与数据库的表形成一一对应映射关系的类,有时候也会用Entity类来代替特点:只存储数据,不包含数据操作在服务间调用的类VO和PO类需要通过DTO类才能实现数据转化在服务内部使用的业务对象,在服务层中,由DTO转成BO然后进行业务处理后,转成DTO返回到接口层对于复杂的业务场景
2022-06-26 15:02:09
3387
原创 【踩坑】Mac安装Homebrew的时候报错误fatal: unable to access ‘https://github.com/Homebrew/brew/‘
1.问题Mac安装Homebrew的时候报错误fatal: unable to access ‘https://github.com/Homebrew/brew/’执行安装命令:/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"现象:zyp@zypdeMacBook-Pro ~ % /bin/bash -c "$(curl -fsSL https://ra
2022-04-08 18:17:34
5695
1
原创 MAC使用笔记
这里写目录标题1.前沿2. 快捷键大全1. 系统相关快捷键1. 浏览器相关快捷键3. 如何修改host文件1.前沿对于win转Mac的小伙伴来说,入手会卡住一会,会碰到以下常见问题:2. 快捷键大全https://wenku.baidu.com/view/a2a5f56ee75c3b3567ec102de2bd960590c6d9bf.html1. 系统相关快捷键复制:command+C粘贴:command+V快速复制文件(含CV):command+D1. 浏览器相关快捷键最小化窗
2022-04-08 17:15:39
581
原创 【八股文】MongoDB篇
目录MongDB是什么存储类型MongDB优缺点1. 优点2. 缺点相关语法SpringBoot和MongDB整合1. pom相关依赖2. 常见类1. Criteria类1. where方法2. Query类1. addCriteria方法2. with方法1. 题外话:Sort是什么类?3. MongoTemplate(核心)1. find方法1. entityClass2. collectionName3. List 返回MongDB是什么存储类型MongDB优缺点1. 优点2. 缺点相关
2022-03-17 17:29:38
3722
2
原创 【Redis篇】Redis的持久化机制RDB和AOF
目录Redis的持久化机制RDB和AOF1. RDB(全量备份)1. 实现方式(生成dump.rdb文件)1. save方式(阻塞、同步)1. 触发时机(配置文件里说了)2. besave方式(非阻塞、异步)1. 不懂就问:那besave具体是怎么操作的呢?2. 触发时机(正常退出redis)2. 优点(备份文件容量小、支持异步备份)1. dump.rdb文件小2. 启动快3. besave异步备份4. 适合全量备份3. 缺点(数据会丢失)1. 容易丢数据2. AOF(增量备份、日志)1. 追加日志的方式(
2022-03-15 10:49:38
1240
原创 【Redis篇】什么是缓存雪崩、缓存穿透、缓存击穿?如何解决?
什么是缓存雪崩、缓存穿透、缓存击穿?如何解决?1. 缓存雪崩1. 概念指在某一个时间段,缓存集中过期失效。所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。2. 本质原因大量key同时过期3. 解决方案1. 防止缓存集中失效过期时间+随机数:尽量让缓存失效的时间均匀分布,最次也得随机分布,尤其是一些访问大的接口。2. 保护数据库加锁或者队列:防止大量线程对数据库的一次性进行读写,避免缓存失效时
2022-03-15 10:46:31
2409
原创 【多线程】给三个字母a、l、i,采用多线程的方式打印alialialiali。。。
题目给三个字母a、l、i,采用多线程的方式打印alialialiali。。。思路1. 使用ReetrankLock和Conditionhttps://www.cnblogs.com/maydow/p/4780780.html
2022-03-14 00:51:36
1465
原创 【Redis篇】Redis为什么这么快?Redis6.0之后变成多线程了?
1. Redis为什么这么快1. 完全基于内存绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中2. 数据结构简单对数据操作也简单,Redis中的数据结构是专门进行设计的3. 采用单线程(不用CPU上下文切换、不用锁操作)避免了CPU的上下文切换、资源竞争问题,不存在加锁释放锁操作,也没有死锁4. 使用多路I/O复用模型(重要)非阻塞IO(理解为监控室,忘了再百度以下)1. 涉及的系统调用函数有哪些select、poll、epoll等,这些函数都可以同时监视多个描述符的读写就绪状况
2022-03-12 16:18:16
2823
原创 【Redis篇】如何保证缓存和数据库的一致性?
目录如何保证缓存和数据库的一致性?1. 先删除缓存,后更新数据库1. 存在的问题2. 结果2. 先更新数据库,后删除缓存(感觉用这个方法没啥问题的)1. 存在的问题2. 结果3. 缓存延时双删:实现最终一致性1. 问:延迟多久怎么判断如何保证缓存和数据库的一致性?知识点:对缓存的操作一般都是删除而不是更新操作按照操作顺序可以分为以下几种:1. 先删除缓存,后更新数据库1. 存在的问题A请求删除缓存后,还未更新数据库的时候,突然!B请求来了(一次查询操作),查缓存发现没数据,就去数据库查询,B
2022-03-11 09:35:15
718
转载 【分布式篇】怎么处理微服务之间的链路追踪?traceId和大数据日志采集的实现原理?
怎么处理微服务之间的链路追踪?traceId和大数据日志采集的实现原理1. 什么是链路追踪?分布式链路追踪就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。2. 链路追踪的作用1. 故障快速定位可以通过调用链结合业务日志快速定位错误信息2. 链路性能可视化各个阶段链路耗时、服务依赖关系可以通过可视化界面展现出来3. 链路分析通过分析链路耗时、服务依赖关系可以得到用户的行为路径,汇总分析应用在
2022-03-09 22:09:15
815
原创 【Spring篇】Spring是如何解决循环依赖的?Bean的一、二、三级缓存是什么?
Spring是如何解决循环依赖的1. 解决方案(setter注入)用setter方法注入(非构造方法注入),且对于单例模式下的Bean注意:如果是构造器注入引起的循环依赖,直接启动不了,无解2. 关键词Bean的生命周期(实例化和属性赋值分开)、ObjectFactory、三级缓存2. Spring解决循环依赖的过程1. 现象ClassA引用ClassB,ClassB中又引用了ClassA。2. 解决步骤A的实例化,Spring选择合适的构造器实例化A,并把A的ObjectFa
2022-03-08 23:31:58
894
原创 【Mysql】什么是死锁?如何避免死锁
死锁1. 什么是死锁(争抢资源、互相等待)多线程因为争抢资源而出现的互相等待的状态2. 死锁产生的四个必要条件1. 互斥当资源被一个线程使用(占有)时,别的线程不能使用(如:张三拿到了苹果,李四就不能拿苹果了)2. 不可抢占资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放(如:李四不能从张三手里抢苹果,只能等张三主动放弃苹果)3. 请求和保持当资源请求者在请求其他的资源的同时保持对原有资源的占有(如:张三拿到了苹果,他还可以去那香蕉,并不冲突)4. 循环等待存在
2022-03-08 23:28:48
1690
原创 【Mysql篇】Mysql的隔离级别,以及存在的并发事务问题
目录Mysql的隔离级别,以及存在的并发事务问题1. 数据库在并发情况下的常见操作1. 读-读2. 读-写3. 写-写2. Mysql的隔离级别以及解决的问题1. READ-UNCOMMITTED(读未提交)2. READ-COMMITTED(读已提交)3. REPEATABLE-READ(可重复读,默认隔离级别)4. SERIALIZABLE(串行化)3. 问:不可重复读和幻读的区别是什么?Mysql的隔离级别,以及存在的并发事务问题1. 数据库在并发情况下的常见操作1. 读-读不存在任何问题,也
2022-03-08 23:27:25
1150
原创 【多线程】cpu密集型和IO密集型是什么
cpu密集型和IO密集型是什么是任务、方法的类型1. cpu密集型(计算密集型、cpu高了)处理运算时间比较长,系统运行的大部分状况是CPU Loading 100%,不太需要访问I/O设备1. 例如计算圆周率、对视频进行高清解码2. 要注意什么尽量避免CPU的切换,任务同时进行的数量 = CPU的核心数1. IO密集型IO的速度远远低于CPU和内存的速度,cpu性能好,处理运算时间比较短,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作1. 例如Web应用2. 要注意什
2022-03-08 14:59:02
1332
原创 【多线程篇】sleep和wait的区别?notify和notify的作用?如何实现生产者-消费者模式
目录sleep和wait的区别?1. sleep方法(休眠)1. 源码分析2. 作用3. 题外话:sleep之后线程会释放锁吗4. sleep的使用场景2. wait方法(等待)1. 源码分析1. 作用2. 使用场景3. notify1. notify的作用2. 为什么要使用notify、notifyAll?3. 应用场景4. 如何使用wait和notifyAll实现生产者-消费者模式1. 注意事项1. 题外话:为什么wait和notify方法要在synchronized方法里使用?2. 实现1. 生产者1
2022-03-07 09:56:33
2674
1
原创 【多线程篇】如何停止一个线程?stop和interrupt有什么区别?interrupted和isInterrupted的区别?
目录如何停止一个线程?1. 使用return(退出标志)2. 使用thread.stop方法(弃用)3. 使用thread.interrupt方法(推荐)1. 题外话:如何查看一个线程停止状态1. Thread.interrupted(会清除标志位)2. thread.isInterrupted(不会清除标志位)3. native修饰的isInterrupted方法(是前两个方法的本质,单独拿出来好了)2. 题外话:interrupted和isInterrupted的异同点?1. 相同点2. 不同点3. 题
2022-03-07 09:54:18
939
原创 【Mysql篇】mybatis通过jdk动态代理的原理
mybatis通过jdk动态代理的原理关键字:MapperRegistry .getMapper、mapperProxyFactory.newInstance、MapperProxy、InvocationHandler使用Configuration的getMapper方法时,会调用mapperRegistry.getMapper方法,public class MapperRegistry { private final Configuration config; private fin
2022-03-06 23:49:22
748
转载 【Mysql篇】Mysql中三大日志binlog、redolog、undolog
Mysql中的binlog、redolog、undologMysql执行器在执行更新相关的语句时候,会记录日志1. binlog 二进制日志binlog是Mysql自带的日志模块(叫什么归档日志),所有引擎都可以使用1. 发生时机(commit之前)MySQL数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性图片来源:JavaGuide链接 MySQL三大日志(binlog、redo log和undo log)2. redolog 事务日志
2022-03-06 17:44:23
342
原创 【Mysql篇】索引是什么?索引的底层模型是什么?索引失效场景以及失效的原理
目录索引1. 索引是什么2. 索引的优点(加快查询效率)3. 索引的缺点(占用空间、更新变慢)4. 索引的类型1. hash2. 平衡二叉树AVL1. 定义2. 问题3. B树1. 定义2. 特点3. B+树(mysql索引推荐的存储结构)1. 定义2. 特点5. 索引的种类1. 聚集索引(如主键索引、唯一的隐式非空索引)1. 定义(数据和索引放到一起)2. 非聚集索引(数据和索引分开)3. 联合索引6. 什么时候需要创建索引7. 什么时候不需要创建索引8. 哪些情况会不走索引9. 主键和索引的区别10.
2022-03-06 17:41:29
1339
原创 【Mysql篇】什么是MVCC?什么是快照读?版本链?什么是readView?MVCC如何实现事务的隔离性?
这里写目录标题什么是MVCC(多版本并发控制)题外话:当前读和快照读1. 当前读(行锁 + 间隙锁)2. 快照读(mvcc + undolog)1. 定义(Mutli Version Concurreny Control)2. MVCC的组成要素1. 每条记录有三个隐藏列1. 事务ID(trx_id)2. 回滚指针(roll_pointer)3. 隐藏主键(row_id)2. undolog日志1. 分类1. insert undo_log(insert操作,给自己事务看的)2. update undo_l
2022-03-05 12:39:11
2149
1
原创 【算法】电话号码的字母组合(回溯解决)
题目思路对于这种无法用有限个for循环写出来的代码,我们采用回溯的方法,穷举代码实现public class Test07 { public static void main(String[] args) { Test07 test07 = new Test07(); List<String> res = test07.getRes("234"); System.out.println(res); }
2022-03-04 22:18:28
218
原创 【算法】合并两个有序链表
题目题目链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/思路双指针、虚拟头代码实现/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; }
2022-03-03 16:27:51
147
原创 【Java基础篇】什么是fail-fast机制?什么是ConcurrentModificationException异常?并发修改异常?
目录什么是fail-fast机制?1. 什么是fail-fast机制(ConcurrentModificationException什么时候会抛出)2. 什么时候会触发fail-fast机制1. 题外话:List如何在遍历时删除元素?1. 使用Iterator方法中的remove操作2. 倒序遍历什么是fail-fast机制?1. 什么是fail-fast机制(ConcurrentModificationException什么时候会抛出)日常吐槽:换个问题吧兄dei,你不如问问什么时候会抛出Conc
2022-03-02 14:21:14
262
原创 【MQ篇】RocketMQ如何消息队列保证高可用
目录RocketMQ如何消息队列保证高可用(集群)1. 以RocketMQ为例1. 几个概念1. Topic消息类型(大类)2. Queue队列(明细类)3. 消费者组2. RocketMQ消息的存储结构(ConsumeQueue + CommitLog)1. ConsumeQueue 逻辑队列(类似索引,指向真的文件CommitLog)2. CommitLog (提交日志?这名字也太怪了)刷盘后存在磁盘上的文件3. 实现高可用的思路(多个Broker)4. NameServer(类似于注册中心,管理Bro
2022-03-01 21:59:35
1459
原创 【MQ篇】RocketMQ如何保证消息的顺序性
目录1. RocketMQ如何保证消息的顺序性1. 为什么会出现乱序(负载均衡)2. 例子3. 如何解决1. 保证Producer、Queue、Comsumer是一对一对一的关系1. 缺点1. 吞吐量降低2. 有阻塞的风险2. 把需要保持顺序消费的消息放到同一个Queue中,且让同一台机子处理1. 存在的问题3. 使用有序消费的模式1. RocketMQ如何保证消息的顺序性1. 为什么会出现乱序(负载均衡)Broker中的每个Topic都有多个Queue,写入消息的时候会平均分配(负载均衡机制,默认
2022-03-01 21:56:28
5743
1
原创 【Mysql篇】什么是MVCC?多版本并发控制
目录1. 什么是MVCC(多版本并发控制)1. 定义(Mutli Version Concurreny Control)2. MVCC的组成要素1. 每条记录有三个隐藏列1. 事务ID(DB_TRX_ID)2. 回滚指针(DB_ROLL_PTR)3. 隐藏主键(DB_ROW_ID)2. undo_log日志3. read-view(读视图)1.什么时候生成Read-View?3. MVCC实现原理4. 例子5. MVCC主要有什么作用1. 非阻塞的并发读写2. 实现读已提交和可重复读1. 问:MVCC如何实
2022-03-01 17:19:26
913
原创 【Redis篇】什么是布隆过滤器?
目录1. 定义2. 构造方法3. 相关概念1. hash算法2. 容器大小3. 误判率2. 作用(类似containKey的功能)3. 原理1. 定义一个很大的bitmap2. 构造方法 private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size,0.01);3. 相关概念1. hash算法一般都是哈希取余运算吧,将数据库中查出来的数据都塞到这
2022-03-01 00:14:25
325
原创 如何使用xxl-job,如何使用xxl-job实现
1. 同步对外统一的接口public class SyncController { @Autowired // 注入ApplicationContext的Bean工厂类 private ApplicationContext applicationContext; /** * * @param jobName * @param executeParam * @return * @throws Exception
2022-02-28 15:46:04
1629
原创 【问题总结】用Stream流将List转为Map的时候,出现Duplicate key错误,怎么办?
目录1. 场景还原1. 伪代码2. 控制台现象2. 错误做法3. 正确做法1. 场景还原1. 伪代码public static void main(String[] args) { ArrayList<User2> list = new ArrayList<>(); list.add(new User2(1, "2")); list.add(new User2(1, "3")); list.add(new Use
2022-02-28 13:39:29
1683
原创 【算法】01背包模型
目录题目01背包相关要素1. 背包2. 对于物品i思路1. dp数组模型2. 递推公式(难点):3. dp数组初始化值:dp[i][0] dp[0][j]1. dp[i][0] = 02. dp[0][j]4. 确定遍历顺序:2个维度:物品和背包容量逻辑图代码实现题目有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。01背包相关要素背包容量w、物品体积weight[i]、物体
2022-02-27 19:28:22
804
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人