Zsh Blog

只想安安静静写代码

MIT 6.830 实现简易数据库 lab2

exercise 1 实现Filter和Join的操作,对应sql的where和join语法,所有的Operator都需要遍历,因此都需要实现迭代器逻辑,可以参考Project和OrderBy 字段类型,实验1需要实现 src/java/simpledb/execution/Predicate.java src/java/simpledb/execution/JoinPredica...

MIT 6.830 实现简易数据库 lab1

前言 最近在学习CMU-15-445数据库课程,想着能跟着课程实现一个简易数据库。但是CMU课程附带的Project是用c++写的,而我单纯只想学习数据库,不想为了写Project 去学c++。正好发现MIT-6.830内容跟CMU的课程内容很相近,同时附带的Project是用java实现的,于是就决定看CMU-15-445课程,同时实现MIT-6.830,同时 在这里记录一下MIT6.83...

Ubuntu安装Docker教程

最近经常需要在云服务器上安装Docker,在安装过程中出现不少问题,遂记录下来供自己以及有需要的朋友查阅。 本教程适用于Ubuntu 18.04 Ubuntu 20.04 Ubuntu 22.04 安装新版之前卸载旧版本 1 2 sudo apt-get remove docker docker-engine docker.io containerd runc sudo rm...

Gradle7多模块项目配置

最近自己的项目全部使用Gradle构建,但是在使用的过程中踩了不少坑,因此打算把遇到的坑全部记录下来,方便自己回顾的同时,也能帮助其他人。 这篇文章主要记录如何使用Gradle配置多模块项目。因为自己的项目采用微服务架构,因此每个服务除了本身业务逻辑模块,还会有对外提供的api模块,于是我把它们拆成了2个模块 api和service。 在根目录下的build.gradle的内容如下 1 ...

Protobuf结合gradle最佳实践

最近打算实践一下Spring Cloud微服务,完整做一个系统。此次打算全部服务采用Gradle构建,微服务之间通信协议采用Protobuf,因此在系统架构上有2种方案 微服务自己定义message,需要对外提供api的进行单独打包并发布 所有message定义在独立的项目中打包并发布,所有微服务引用该jar包 经过一番考虑后选择了第2种,使用这种方案在每个微服务中可以不需要...

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...