
简介
该用户还未填写简介
擅长的技术栈
可提供的服务
暂无可提供的服务
很多人记住了一句话:Redis List 底层是链表。但真正理解 Redis 的人,会知道这只是历史。LinkedList↓ZipList↓QuickList↓每一次升级,都不是推倒重来。内存占用、CPU Cache、插入效率、遍历性能之间的最佳平衡。这也是 Redis 能一直保持高性能的重要原因。《Redis String 为什么不是 String?SDS 到底解决了什么问题?《Redis 为什

很多人第一次学习 Redis,只记住了一句话:ZSet 底层使用跳表。Redis 为什么没有选择红黑树?答案就在于 Redis 一直坚持的设计思想。它追求的,从来不是理论上最完美的数据结构,而是在性能、实现复杂度和维护成本之间,找到一个最合适的平衡点。跳表的时间复杂度和红黑树几乎一致,实现却简单得多,范围查询也更加友好,因此最终成为 Redis ZSet 的选择。对于 Redis 来说,这不是一次

不是:Map不是:Bean仓库甚至也不是:BeanFactory它真正本质是:对象管理中心,或者对象操作系统因为:它做的不只是,创建对象而是:定义↓创建↓装配↓增强↓生命周期管理↓销毁这才是:Spring 容器真正干的事持续拆 Spring、MySQL、Redis 底层原理,复盘真实线上问题。一起把“会用”变成“看懂”。下一篇:Bean 为什么需要生命周期?90%的人只会背流程感兴趣可以关注,避免

这样写有什么问题?对象不是创建出来了吗?代码不是也能跑吗?很多文章会告诉你:“这是为了降低耦合”但其实:这个解释太浅了因为:即使你自己 new,照样也可以通过接口解耦。

不是:Map不是:Bean仓库甚至也不是:BeanFactory它真正本质是:对象管理中心,或者对象操作系统因为:它做的不只是,创建对象而是:定义↓创建↓装配↓增强↓生命周期管理↓销毁这才是:Spring 容器真正干的事持续拆 Spring、MySQL、Redis 底层原理,复盘真实线上问题。一起把“会用”变成“看懂”。下一篇:Bean 为什么需要生命周期?90%的人只会背流程感兴趣可以关注,避免

所以:@Autowired 并不神秘?Spring 不可能提前写:new UserService(),因为它不知道以后会有什么。也就是:Class,Spring 世界里:很多时候拿着的不是对象,而是:Class。上一篇我们说:Spring 大量黑科技来自:BeanPostProcessor。但处理之前,要先知道:Bean 上有哪些字段、有哪些方法、有哪些注解。因为 Spring 根本不知道你以后会

发生异常↓事务回滚发生异常↓事务拦截器收到异常↓满足回滚规则↓事务回滚try-catch吃掉异常不满足rollbackFor规则ErrorrollbackFor指定异常异常↓↓↓满足规则↓rollback最后留个问题。下面代码会回滚吗?b();很多人觉得一定回滚。这又是为什么?下一篇:《为什么会有循环依赖?Spring 为什么允许两个 Bean 互相引用?

所谓循环依赖。A 依赖 BB 依赖 A形成一个闭环。@Service@Autowired@Service@Autowired这种情况就属于循环依赖。很多人觉得:这是代码写错了。实际上在大型项目里非常常见。因为业务之间本来就存在关联。用户查订单。订单查用户。写着写着就形成了依赖闭环。今天我们没有讲三级缓存。而是先定位问题。通过源码可以看到:当 A 创建过程中需要 B。B 创建过程中又需要 A。循环依

扫描 Controller↓解析 @RequestMapping↓生成 RequestMappingInfo↓注册到 MappingRegistry请求到达↓↓↓找到 HandlerMethod↓↓执行 Controller 方法↓返回结果所以:@RequestMapping 并不是收到请求时才解析。而是在 Spring 启动时就已经解析完成,并建立好了 URL 和方法的映射关系。请求来了以后,本

执行时才去找 SQL。实际上不是。启动阶段。MyBatis 已经把所有 SQL 解析完成。保存起来。Mapper接口↓方法名↓生成 statementId↓找到 MappedStatement↓执行 SQL所以:MyBatis 之所以知道该执行哪条 SQL,本质上是因为启动时已经建立好了 Mapper 方法与 MappedStatement 的映射关系。上一篇:《Mapper 接口为什么没有实现类








