技术笔记
工程实践、系统设计、编程语言和技术原理的长期笔记。
-
怎样写线程安全的代码
前言 多线程编程是软件开发中最棘手的问题之一。无论什么时候用多线程来操作同一份数据,都会出现并发问题。这就让写线程安全的代码成为一件非常困难的事情。本文将会从并发问题的本质出发,带你了解问题的根源,然后通过实例阐述保证线程安全的难点在哪里,最后提供常见的并发控制技术的原理和例子,希望能够帮助读者更好...
-
MAB 问题的解法与应用(万字长文)
目录 MAB 问题 MAB 是多臂老虎机(Multi Armed Bandit)的缩写,MAB 问题就是假设有个赌徒到赌场里面摇老虎机,赌场里面有 10 个老虎机,每个老虎机的赢钱概率是不一样的,此时他不知道每个老虎机的赢钱概率,而且他只有 100 个币,也就是说只能摇 100 次,如果他想最大化收益应该怎么摇?...
-
50 行代码实现一个 KV 数据库
最简单的 KV 数据库需要多少行代码实现?答案是不到 50 行。接下来我会带你实现一个基于日志顺序写入的数据库,它的功能很简单,支持写入和查询字符串类型的 key 和 value。一个 KV 数据库最重要的是存储实现,因为它的查询语法很简单,根据 key 查询 value 就行,不像关系型数据库还需要实现解析器和优化器来...
-
从零开始写 KV 数据库:基于哈希索引
前言 新的 KV 数据库层出不穷,我们经常听说的 KV 数据库如 RocksDb、Hbase 等都是基于日志结构的存储引擎。最近我在看《数据密集型应用系统设计》,里面有一章专门在讲日志结构的存储引擎的演进过程,纯看理论不过瘾,所以我决定根据书里的理论动手自己实现一个 KV 数据库。同时,为了能顺便学习 Rust,所以...
-
Java 类隔离加载的正确姿势
什么是类隔离技术 只要你 Java 代码写的足够多,就一定出现这种情况:系统新引入了一个中间件的 jar 包,编译的时候一切正常,一运行就报错:java.lang.NoSuchMethodError,然后就哼哧哼哧的开始谷歌找解决方法,最后在几百个依赖包里面找的眼睛都快瞎了才找到冲突的 jar,把问...
-
Java 日志框架冲突问题排查与总结
Java 日志框架冲突问题排查与总结 前言 Java 有很多的日志框架可以选择,当同一个项目中出现多种日志框架时就很容易出现日志框架冲突的问题,导致日志打印不出来。本文将以一次典型的日志冲突排查问题为例,提供排查步骤和思路,最后分析日志框架冲突的原因。 一般行文思路都是先讲 Why,再讲 How,这...
-
多视角看区块链
前言 像很多新技术一样,区块链开始火起来的时候评价是两级分化的,有人觉得区块链会成为下一代的互联网的基础设施,有人觉得区块链没有任何价值。很多时候观点的不同是因为看的角度不一样,如果能从多个角度看区块链,或许能得到更客观的观点,因此本文会分别从技术和业务的视角来分析区块链。 从技术的视角看区块链 从...
-
分布式系统:一致性协议
一致性模型本质上是进程与数据存储的约定,通过一致性模型我们可以理解和推理在分布式系统中数据复制需要考虑的问题和基本假设。那么,一致性模型的具体实现有一些呢?本文会介绍一致性协议实现的主要思想和方法。 什么是一致性协议 一致性协议描述了特定一致性模型的实际实现。一致性模型就像是接口,而一致性协议就像...
-
分布式系统:Lamport 逻辑时钟
分布式系统解决了传统单体架构的单点问题和性能容量问题,另一方面也带来了很多的问题,其中一个问题就是多节点的时间同步问题:不同机器上的物理时钟难以同步,导致无法区分在分布式系统中多个节点的事件时序。1978 年 Lamport 在《Time, Clocks and the Ordering of Event...
-
分布式系统:向量时钟
在上一篇文章分布式系统:Lamport 逻辑时钟中我们知道 Lamport 逻辑时钟帮助我们得到了分布式系统中的事件全序关系,但是对于同时发生的关系却不能很好的描述,导致无法描述事件的因果关系。向量时钟是在 Lamport 时间戳基础上演进的另一种逻辑时钟方法,它通过向量结构不但记录本节点的 Lamp...