- 博客(94)
- 收藏
- 关注
原创 学习 Go 语言 1 — 基础语法
文章目录一、第一个 Go 程序二、基本程序结构2.1 变量与常量2.2 数据类型2.3 运算符2.4 条件和循环三、常用数据结构3.1 数组3.2 切片3.3 集合3.4 字符串一、第一个 Go 程序最近在闲来无事之际开始学习点 Go 语言,Go 语言在近几年很火,有 Docker 和 Kubernetes 这两大杀器做支撑,它已经是云计算领域主流的编程语言了,并且有蚕食部分 C、C++、Java 等领域的趋势,怀着一些对新技术的兴趣,我开始学习了 Go 语言,在对其有了简单的了解之后,我渐渐开始喜欢上
2020-09-05 21:18:22 569
原创 经典排序算法分析
排序指的是将一组对象按照特定的逻辑顺序重新排列的过程,排序的应用十分广泛,可以说是无处不在,它在商业数据处理和现代科学计算中发挥着举足轻重的作用,目前已知的应用最广泛的排序算法—快速排序,更是被誉为了 20 世纪科学和工程领域的十大算法之一。排序算法有很多,有比较常见的有比如插入排序、归并排序、快速排序,就是我接下来会讲解的这几种;也有一些非常冷门的排序算法,有一些可能你连名字都没听过,例如鸡尾酒排序、侏儒排序、图书馆排序、耐心排序、臭皮匠排序等等……这篇文章的篇幅较长,涉及到大量图例、证明、代码示例,
2020-06-06 11:30:55 539
原创 字符串匹配之 BM 算法
一、基本概念字符串匹配是计算机科学领域中最古老、研究最广泛的问题之一,层出不穷的前辈们也总结了非常多经典的优秀算法,例如 BF 算法、RK 算法、BM 算法、KMP 算法,今天我介绍的主角是 BM 算法。字符串匹配可以简单概括为前缀匹配,后缀匹配,子串匹配,下面的讲解我都以最常见的子串匹配为例。子串匹配的概念很简单,一句话解释就是:在一个字符串 A 中寻找另一个字符串 B,这里的字符串 A 可...
2020-04-19 17:23:29 910 1
原创 Mysql 索引模型 B+ 树详解
一、认识二叉树首先,在了解 mysql 中的 B+ 树之前,我们需要搞懂什么是二叉树。二叉树是一种常见的非线形数据结构,数据是以一对多的形态组织起来的,我画了一张图来帮助你理解:在二叉树中,有一种比较特殊的,也是最常用的二叉树,那就是二叉搜索树,也叫做二叉查找树。它最大的特点是:对于树中的任意一个节点,假如节点值为 x,其左子树节点的值必须小于 x,其右子树节点的值必须大于 x,就像下图的这...
2020-03-29 10:44:55 3348 4
原创 收藏!Linux 常用命令合集
收藏!Linux常用命令合集1. 帮助命令1.1 man 命令名称,man 的意思是 manual,即手册,对于大多数命令都可以使用这个命令来查看其使用的方法。1.2 help 命令名称 或者 命令名称 --help,可以查看命令的使用帮助。2. 目录操作2.1 pwd,查看当前所在的目录路径。2.2 ls 路径,查看指定路径下的文件列表,可以加上多个路径,例如:ls /usr /e...
2020-03-07 14:34:59 9371 3
原创 最近职场中的两点感悟与思考
两年前我进入数据库内核开发的时候,刚开始确实有点痛苦,感觉非常的困难,哪哪都不熟悉,对数据库的整体模块、架构,一些设计细节都感觉非常模糊,尽管有一些 KV 数据库的经验,但是总体来说还是太少了,不足以应对数据库这么庞杂的系统。大多数人的状态,其实都是埋头默默做自己的事情,稍微好点的,能够在遇到问题的时候和别人讨论,然后有进展就反馈,中规中矩的去完成自己的目标,我目前的状态大概也是这样。当然,能力越大,责任越大,反过来是一样的,想要承担更多的责任,必须要有对应的能力。
2024-09-27 23:44:46 432
原创 rose 聊开源—2 如何快速上手一个开源项目
首先,面对一个开源项目,其实最基础的问题,就是搞懂这个项目的基本背景,就是这个项目是基于什么契机建立的,比如是为了解决什么实际的问题,或者是对某个系统进行优化,或者是使用新的语言进行重写等等。其实一般做的比较规范的项目,都会有这部分内容,会在项目的 README 文档中,说明上手项目的整体流程,以及如何参与到社区当中等等。比如针对一个数据库项目,或者存储引擎的项目,其实最基础的流程就是,建立表,并且向表中插入数据,然后能够从表中读取数据,这是一个最基础的步骤。这个理论背景的基础之上,我们需要动手实践起来。
2024-09-11 21:14:54 436
原创 毕业五年后的感受与迷茫
当然还有比如说对于我们程序员群体来说,可能并没有什么丰富的业余活动,社交的圈子也比较窄,如果又是一个比较内向的人的话,可能有的时候在这样一个大城市当中,会觉得非常的孤独,就是没有什么知心的朋友。对于我们普通人来说,在没有其他外力的加持下,很难在这样的大城市立足,当然你可能有了亲朋好友的一些帮助,然后拼了命,在北京上海的这样大城市付了个首付,但是你可能要背负很长时间的一个房贷的压力。对于一些真实的线上的项目环境并不是特别的了解,也花了比较长时间才慢慢的去适应工作的节奏。
2024-08-26 21:53:55 925
原创 简历上写什么项目,校招能拿到 30w 的 offer
在大环境不好,就业糟糕的情况下,其实我们唯一能做的,就是不断提升自己的能力,去做别人做不到的事情,这样才能够和别人拉开差距,凸显自己的优势。去年开始,陆续有很多同学开始学习我的课程,半年多的时间过去了,他们从中收获很多,最近这段时间捷报频传,都凭借项目丰富了自己的项目经历,提升了自己的技术能力,在面试中也是披荆斩棘。其实,静下心来做好一件事,就已经能够超越很多人了,只要努力,结果也一定不会太差。
2024-08-12 16:39:31 284
原创 Postgres 源码学习 6—FDW 剖析
例如,扫描外部表相关接口定义了如何扫描外部表,常见的操作包括开始扫描( BeginForeignScan,主要进行准备工作)、执行扫描(IterateForeign Scan,从扫描中获取数据)、重新扫描(RescanForeignScan)以及结束扫描(EndForeignScan)等。在这个阶段,主要是定义了一些外部扫描的接口,并调用 FdwRoutine 中用户自定义的接口,从而进行扫描前的准备。前文提到了 FdwRoutine 主要负责定义外部数据扫描的接口,接口需要自定义实现外部扫描的方法。
2024-08-07 22:37:20 1202
原创 毕业五年,学习新的编程语言给我带来了什么
我在刚入职不久之后,因为工作上的需要,维护的一个组件是使用 Rust 编写的,所以我就开始了学习 Rust,这次学习带给我的收获便是,让我第一次真正的接触到了数据库内核,了解到了它的复杂与困难,当然也从中得到了很多的锻炼。这期间的学习,带给我的收获,不仅仅是让我对数据库有了更多的了解,更深的认知,而且在技术方面也有了更多的积累,让我在工作之中处理一些难题的时候,会更加的从容不迫。,在大学自学期间,我选择的是当时工作就业机会最多的 Java,这次自学,带给我最大的收获就是给了我一份工作。
2024-07-20 18:40:05 931
原创 Postgres 源码学习 5—FSM 空闲空间映射
因为数据文件 page 的组织是无序的,元组的插入也是无序的,所以如果依次遍历查找满足条件的 page,可能会非常的低效,Postgres 中使用 FSM(Free Space Map) 来进行查找,加速找到适合插入的 page 的过程。所以 Postgres 中使用了堆这个数据结构来存储空闲空间的大小,堆的叶子节点对应的是 page 的空闲大小,堆顶元素是最大的元素,当查找是,从堆顶元素进入,依次和其子节点进行对比,一直到达叶子节点。解决了空闲空间占用的问题,接下来就是空闲空间的数据如何组织的问题。
2024-06-30 16:50:11 457
原创 近期对 wal 组件的性能提升
之前对整个 wal 文件进行遍历的时候,如果 value 比较小,那么会多次重复读取 value 所属的 block,这样的话效率比较低,而且是完全没必要的。优化之后的效果还是比较明显的,在我的机器上,遍历 1.8G 的数据,花了 5 s 左右,之前是 20s,遍历读取的性能提升在 4-5 倍左右。带来的一个好处便是,rosedb 的启动速度会得到提升,因为 rosedb 在启动的时候,会加载所有的 wal 文件进行索引的构建。之前的策略是加上了一个 block cache 来缓解这个问题。
2024-06-15 15:39:04 339
原创 rose 聊开源—1 你为什么需要一个开源项目
我自己从最开始开源 rosedb/lotusdb,以及一些其他组件,折腾开源也有很多年了,这次想写一个关于开源项目的系列,结合我自己的实际经历,讲讲开源项目的开发、参与、维护、流程规范、收获、盈利等内容,希望这个系列对大家有所帮助。通过开发项目解决实际问题,并且在开源维护的过程当中,阅读别人的代码,能够见识到不同的人的代码,以及编码风格,可以从别人写的好的地方去学习。说回我自己,我上一次找工作的时候,实际上我的开源项目对我的帮助非常大,在面试的过程当中,给了我很多的信心,并且也证明了自己的能力。
2024-06-05 23:02:31 1017
原创 Postgres 源码学习 3—Postgres 存储管理器
前面一节说到,在 Postgres 的 VFD 机制之上,我们可以避开打开文件数量的系统限制,通过 VFD 可以进行打开、读写、关闭、删除文件等操作,简单来说就是 VFD 为我们提供了一个抽象,屏蔽了操作系统文件描述符的接口,后续我们对文件的 open、close,以及 CRUD 操作都在 VFD 的基础之上。注意这里写入之后,并不会等待操作系统刷盘之后再返回,而是直接返回,将刷盘的请求交给了 checkpointer 进程,由此来提高数据写入的效率,而数据的崩溃恢复、一致性,是通过 WAL 来保证的。
2024-05-26 16:24:54 459
原创 推荐一本手写数据库的书籍
最近有很多同学,给我反馈,通过《从零实现 KV 存储》课程项目丰富了自己的简历,拿到了非常不错的 offer,在就业环境不佳的情况下,我们唯一能做的就是多学习充实自己,拉开和别人的差距!付费教程最大的好处是,可以和志同道合的朋友一起学习,互相监督,共同进步,并且我专门负责答疑,在学习的过程当中,有任何疑问都可以随时咨询,能够确保你能够完全学懂!第二部分,是在前面实现的 B+ 树 KV 存储引擎之上,去构建一个迷你的 SQL 数据库,当然支持的语法比较有限,只涉及到简单的一些 CRUD 的语法。
2024-05-22 18:48:36 520
原创 Rust 练手项目—实现 MVCC 多版本并发控制
MVCC 是建立在数据多版本的基础之上的,当写入一条数据的时候,会带上一个版本号,这个版本号一般是事务的唯一标识,修改数据的时候,不会直接原地去修改数据,而是新增一条新的数据,并且带上一个新的版本号。active_xid 是一个事务私有的数据结构,保存了在这个事务启动时,其他活跃的(未提交)事务集合,这是实现可重复读的关键,保证就算其他事务提交了,也不会影响到当前的事务。可以看到对数据的修改并不是原地的,而是新增加一个版本的数据,删除数据的时候,其实也不是真正的将其删除掉,而是通过标记的方式。
2024-05-10 23:06:02 812 2
原创 太优雅了!Rust 200 行代码实现表达式解析
它本质上是一种递归下降解析表达式的方法,通过递归地处理运算符和操作数来解析表达式,并根据运算符的优先级和结合性来确定表达式的计算顺序。表达式解析、计算是一种基本和常见的任务,例如最常见的算术表达式,计算的方法有很多,比如逆波兰表达式、LL、LR 算法等等。拿到 Token 之后,进入到了语法分析的阶段,需要根据每个表达式的含义,以及其优先级,计算对应的结果。确定了优先级的问题,第二个问题是结合性,运算符的结合性其实也是确定的,例如加法是左结合的,这意味着。
2024-04-29 19:29:59 362
原创 Postgres 源码学习 2—Postgres 的 VFD 机制
所以有非常大的概率超过单个进程打开文件数量的限制,为了解决这个问题,Postgres 设计了 VFD(虚拟文件描述符)机制,主要是将实际的操作系统文件描述符维护到一个 LRU 缓存中,通过切换打开的方式,规避了进程打开文件数量的限制。Postgres 中的 VFD,即虚拟文件描述符,主要是为了能够规避操作系统中最大打开文件数的限制,采用切换打开的方式,维护了一个链表,将最近打开的文件维护到链表头部,最久未使用的文件放置到链表尾部。
2024-04-17 16:35:42 1048
原创 Postgres 源码学习 1—Postgres 源码编译和 debug
编译安装之后,得到了二进制目录,可以将 bin 目录加入到 PATH 环境变量中,如果嫌麻烦,可以加入到 $HOME 目录中的 .bashrc 或者 .zshrc(取决于你的 sh 是什么),这样下次登录就不用重复设置了。如果你有其他的物理机,或者云服务器,都是可以的,Postgres 支持多种平台编译,如果你是非 Ubuntu 环境,可以自行查阅相关的资料进行编译安装,步骤都是大同小异的。的安装依赖,可能包含了一些没必要安装的,但肯定是涵盖了 Postgres 需要的依赖,所以全部安装上也没啥问题)。
2024-04-15 22:48:03 881
原创 后端开发和数据库内核开发最全总结,详细对比!
在工作机会方面,应该是后端开发要多于数据库内核开发岗位的,这其实比较明显,目前国内搞数据库的公司大大小小有两三百家,但有招聘需求的估计并不是很多,当然一些大厂有内部的自研数据库服务,所有也会有一些相关的招聘需求 ,比如字节、阿里、华为、腾讯等等。后端开发可能是需要面临如何应对年轻人的冲击,如何应对大家常说的 35 岁危机,并且面临日益严峻的就业环境,其实压力是非常大的,一方面不得不学习新的技术,拼了命去卷算法、八股文,但是在日常工作中可能又根本用不上,陷入面试造火箭工作拧螺丝的窘境。
2024-04-02 22:55:10 547
原创 细数自己学习过的编程语言,附学习建议
到了大三,为了能够毕业时找到工作,开始自学 Java,Java 当时还是非常火爆的,培训班、网上的资料铺天盖地的都是 Java 相关的,我那时候还学习了 Java Web,做了一个类似淘宝的商城项目,自己写了简单的前端,所以用到了 Html/CSS 、JavaScript。我最开始接触编程,是在大一的时候,学的是 C 语言,因为那个时候 C 语言是计算机系的第一门课程了吧,我虽然不是计算机系的,但是也能从其他同学那里打听到一些信息,于是自己也开始学习 C 语言了。
2024-03-18 20:59:47 837
原创 Go 语言数据库/存储项目推荐,Go 语言进阶必备!
第一个是我自己写的 mini-bitcask 教程 https://github.com/rosedblabs/mini-bitcask,300 多行代码实现了一个极简的 bitcask 存储引擎,可以看做是 rosedb 的 mini 版本,对于你学习存储引擎的原理和实现有很大的帮助。boltdb https://github.com/etcd-io/bbolt, Go 语言领域知名的存储引擎,B+ 树实现,支持一写多读的事务,广泛运用于生产环境,etcd 就是使用了 boltdb 作为持久化存储引擎。
2024-03-06 08:02:32 1159
原创 Raft 算法、分布式 KV 面试汇总
客户端会选择将请求发送到 Leader 节点,然后由 Leader 节点进行状态复制,即发送日志,当收到多数的节点成功提交日志的响应之后,Leader 会更新自己的 commitIndex,表示这条日志提交成功,并且 apply 到状态机中,然后返回结果给客户端。,因此会强迫当前的 Leader 下台。是的,比如说 Leader 所在服务器可能 CPU 负载太高、响应速度过慢,或者网络出现故障,或者丢包太严重,都有可能造成其他 Peer 不能及时收到其 AppendEntries,从而造成超时,发起选举。
2024-02-25 17:16:15 1537
原创 用 Go 语言造了一个全新的 kv 存储引擎
经历了大概 4 个月的打磨,LotusDB 的第一个 release 版本终于发布了,我看了下,有 200 多次 commit(接近 rosedb 一年多的 commit 次数了)。项目地址:https://github.com/flower-corp/lotusdb有了 rosedb 在 bitcask 模型上的实践之后,以及自己在存储这方面的一些经验积累,去年底的时候,在上班路上突然想到的一个 idea,让我有了做一个新的 kv 存储引擎的想法。有了想法之后便是验证,因为其实心里还是没谱,我又在
2022-03-21 09:38:36 1157
原创 rosedb 事务实践
一、前言事务是传统关系型数据库中必不可少的功能,例如 Mysql、Oracle、PostgreSql 都支持事务,但是在 NoSQL 数据库中,事务的概念比较弱化,在实现上也没有关系型数据库那么复杂。但是为了数据的完整一致性,大多数 k-v 都会实现事务的基本特性,例如 k-v 数据库的两大鼻祖 LevelDB 和 RocksDB,一些 Go 语言实现的开源 k-v 也都支持事务,例如 Bolt,Badger 等。rosedb 的事务目前刚实现了一个初级的版本,代码还比较简单,只不过在我的预期构思内,
2021-08-14 09:35:43 749 2
原创 我学 Go 语言这一年
去年大概就是这个时候,我刚开始学习 Go 语言,如今一年过去了,我的生活也因为 Go 语言发生了很多的变化,值得跟大家分享一下,希望给你带来一些启发。或许好多人都不知道,在去年的这个时候,我在一家小公司做的还是 Java,那时候毕业也刚刚一年。具体是为什么学习 Go 语言的,我已经忘记了,或许是因为它比较火,加之因为疫情,我还有一些业余时间。我当时在某付费平台上花几十块购买了一个 Go 语言的基础入门教程,然后每天就跟着教程学习,敲点代码。但是我当时并没有要转语言方向的打算,我也并不是一个语言控,我
2021-07-05 22:00:54 355 1
原创 从零实现一个 k-v 存储引擎
写这篇文章的目的,是为了帮助更多的人理解 rosedb,我会从零开始实现一个简单的包含 PUT、GET、DELETE 操作的 k-v 存储引擎,你可以将其看做是一个简易版本的 rosedb,就叫它 minidb 吧(mini 版本的 rosedb)。无论你是 Go 语言初学者,还是想进阶 Go 语言,或者是对 k-v 存储感兴趣,都可以尝试自己动手实现一下,我相信一定会对你帮助很大的。说到存储,其实解决的一个核心问题就是,怎么存放数据,怎么取出数据。在计算机的世界里,这个问题会更加的多样化。计算机当
2021-07-01 20:27:49 912 2
原创 Go 语言学习路线来啦
时不时的有人问我一些关于 Go 语言学习路线、学习资源方面的问题,这篇文章就来详细说一说。借此希望给那些正在学习,或是想学习 Go 语言的朋友一些帮助。需要说明的是,按照我推荐的来学习,完全掌握 Go 相关开发知识,并且找到 Go 开发的工作应该是问题不大的,当然具体能达到什么样的程度,得看个人了。说明一下,文中提到的所有书籍,都可以在公众号【roseduan写字的地方】后台回复相应的关键字获取:【算法、操作系统、网络、数据库、Go、微服务】,按需自取。1. 基础知识无论你学习什么编程语言,这些基础
2021-06-14 17:49:24 2165 3
原创 rosedb 上 Github Trending 啦!
昨天上午,我刚打开电脑,习惯性的逛了一下 Github ,点开了 Trending。因为 Github Trending 精选了一些最近比较活跃并且优质的开源项目,所以我没事的时候经常会看看,有时候也能够从别人的项目当中学习到很多。然后我看了下 Go 语言的(因为我目前主要还是使用 Go)Trending,没想到刚点开就看到了自己的项目 rosedb。说高兴那是肯定的,以前总是看到别人的项目在这里,心中总是觉得很羡慕,也很感慨别人为啥这么优秀,因为那些项目的作者大多是非常牛逼的人物。没想到自己的项目
2021-06-05 22:11:36 960 2
原创 使用 Go 实现一个简单的 k-v 数据库
大家好,我是 roseduan,今天我向大家推荐一下我写的一个 Go 语言实战项目—rosedb。rosedb 是一个简单、内嵌的 k-v 数据库,使用 Golang 实现,支持多种数据结构,包含 String、List、Hash、Set、Sorted Set,接口名称风格和 Redis 类似。如果你已经比较熟悉 Go 语言的基础知识了,但是又苦于没有项目实战,无法得到进一步的提升,那么这个项目一定是帮助你巩固和进阶 Go 知识的绝佳素材。我将这个项目开源到了我的 GitHub 上面,你可以在 Git
2021-04-26 11:08:20 1081
原创 最简单的 gRPC 教程— 1 初识 gRPC
gRPC 是 Google 开源的一个高性能的 RPC(Remote Procedure Call) 框架,它具有如下的优点:提供高效的进程间通信。gRPC 没有使用 XML 或者 JSON 这种文本格式,而是采用了基于 protocol buffers 的二进制协议;同时,gRPC 采用了 HTTP/2 做为通信协议,从而能够快速的处理进程间通信。简单且良好的服务接口和模式。gRPC 为程序开发提供了一种契约优先的方式,必须首先定义服务接口,才能处理实现细节。支持多语言。gRPC 是语言中立的,.
2021-03-26 10:37:02 506
原创 推荐几本 Go 语言电子书
首先推荐《Go 程序设计语言》这本书:豆瓣评分挺高的,需要特别说说这本书里面的示例代码,质量非常高!如果跟着敲一遍,自己多理解的话,对于 Go 一定会有更好的理解。我目前也在看这本书,很多代码甚至还不是非常理解,需要多花一点时间。当然我觉得这也挺好的,与其看一些垃圾书,还不如认认真真的看完一本高质量的书来得爽!其他的相关书籍就不是很了解了,只不过也有一些质量和口碑都比较好的,这里分享给大家几本 Go 的书籍:Go 高级编程Go 语言编程Head First Go (英文版)Go 源码剖析G
2021-03-21 17:49:14 1842 1
原创 我的 Java 转 Go 之路
从毕业到现在已经接近两年了,在这段时间里,我日常开发都是使用的 Java,因为大学自学的是 Java,然后毕业找到的工作也是做 Java 开发的。现在做 Go 其实也没多久,但还是想把自己的一些经历和学习经验都记录下来,要是能帮到你就更好了哦!其实 Go 在这两年一直都挺火的,毕竟是 Google 的亲儿子,又凭借着 docker 和 k8s 这两大杀器,自身又有一些相对于其他语言的优势(例如并发处理、通道),而且近几年 Go 的工作岗位也在慢慢增加,一些大厂都逐渐使用 Go 做为开发甚至主力开发语言。.
2021-03-14 09:02:05 3503
原创 Java 中的 PriorityQueue 源码分析
一、概述顾名思义,PriorityQueue 是一个队列,队列的特点是先进先出,后进后出,和现实生活中的排队场景非常的类似。而优先级队列是一个比较特殊的队列,它的入队普通的队列没有区别,而出队操作不是先来后到了,而是有优先级的,优先级高的先出队。下面的代码描述了 Java 中的 PriorityQueue 的基本使用方法:Queue<Integer> queue = new PriorityQueue<>();queue.add(1); //入队queue.ad
2020-09-12 19:59:02 257
原创 mysql 复制表数据
在 mysql 数据库的使用过程当中,复制数据是一个非常常见并且有用的操作,在数据量较小,表扫描行数少的情况下,我们可以使用 insert into ... select ... 语句来完成表数据的复制。具体的流程如下:假如有表 t,建表语句和初始化数据如下:create table t ( id int not null primary key, c int null, d int null);insert into t values (0, 0, 0), (5, 5
2020-07-05 21:30:14 477
原创 广度和深度优先搜索
搜索是树或者图等数据结构的基础算法之一,很多时候我们需要在树或者图中寻找特定的节点,那么使用到的最基础的、也是最容易理解的两种方式便是广度和深度优先搜索。在开始阅读之前,做为预备知识,你可以先了解一下关于树和图这两种数据结构的基本概念,参考 Wikipedia 上面的介绍:Wikipedia——树(数据结构)Wikipedia——图(数据结构)以及其他一些优秀的文章:https://segmentfault.com/a/1190000010794621https://www.cnblogs.co
2020-06-26 10:47:48 1635
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人