Zsh Blog

只想安安静静写代码

Kotlin实现Rust风格的Result

前段时间看到rust的错误处理方式,觉得十分优雅,于是就想能不能用Kotlin模仿一个版本。先看原版 1 2 3 4 5 6 7 8 9 10 11 12 use std::fs::File; fn main() { let f = File::open("hello.txt"); let f = match f { Ok(file) => file...

关于双写缓存一致性的思考

缓存数据库双写一致性一直是面试的一个高频问题,网上关于这个问题的文章也非常多,大家的观点都不一致。这几天在看了十几篇文章后,再加上一些自己的思考,决定写下来供大家一起讨论。 双写缓存一致性通常指的是1份数据要往缓存(Redis)和数据库(MySQL)里写,本质就是2个写的操作不是原子性的。因此我们可以从下面2个角度去思考 在无法达到原子性的前提下,哪一步操作失败危害最低?在高并发下的...

Spring源码(3) Bean实例的获取与创建

本篇是BeanFactory的最后一篇,剖析getBean()的原理 类概括 BeanFactory: Bean工厂最基础的接口 BeanDefinitionReader: 从资源文件中读取BeanDefinition BeanDefinition: Bean的基层接口,表示一个Bean的定义 BeanDefinitionHolder: 持有BeanDefinition的同...

MySQL事务和锁实战

网上关于事务和锁的理论知识文章非常丰富,但是每次看完总是很容易忘记,死记硬背也没什么意义,还不如实际操作一次,让自己印象更深刻。 此次实验准备了一张非常简单的表,数据库版本为5.7.x 1 2 3 4 5 create table user ( id int, name varchar(255) ) 首先从RC隔离级别开始,在RC级别下是只能读取到其他事务提交后的数据。 ...

Spring源码(2) BeanFactory的创建

上一篇讲完了setConfigLocation(),下面就要开始解析最重要的refresh() 类概括 BeanFactory: Bean工厂最基础的接口 BeanPostProcessor: Bean自定义处理接口,实现该接口的类可以在Bean实例初始化前后对实例做一些自定义修改 BeanDefinitionReader: 从资源文件中读取BeanDefinition X...

Spring源码(1) 从ClassPathXmlApplicationContext开始

该系列将会非常详细地带大家阅读Spring的重要源码部分,在开始之前先简单概括一下接下来出现的类的大概作用 ApplicationContext: 应用上下文基础接口,具备加载资源文件,获取应用内组件(Bean),监听事件,国际化的功能 AbstractApplicationContext: 对ApplicationContext做了一些最基本的实现,包括最重要的refresh()...

手写基于编译期的建造者模式实体类生成器

今天我们来聊聊建造者模式,对于建造者模式的理论和一些描述代码网上已经有非常多的文章了,在这里也就不重复赘述了,所以今天来聊聊不一样的。 Lombok想必大家都听说过,就是通过注解,在编译期间修改语法树,最后javac再将修改后的语法树编译成class文件。 Lombok有一个@Builder注解,其作用是为添加了该注解的类生成建造者模式的api,例如有以下类 1 2 3 4 5 @Build...

SpringBoot配置elasticsearch rest template

最近项目中用到了Elasticsearch,需要在SpringBoot项目上配置,网上找了一圈发现都是使用ElasticsearchTemplate操作,官方最新的推荐是使用 ElasticsearchRestTemplate,基于HTTP协议与es交互。于是各种查资料,踩坑,在这里把一步步配置的过程记录一下。 首先创建一个SpringBoot项目,添加最基本的依赖和es的依赖(Sp...

layui文件上传进度条踩踩坑记

最近手里一个项目用到了layui,遇到了一个需求,上传文件的时候需要显示进度条,但是layui的上传模块没有提供进度条回调,于是谷歌了一圈,发现一个大神魔改 了layui的upload.js,加上了进度条回调功能 访问原文,可惜原文的代码是不能直接复制使用的,于是我又找了一篇 踩坑帖子 访问原文,这篇文章修复了很多错误,可以使用魔改的upload.js上传文件了 (之前文章的写法连上传都会报...

Jar包内资源复制问题

最近一直在做自己的代码生成器项目,遇到一个需求,需要把resources文件夹下的某些文件夹按照原本的文件结构,复制到Jar包外的另一处位置。 一开始在IDEA里开发觉得很简单,就一句FileUtils.copyDirectory(src, dest)就万事了,IDEA运行也很顺利,文件都按照预想的复制过去了,然后我准备打包部署到服务器上试一下, 这一试就试出问题了,直接抛了异常如下 cla...