自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

roseduan 的个人博客

微信公众号【roseduan写字的地方】,技术之外,咱们聊聊生活与理想

  • 博客(85)
  • 收藏
  • 关注

原创 学习 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 358

原创 经典排序算法分析

排序指的是将一组对象按照特定的逻辑顺序重新排列的过程,排序的应用十分广泛,可以说是无处不在,它在商业数据处理和现代科学计算中发挥着举足轻重的作用,目前已知的应用最广泛的排序算法—快速排序,更是被誉为了 20 世纪科学和工程领域的十大算法之一。排序算法有很多,有比较常见的有比如插入排序、归并排序、快速排序,就是我接下来会讲解的这几种;也有一些非常冷门的排序算法,有一些可能你连名字都没听过,例如鸡尾酒排序、侏儒排序、图书馆排序、耐心排序、臭皮匠排序等等……这篇文章的篇幅较长,涉及到大量图例、证明、代码示例,

2020-06-06 11:30:55 488

原创 字符串匹配之 BM 算法

一、基本概念字符串匹配是计算机科学领域中最古老、研究最广泛的问题之一,层出不穷的前辈们也总结了非常多经典的优秀算法,例如 BF 算法、RK 算法、BM 算法、KMP 算法,今天我介绍的主角是 BM 算法。字符串匹配可以简单概括为前缀匹配,后缀匹配,子串匹配,下面的讲解我都以最常见的子串匹配为例。子串匹配的概念很简单,一句话解释就是:在一个字符串 A 中寻找另一个字符串 B,这里的字符串 A 可...

2020-04-19 17:23:29 819 1

原创 Mysql 索引模型 B+ 树详解

一、认识二叉树首先,在了解 mysql 中的 B+ 树之前,我们需要搞懂什么是二叉树。二叉树是一种常见的非线形数据结构,数据是以一对多的形态组织起来的,我画了一张图来帮助你理解:在二叉树中,有一种比较特殊的,也是最常用的二叉树,那就是二叉搜索树,也叫做二叉查找树。它最大的特点是:对于树中的任意一个节点,假如节点值为 x,其左子树节点的值必须小于 x,其右子树节点的值必须大于 x,就像下图的这...

2020-03-29 10:44:55 3202 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 8997 3

原创 Postgres 源码学习 3—Postgres 存储管理器

前面一节说到,在 Postgres 的 VFD 机制之上,我们可以避开打开文件数量的系统限制,通过 VFD 可以进行打开、读写、关闭、删除文件等操作,简单来说就是 VFD 为我们提供了一个抽象,屏蔽了操作系统文件描述符的接口,后续我们对文件的 open、close,以及 CRUD 操作都在 VFD 的基础之上。注意这里写入之后,并不会等待操作系统刷盘之后再返回,而是直接返回,将刷盘的请求交给了 checkpointer 进程,由此来提高数据写入的效率,而数据的崩溃恢复、一致性,是通过 WAL 来保证的。

2024-05-26 16:24:54 348

原创 推荐一本手写数据库的书籍

最近有很多同学,给我反馈,通过《从零实现 KV 存储》课程项目丰富了自己的简历,拿到了非常不错的 offer,在就业环境不佳的情况下,我们唯一能做的就是多学习充实自己,拉开和别人的差距!付费教程最大的好处是,可以和志同道合的朋友一起学习,互相监督,共同进步,并且我专门负责答疑,在学习的过程当中,有任何疑问都可以随时咨询,能够确保你能够完全学懂!第二部分,是在前面实现的 B+ 树 KV 存储引擎之上,去构建一个迷你的 SQL 数据库,当然支持的语法比较有限,只涉及到简单的一些 CRUD 的语法。

2024-05-22 18:48:36 349

原创 Rust 练手项目—实现 MVCC 多版本并发控制

MVCC 是建立在数据多版本的基础之上的,当写入一条数据的时候,会带上一个版本号,这个版本号一般是事务的唯一标识,修改数据的时候,不会直接原地去修改数据,而是新增一条新的数据,并且带上一个新的版本号。active_xid 是一个事务私有的数据结构,保存了在这个事务启动时,其他活跃的(未提交)事务集合,这是实现可重复读的关键,保证就算其他事务提交了,也不会影响到当前的事务。可以看到对数据的修改并不是原地的,而是新增加一个版本的数据,删除数据的时候,其实也不是真正的将其删除掉,而是通过标记的方式。

2024-05-10 23:06:02 668

原创 太优雅了!Rust 200 行代码实现表达式解析

它本质上是一种递归下降解析表达式的方法,通过递归地处理运算符和操作数来解析表达式,并根据运算符的优先级和结合性来确定表达式的计算顺序。表达式解析、计算是一种基本和常见的任务,例如最常见的算术表达式,计算的方法有很多,比如逆波兰表达式、LL、LR 算法等等。拿到 Token 之后,进入到了语法分析的阶段,需要根据每个表达式的含义,以及其优先级,计算对应的结果。确定了优先级的问题,第二个问题是结合性,运算符的结合性其实也是确定的,例如加法是左结合的,这意味着。

2024-04-29 19:29:59 285

原创 Postgres 源码学习 2—Postgres 的 VFD 机制

所以有非常大的概率超过单个进程打开文件数量的限制,为了解决这个问题,Postgres 设计了 VFD(虚拟文件描述符)机制,主要是将实际的操作系统文件描述符维护到一个 LRU 缓存中,通过切换打开的方式,规避了进程打开文件数量的限制。Postgres 中的 VFD,即虚拟文件描述符,主要是为了能够规避操作系统中最大打开文件数的限制,采用切换打开的方式,维护了一个链表,将最近打开的文件维护到链表头部,最久未使用的文件放置到链表尾部。

2024-04-17 16:35:42 989

原创 Postgres 源码学习 1—Postgres 源码编译和 debug

编译安装之后,得到了二进制目录,可以将 bin 目录加入到 PATH 环境变量中,如果嫌麻烦,可以加入到 $HOME 目录中的 .bashrc 或者 .zshrc(取决于你的 sh 是什么),这样下次登录就不用重复设置了。如果你有其他的物理机,或者云服务器,都是可以的,Postgres 支持多种平台编译,如果你是非 Ubuntu 环境,可以自行查阅相关的资料进行编译安装,步骤都是大同小异的。的安装依赖,可能包含了一些没必要安装的,但肯定是涵盖了 Postgres 需要的依赖,所以全部安装上也没啥问题)。

2024-04-15 22:48:03 772

原创 后端开发和数据库内核开发最全总结,详细对比!

在工作机会方面,应该是后端开发要多于数据库内核开发岗位的,这其实比较明显,目前国内搞数据库的公司大大小小有两三百家,但有招聘需求的估计并不是很多,当然一些大厂有内部的自研数据库服务,所有也会有一些相关的招聘需求 ,比如字节、阿里、华为、腾讯等等。后端开发可能是需要面临如何应对年轻人的冲击,如何应对大家常说的 35 岁危机,并且面临日益严峻的就业环境,其实压力是非常大的,一方面不得不学习新的技术,拼了命去卷算法、八股文,但是在日常工作中可能又根本用不上,陷入面试造火箭工作拧螺丝的窘境。

2024-04-02 22:55:10 384

原创 细数自己学习过的编程语言,附学习建议

到了大三,为了能够毕业时找到工作,开始自学 Java,Java 当时还是非常火爆的,培训班、网上的资料铺天盖地的都是 Java 相关的,我那时候还学习了 Java Web,做了一个类似淘宝的商城项目,自己写了简单的前端,所以用到了 Html/CSS 、JavaScript。我最开始接触编程,是在大一的时候,学的是 C 语言,因为那个时候 C 语言是计算机系的第一门课程了吧,我虽然不是计算机系的,但是也能从其他同学那里打听到一些信息,于是自己也开始学习 C 语言了。

2024-03-18 20:59:47 801

原创 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 986

原创 Raft 算法、分布式 KV 面试汇总

客户端会选择将请求发送到 Leader 节点,然后由 Leader 节点进行状态复制,即发送日志,当收到多数的节点成功提交日志的响应之后,Leader 会更新自己的 commitIndex,表示这条日志提交成功,并且 apply 到状态机中,然后返回结果给客户端。,因此会强迫当前的 Leader 下台。是的,比如说 Leader 所在服务器可能 CPU 负载太高、响应速度过慢,或者网络出现故障,或者丢包太严重,都有可能造成其他 Peer 不能及时收到其 AppendEntries,从而造成超时,发起选举。

2024-02-25 17:16:15 1176

原创 存储的一些记录

2023-05-25 18:59:10 140

原创 使用 Rust 和 Go 从零构建 KV 存储

从零实现一个 KV 数据库!!

2023-03-06 08:29:11 379

原创 数据库/存储学习路径推荐

数据库学习最佳姿势!

2023-02-04 14:42:45 750 1

原创 用 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 1024

原创 rosedb 事务实践

一、前言事务是传统关系型数据库中必不可少的功能,例如 Mysql、Oracle、PostgreSql 都支持事务,但是在 NoSQL 数据库中,事务的概念比较弱化,在实现上也没有关系型数据库那么复杂。但是为了数据的完整一致性,大多数 k-v 都会实现事务的基本特性,例如 k-v 数据库的两大鼻祖 LevelDB 和 RocksDB,一些 Go 语言实现的开源 k-v 也都支持事务,例如 Bolt,Badger 等。rosedb 的事务目前刚实现了一个初级的版本,代码还比较简单,只不过在我的预期构思内,

2021-08-14 09:35:43 643 2

原创 我学 Go 语言这一年

去年大概就是这个时候,我刚开始学习 Go 语言,如今一年过去了,我的生活也因为 Go 语言发生了很多的变化,值得跟大家分享一下,希望给你带来一些启发。或许好多人都不知道,在去年的这个时候,我在一家小公司做的还是 Java,那时候毕业也刚刚一年。具体是为什么学习 Go 语言的,我已经忘记了,或许是因为它比较火,加之因为疫情,我还有一些业余时间。我当时在某付费平台上花几十块购买了一个 Go 语言的基础入门教程,然后每天就跟着教程学习,敲点代码。但是我当时并没有要转语言方向的打算,我也并不是一个语言控,我

2021-07-05 22:00:54 327 1

原创 从零实现一个 k-v 存储引擎

写这篇文章的目的,是为了帮助更多的人理解 rosedb,我会从零开始实现一个简单的包含 PUT、GET、DELETE 操作的 k-v 存储引擎,你可以将其看做是一个简易版本的 rosedb,就叫它 minidb 吧(mini 版本的 rosedb)。无论你是 Go 语言初学者,还是想进阶 Go 语言,或者是对 k-v 存储感兴趣,都可以尝试自己动手实现一下,我相信一定会对你帮助很大的。说到存储,其实解决的一个核心问题就是,怎么存放数据,怎么取出数据。在计算机的世界里,这个问题会更加的多样化。计算机当

2021-07-01 20:27:49 753 2

原创 Go 语言学习路线来啦

时不时的有人问我一些关于 Go 语言学习路线、学习资源方面的问题,这篇文章就来详细说一说。借此希望给那些正在学习,或是想学习 Go 语言的朋友一些帮助。需要说明的是,按照我推荐的来学习,完全掌握 Go 相关开发知识,并且找到 Go 开发的工作应该是问题不大的,当然具体能达到什么样的程度,得看个人了。说明一下,文中提到的所有书籍,都可以在公众号【roseduan写字的地方】后台回复相应的关键字获取:【算法、操作系统、网络、数据库、Go、微服务】,按需自取。1. 基础知识无论你学习什么编程语言,这些基础

2021-06-14 17:49:24 2061 3

原创 rosedb 上 Github Trending 啦!

昨天上午,我刚打开电脑,习惯性的逛了一下 Github ,点开了 Trending。因为 Github Trending 精选了一些最近比较活跃并且优质的开源项目,所以我没事的时候经常会看看,有时候也能够从别人的项目当中学习到很多。然后我看了下 Go 语言的(因为我目前主要还是使用 Go)Trending,没想到刚点开就看到了自己的项目 rosedb。说高兴那是肯定的,以前总是看到别人的项目在这里,心中总是觉得很羡慕,也很感慨别人为啥这么优秀,因为那些项目的作者大多是非常牛逼的人物。没想到自己的项目

2021-06-05 22:11:36 877 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 932

原创 最简单的 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 418

原创 推荐几本 Go 语言电子书

首先推荐《Go 程序设计语言》这本书:豆瓣评分挺高的,需要特别说说这本书里面的示例代码,质量非常高!如果跟着敲一遍,自己多理解的话,对于 Go 一定会有更好的理解。我目前也在看这本书,很多代码甚至还不是非常理解,需要多花一点时间。当然我觉得这也挺好的,与其看一些垃圾书,还不如认认真真的看完一本高质量的书来得爽!其他的相关书籍就不是很了解了,只不过也有一些质量和口碑都比较好的,这里分享给大家几本 Go 的书籍:Go 高级编程Go 语言编程Head First Go (英文版)Go 源码剖析G

2021-03-21 17:49:14 1731 1

原创 我的 Java 转 Go 之路

从毕业到现在已经接近两年了,在这段时间里,我日常开发都是使用的 Java,因为大学自学的是 Java,然后毕业找到的工作也是做 Java 开发的。现在做 Go 其实也没多久,但还是想把自己的一些经历和学习经验都记录下来,要是能帮到你就更好了哦!其实 Go 在这两年一直都挺火的,毕竟是 Google 的亲儿子,又凭借着 docker 和 k8s 这两大杀器,自身又有一些相对于其他语言的优势(例如并发处理、通道),而且近几年 Go 的工作岗位也在慢慢增加,一些大厂都逐渐使用 Go 做为开发甚至主力开发语言。.

2021-03-14 09:02:05 3388

原创 Java 中的 PriorityQueue 源码分析

一、概述顾名思义,PriorityQueue 是一个队列,队列的特点是先进先出,后进后出,和现实生活中的排队场景非常的类似。而优先级队列是一个比较特殊的队列,它的入队普通的队列没有区别,而出队操作不是先来后到了,而是有优先级的,优先级高的先出队。下面的代码描述了 Java 中的 PriorityQueue 的基本使用方法:Queue<Integer> queue = new PriorityQueue<>();queue.add(1); //入队queue.ad

2020-09-12 19:59:02 222

原创 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 412

原创 广度和深度优先搜索

搜索是树或者图等数据结构的基础算法之一,很多时候我们需要在树或者图中寻找特定的节点,那么使用到的最基础的、也是最容易理解的两种方式便是广度和深度优先搜索。在开始阅读之前,做为预备知识,你可以先了解一下关于树和图这两种数据结构的基本概念,参考 Wikipedia 上面的介绍:Wikipedia——树(数据结构)Wikipedia——图(数据结构)以及其他一些优秀的文章:https://segmentfault.com/a/1190000010794621https://www.cnblogs.co

2020-06-26 10:47:48 1421

原创 浅析 Mysql 中的锁

浅析 Mysql 中的锁一、全局锁mysql 中的全局锁,指的是对整个数据库实例加锁,一般的实现方式有两种。一是可以执行语句 flush tables with read lock,即所谓的 FTWRL,让整个数据库处于只读状态,之后在这个数据库上面的增删改操作都会被阻塞,例如下面的例子:针对 FTWRL,释放锁的方式有两个:一是客户端断开连接,二是使用命令 unlock tables。第二种加全局锁的方式是修改 mysql 的系统配置,有一个配置为 read_only ,可以使用命令 set g

2020-06-21 20:54:07 379

原创 Leetcode 349. 两个数组的交集

Leetcode 349. 两个数组的交集一、题目描述给定两个数组,编写一个函数来计算它们的交集。示例1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2]示例2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺...

2019-11-23 18:44:17 624

原创 Leetcode 206. 反转单链表

Leetcode 206. 反转单链表一、题目描述难度: easy 标签:链表反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:能否使用迭代和递归两种方式来解决这道题?二、自己的解法链表的题目大多没有太难的技巧,非常容易理解,只是比较考察编程...

2019-11-20 22:49:35 372

原创 Leetcode 876.求链表的中间节点

Leetcode 876.求链表的中间节点一、题目描述难度: easy 标签:链表给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ...

2019-11-19 21:54:12 538

原创 是什么让你成为了今天的自己?

今天接触到了一个概念,叫做生命线分享,觉得十分的受益,想在此分享给大家。这个概念其实很简单,我们花一点时间回顾一下自己过往的人生经历,尽可能的详细,从中找到那些对我们的成长起关键作用的事件,无论是积极的还是消极的。然后进一步分析这些事件,在面对它们的时候,我们是怎么处理的,从中获得了什么,体现出了我们怎样的品质,是否改变了我们固有的某些思想,或者塑造了我们的价值观等等。通过这种方式,我们可以...

2019-11-17 10:28:09 632

原创 Leetcode 1.Two Sum

Leetcode 1.Two Sum一、题目描述这是 Leetcode 上面的第一题,非常的经典,在面试中也十分常见。难度:easy 标签:数组 哈希表给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = ...

2019-11-17 10:21:39 334

原创 Leetcode 905.按奇偶排序数组

Leetcode 905.按奇偶排序数组一、题目描述难度: easy 标签:数组给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。你可以返回满足此条件的任何数组作为答案。示例:输入:[3,1,2,4]输出:[2,4,3,1]输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。提示:1 <=...

2019-11-03 15:33:04 243

原创 推荐几本书

最近的确在写作方面遇到了非常大的困难,一是因为毕业后刚入职不久,在工作上面需要处理的事情较多,需要花更多的时间来适应;第二嘛,可能还是因为自己才疏学浅,输入的知识不多且不成系统,表达能力也尚欠缺很多。其实前段时间有过很多的构思,想写的点还是很多的,但始终无法组织成文章,有时候甚至坐在电脑前憋一两个小时,但还是草草放弃。。。每到此时,总会有一些后悔,为什么以前没能够多学点知识,多看些书呢?迷茫痛苦过...

2019-09-08 22:05:31 1583

原创 RabbitMQ 安装和初始化

真的是服了 rabbitmq ,官网的安装教程看起来十分的繁琐,到处都是链接,对新手十分的不友好。折腾了一天,才摸索出在 Linux 上面安装的套路,这里总结一下,以防后面使用到。1. 安装erlangrabbitmq 需要依赖 erlang,官网说的非常的清楚,具体的下载地址为:https://packagecloud.io/rabbitmq/erlang提供了 各种操作系统和版本的 e...

2019-08-24 11:35:15 822

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除