数据库内核杂谈(一):一小时实现一个基本功能的数据库

从零到英雄:如何用FPGA和AD9288打造你的第一台便携式示波器 本文详细介绍了如何利用FPGA和AD9288 ADC芯片从零开始打造一台高性能便携式示波器。通过硬件架构设计、高速数据采集系统实现及信号处理与显示系统的开发,读者可以掌握400Msps采样率的实现方法,并了解关键器件选型与系统优化技巧。 阅读详情

很好的数据库内核系列文章,用简洁的样例描述数据库内核的众多原理。虽然后面优化器的算法难以理解,但是在其他章节我相信你一定也会有收获。

数据库内核杂谈(二):存储“演化论”

数据库内核杂谈(三):索引优化

数据库内核杂谈(四):执行模式

数据库内核杂谈(五):如何实现排序和聚合

数据库内核杂谈(六):表的 JOIN(连接)

数据库内核杂谈(七):数据库优化器(上)

数据库内核杂谈(八):数据库优化器(下)

开篇词

为啥想写这样一个系列?

最主要的原因肯定是出于兴趣吧,自从接触了数据库内核开发,觉得里面真的是博大精深,很多子系统的设计初看不知所云,细读就发现已经做到了极致。然后特别希望有大牛能够深入浅出地把这些精髓讲解出来。但可惜,一直没有发现类似的资源或者课程 (笔者虽然工作多年,但自觉还是比较注重积累,每天都关注科技新闻,技术博客甚至领域内的新的学术文章)。近期也看到有越来越多的付费培训,从算法到系统设计,到大数据,应有尽有,但唯独没有发现非常好的关于数据库内核设计的资源。自己当然没有实力可以去开那样一门课程,但我希望可以通过写 blog 来完善自己的知识储备。也希望读者能有所收获。不过想归想,自己从来没下定决心去做这样一件事,因为总是觉得自己积累还不够,还要准备准备云云。

什么契机让你真正去行动了?

这契机真的是一个非常偶然的故事。上个周末的一天晚上,小葡萄(我最爱且仅爱的老婆大人)正在给我洗脸。感觉闲着也是闲着,加之正好下午刚讨论过 SQL,我就半开玩笑地说,“老婆,你不是对数据库感兴趣吗?我给你讲讲数据库是怎么实现的,数据库是怎么去执行一个 SQL 语句的” 小葡萄:“你说呀,你能说得出来吗?”;“嘿,小看我,你听着哦 。。。” 然后我就 blahblah 地讲了大半个小时,用尽量通俗易懂的语言给老婆描述了数据库最初是怎么起源的;怎么去实现最基本的存储;有了存储,怎么去实现基本的数据读取;有了读取怎么去实现基本的数据操作,等等。听完,小葡萄真的是突然有种对我肃然起敬地感觉(极有可能是我自己的一厢情愿)。也正是小葡萄的支持,我决定,要真正去做这件想了很久却从未开始的事情。就像她说的,与其过多地去 get ready but do nothing, 还不如去实践一个不怎么 ready 的事!

啥背景呀,就敢写数据库内核

说真的,我自己也信心不足呢。说说背景吧 (偶尔咱也知乎体一下):咳咳,谢邀。本人上海交通大学软件学院本科毕业,University of California, Davis 计算机博士毕业。现在在脸书做一个老年程序员。自己并不算一个数据库的科班出身,博士学的也不是数据库专业。一个很偶然的机会,我得到了一份数据库公司 Greenplum(Pivotal) 的实习的机会,又阴差阳错地毕业后正式加入了 Query Processing 组。在 Pivotal 的两年,非常有幸地参与了 Orca Query Optimizer (已在 Apache 开源) 的开发。在这期间也混了几篇 VLDB,SIGMOD 的 papaer。正是这份工作让我开始对内核有所了解。再后来原 Pivotal 的 director 离开开了个做数据库虚拟化的初创公司就把我一起拉去了。这个初创公司做的也非常有趣,database virtualization:旨在不用改变任何 application code 的前提下(包括不用换 JDBC, 或者 ODBC driver),就让 application code 可以直接运行在另一个数据库上(举个例子,Teradata BTEQ script 可以直接通过我们的中间件,运行在 Pivotal Greenplumn Database 上),当时我们用的最多的简介就是 VMWare in terms of databases。这份工作让我更细致地了解了不同数据库原生接口的不同以及如何 rewrite 不同的 SQL dialect 来使它们之间互相兼容,我觉得也算变相的 query optimization 吧。总的来说,自己对各个部件都有所了解,但知识点比较分散,不够系统,也希望在写 blog 的过程中去学习和完善知识储备。

这个系列会分为哪几个模块?有没有大纲

真心觉得自己还不够格去系统地讲解数据库的各个模块。所以我才把这个系列的名称定义为杂谈。咱们就暂不列什么提纲了,但我会把最核心的部件包括存储,SQL 语言,数据优化器和执行器都 cover 了。 然后我们也能够自由发挥,分享一些我对 NoSQL 以及 NewSQL 的理解。在这个过程中,我也会去查最新的资料,在写的同时也能更好地去巩固和订正知识。

阅读这个系列会有啥收获?

我希望能够深入浅出地去讲解数据库是一个什么样的系统,以及为什么它最后会演化成这样一个系统,为什么我们都用 SQL 来操作数据,而不是 AQL 或 BQL. 希望读者阅读后,对数据库的理解不再单单只是知道简单的 table, row 等的基本概念或者单单会写些 join, select 的 SQL 语句。而是能从源头真正做到知其所以然。 希望能从对数据库系统的认知来进一步提高对 general 系统设计的认知。

虽然没有大纲,但是这篇的题目想好了:一小时实现一个基本数据库。

一小时实现一个基本数据库

今天我们摒弃直接介绍数据库内核各个模块的思路,而是从应用开发者的角度出发,来看实现一个数据库需要哪些基本功能,然后把这些功能细分成最小的模块再手把手一起实现,帮你揭开数据库内核的神秘面纱。希望能够减轻你对学习数据库内核的压力。我们也可以从中体会到,九层之台,起于累土。所有复杂的系统,都是通过模块化的架构和设计,以及工程阶段的精益求精,一步一步累计起来。

对与应用开发者而言,一个数据库需要哪些必要的功能呢?我觉得,下面这些是必不可少的:

1)创建数据库和数据表:create database,schema, table 等

2)存储数据:insert /update 数据,或者从其他方式导入数据 (比如 csv 文件)

3)读取查询数据:通过 SQL 语句,对数据进行读取和查询,比如 sort,aggregate,filter 等

根据这三个功能,再回看标题,你可能产生疑问,一个小时就能实现上面这些功能,不会是标题党吧。我承认,有一点小小得标题党了。因为要和数据库交互,最必要的条件是有个客户端程序可以接受用户送来的指令。但要实现一个功能齐全的 Parser 可得花不少精力。既然是内核杂谈,请允许我偷个懒,假设 Parser 已经有实现,从而把精力都关注在数据库系统内部的实现。抛开 Parser,又该从哪开始呢?我的思路是跟着数据的流向,自下而上,依次从存储数据,读取数据和查询数据来看。

创建和存储数据

当用户创建一个新的数据库,并导入数据时,数据库系统就需要存储这些数据。说到存储,第一个想法就是文件系统(其实说到底数据库系统就是一个特殊的文件系统,区别与普通文件系统提供的的读写文件的接口,数据库只是提供了一个面向数据的接口:存储,读取和查询;整个系统为这些接口提供服务)。以下图 student 表作为示例,要怎么把这张表存在文件中呢?

数据库内核杂谈(一):一小时实现一个基本功能的数据库

Student 表

最显而易见的就是用 Comma-separated value(CSV) 格式存:

1,“Xiaoputao”,3,“Hiking”

2,“Zgu”,3,“Running”

3,“Xiaopang”,2,“Walking”

读取 CSV 文件的逻辑也非常简单: 一行一行读取数据,然后根据 ";" 把每个数据段取出。

除了 CSV 存储,另一种常见的方式就是 json 格式:

复制代码

 
 

[ {"id":1, "name":"Xiaoputao", "class":3, "hobby":"running}, ... ]

聊聊 CSV 和 JSON 存储的优缺点。两者都属于文本存储,优点一在于易于人类理解。另一个优点就是直接兼容其他支持 CSV 和 JSON 的数据库。缺点也很明显,存储效率不高,读取效率也会随之降低。另一个问题在于,上述例子中存储的内容只有值,没有 type 和 size(metadata),这些信息在后续操作如校验中是很重要的。当然,我们可以把 metadata 加入到存储中,比如,把 json 的每个 val 变成一个 obj:{“colName”:“id”,“colType”:“int”,“colSize”:4,“colVal”:1}。专业数据库肯定不会选择用 CSV 或 JSON 作为默认存储,但几乎都支持 CSV 和 JSON 数据作为 external table。如果要追求更高的性能,我们可以选择更高效的编码方式把数据以字节流的形式存储在文件中;只要数据库系统自身能够读取这些数据即可。咱们既然时间有限,当然是一切从简,就选择 CSV 或者 JSON 的文件格式来存储我们的数据。

只要有一个文本编辑器,能够创建和编辑 CSV 或者 JSON 文件。这其实这已经完成了创建数据表,输入,修改以及存储数据的功能。

读取数据

基于上述用 CSV 或 JSON 的存储,读取数据非常简单 (允许我们调用第三方支持 CSV 或者 JSON 的 API)。重点在于读取完存放在怎样一个数据结构中方便后续对数据进一步的查询操作。根据数据的特性,结果集 (RowSet) 是由一序列的行数据 (Row) 组成,每一行又由多个单元 (Cell) 组成。我们试着根据这个概念设计下面这些类:

数据库内核杂谈(一):一小时实现一个基本功能的数据库

Cell, Row, RowSet Class

简单梳理下,每个 Cell 存 type,size,和 value;Row 存一整行 cell;RowSet 存一序列的 Row。具体在实现中还有很多细节需要注意,如 typecheck, 确保每行列数相同,等等,这里也一并从简略过。定义了存储方式和数据结构,具体数据读取代码如下:

数据库内核杂谈(一):一小时实现一个基本功能的数据库

读取

csvToRowSet 和 jsonToRowSet 的实现只需要借助第三方 CSV 和 JSON 的类库就能实现,就不赘述代码了。

这一节里,我们定义了 Cell, Row, RowSet 的数据结构来存放从文件 (CSV 或 JSON) 中读取的数据,并给出了示例代码。

执行查询

有了存储和读取,已经可以把数据从文件中读取到内存,接下来就要支持用户的查询语句了。实现查询就是去实现 SQL 语句中的各个功能模块,比如排序 (order by), 聚合 (group by),多表联合 (join) 等等。执行器会对每个功能模块进行实现,甚至针对不同的数据分布,会有多种方式的实现来提高读取速度。现在,我们一起来讨论一些常用的语言功能。

全表读取 (SELECT *)

其实,定义了 RowSet 的数据结构和实现了读取文件的接口,我们的数据库就已经支持全表读取的 SQL 语句,示例如下:

复制代码

 
 

SELECT * FROM student;

分页语句 (LIMIT)

一下子就能想到的分页语句,用来限制输出的数据行数:

数据库内核杂谈(一):一小时实现一个基本功能的数据库

Limit Operator

一行代码,不解释了。抬走!

关系映射语句 (PROJECTION)

关系映射的本质是对于输入的 RowSet 的每一行 (row), 通过各种标量计算,输出一个新的数据行,再由这些行组成新的 RowSet。见下图示例:

复制代码

 
 

SELECT id + 5, LEN(name) FROM student;

对从 student 表读取的每一行数据,输出一个新的数据行包含 id + 5 和 LEN(name) 的 cells。

Projection 可以非常复杂,但有一条准则就是它不改变原有 RowSet 的基数 (cardinality), 即新 RowSet 的行数和原来的相同。因此,无论映射逻辑多复杂,输入一个 Row,输出一个 Row。再复杂的计算,也是一比一步迭代产生。比如上述示例可以分解成下面这些操作来完成:对于每一行 input row, id 值加 5,对 name 取 length,最后去掉 class 和 hobby 两列。归根结底就是将复杂的运算拆分成原子操作然后一步一步地顺序执行。我们可以定义如下两个基本 operator:RowComputeOperator 根据定义的 computeCellVal 对 input row 计算一个新 cell,并把这个 cell 加到原 row 的末尾。SelectionOperator 根据给定的 indexes,生成一个仅包含指定 index 的新 row。Pseudo code 如下:

数据库内核杂谈(一):一小时实现一个基本功能的数据库

RowComputeOperator and SelectionOperator

RowComputeOperator 里面有需要定义 computeCellVal,输入是一个 row, 输出一个新的 cell。具体实现则根据具体语义来定。定义一个 computeCellVal 需要 2 个参数:1)运算作用在哪些 cell 上,假设限制只能作用在 1 个或 2 个 cell 上 (2 个以上可以用多个 Operator 嵌套);2)提供具体计算的操作,比如常见单元操作如 len(), ceiling(), abs() 或者常见的二元操作如±*/ 等等。

有了这两个基本 operator, 实现示例中的 projection,我们定义 3 个 operator 即可:1)compute a new cell using “(id + 5)” 2) compute a new cell using “len(name)” 3) 用 SelectionOperator 选择最后两个新生成的 cell。

实现整个 projection 的 operator 的 pseudo code 如下:

数据库内核杂谈(一):一小时实现一个基本功能的数据库

Projection Operator

条件选择语句 (WHERE)

有了 Projection,我们就可以实现下面的条件选择语句 (WHERE) 了:

复制代码

 
 

SELECT * FROM student WHERE class = 3;

实现想法很简单,首先用 Projection operator 计算出 filter condition 的值 (bool),然后 filter by 这个 cell 即可。

数据库内核杂谈(一):一小时实现一个基本功能的数据库

Filter Operator

排序语句 (ORDER BY)

这里,我给一个非常低效但很容易理解的实现:创建一个 hashmap 来存 <cell, id>,然后对要 sort 的 cell 排序,根据 cell 顺序取出原 row 组成新的 rowSet 输出:

数据库内核杂谈(一):一小时实现一个基本功能的数据库

Sort Operator

有读者会问,如果排序语句是一个 expression 而不是单个 column 怎么办?比如下面的示例:

复制代码

 
 

SELECT * FROM student ORDER BY id + 5 ASEC;

还记得我们前面实现的 projection 吗?这里把 (id + 5) 作为一个新的 projection 加入到 Row 中即可。

一起实现了 4 个 Operator,看看有没有什么规律可循?所有定义的操作都是基于一个原则:输入一个 RowSet,然后输出一个 RowSet。并且,是一层一层循序渐进的迭代。对于数据的查询操作,是从最初读取表中的原始数据开始,根据给定的 Operator 序列对数据逐一进行操作;这一个 Operator 的输出就是下一个 operator 的输入。也就是说,给定一个 SQL 查询语句,我们生成一序列 Operator 的 tree,再依次执行,就能得到最终结果。现在来一起优化下代码,把 Operator 的接口抽象出来,然后把刚才实现的 operator 全当成子类来实现。代码如下:

数据库内核杂谈(一):一小时实现一个基本功能的数据库

Unary Operator

有读者会有疑问,基类为什么叫 UnaryOperator 呢?先卖个关子。有了基类,我们可以根据 SQL 的语法功能实现相应的 Operator。

聚合操作 (AGGREGATION)

接着一起来实现聚合操作。Aggregation 分为两大类,scalar-agg 和 multi-agg。scalar-agg 就是简单的 sum, avg, min, max 等的数据聚合操作,最终返回一个数据行的结果集,实现代码如下:

数据库内核杂谈(一):一小时实现一个基本功能的数据库

Scalar-agg

每个 AggOp 接受一序列的 cells,然后输出聚合结果的 cell。常见的 AggOp 如 sum, max,min 实现都很简单,这边就不赘述了。

multi-agg 对应 SQL 中的 GROUP By,如下图示例:

复制代码

 
 

SELECT class_room, COUNT(*) FROM student;

比 scalar-agg 复杂的地方就是先要把有相同值的 group by columns(示例中为 class_rom) 的 row 合并起来,然后对合并后的 rows 做 Scala-agg 即可。代码我就不贴啦,当留个小作业给大家。

SQL Operator Tree

有了实现基本语义的 Operator,要实现一个完整的查询语句,我们要做的就是把 operator 一层一层的累加起来,形成一个 Operator tree,然后根据这个 operator tree, 依次执行每一个 operator 即可。比如下面这个查询语句:

复制代码

 
 

select class, sum(id + len(name)) as c

  
 

from (

  
 

    select * from student where hobby = 'hiking' limit 10

  
 

)

  
 

group by class;

我们只要建立如下的 Operator tree:

数据库内核杂谈(一):一小时实现一个基本功能的数据库

sql operator tree

有没有觉得挺神奇的!即使再复杂的查询 SQL 都能这样用基本的 operator 像搭乐高一样搭建起来。

小结

至此,我们简单的数据库也实现得差不多啦。我看了下自己写的 pseudo code 仅仅 200 多行,一个小时写完也不算条件太苛刻。虽然数据结构冗余,算法低效,但是麻雀虽小,五脏俱全!

来解释前面卖的关子,为什么基类定义为 UnaryOperator?因为我们还有 BinaryOperator。二元的操作是做什么的呢?答案就是为了表与表的联合 (join)。有了 Binary Operator,Operator 的叠加就真正变成了一颗树 (二叉树),这也是为什么前文我们称之为 operator tree。本文就先不详述如何实现 Join Operator 了,以后会有专门的章节来覆盖。再讲下去,肯定超过一个小时,读者就更觉得我标题党了。

最后给大家总结一下:

1)一个 SQL 的查询语句,即便逻辑再复杂,也可以拆分成一个一个原子 operator 的叠加

2)把这些 operator 组建成一个 operator tree,然后自底向上地依次执行,就能得到最终的查询结果

3)你可能觉得真正的数据库和我们在这捣鼓的很不一样。如果有条件,可以在 Mysql 或者 Postgres 中运行 "EXPLAIN SQL_STMT" 来打印它们生成的 operator tree,你会发现和我们生成的树挺相似的

4)相信大家都非常熟悉用 SQL 做各种数据查询,但可能从没去想过底层是怎样实现的。希望这篇博客对你有所帮助。正所谓,知其然,知其所以然!

下一篇,咱们深入聊聊存储!

作者介绍:

顾仲贤,现任 Facebook Tech Lead,专注于数据库,分布式系统,数据密集型应用后端架构与开发。拥有多年分布式数据库内核开发经验,发表数十篇数据库顶级期刊并申请获得多项专利,对搜索,即时通讯系统有深刻理解,爱设计爱架构,持续跟进互联网前沿技术。

2008 年毕业于上海交大软件学院,2012 年,获得美国加州大学戴维斯计算机硕士,博士学位;2013-2014 年任 Pivotal 数据库核心研发团队资深工程师,开发开源数据库优化器 Orca;2016 年作为初创员工加入 Datometry,任首席工程师,负责全球首家数据库虚拟化平台开发;2017 年至今就职于 Facebook 任 Tech Lead,领导重构搜索相关后端服务及数据管道, 管理即时通讯软件 WhatsApp 数据平台负责数据收集,整理,并提供后续应用。

【深度学习】脸部修复,CodeFormer,论文,实战 Blind face restoration是一个高度 ill-posed 的问题,通常需要辅助引导来 1) 改善从降级输入到期望输出的映射,或者 2) 补充在输入中丢失的高质量细节。在本文中,我们展示了在一个小的代理空间中学到的离散码本先验可以通过将盲目的面部恢复建模为 a code prediction task来大大减少恢复映射的不确定性和模糊性,同时为生成高质量面部提供丰富的视觉元素。 阅读详情

相关推荐

JMeter脚本录制-快速上手篇

有的项目应用场景下,压测时,需要考虑带宽因素,压测不只是压测接口,静态资源也要一起压测。一般来说,静态资源比较多,如果一个个手工去写请求,是比较繁琐的,此时,可以使用Jmeter的脚本录制功能。 步骤1,创建脚本录制模版。 JMeter菜单:文件>模版,下拉选择到Recording,点击“Create”按钮; 填写录制参数: hostToRecord:填写要录制的主机域名,例如,我们这里填入:www.baidu.com schemeToRecord:填写要录制的模式,例如,htt...

软件测试大叔 5734

MySQL 内核原理分析(一)

学一个技术,我们先要 跳出来,看整体,先要在脑中有一个这个技术的全貌。然后再 钻进去,看本质,深入的研究细节。这样方便我们建立一个立体的知识网络。不然单学多个知识点,是串不起来的。不容易记住,理解也不会深刻。 所以,我们先把 MySQL 拆解一下,看看内部有哪些组件,我们 Java系统执行一条SQL,MySQL的内部是如何运作,给我们返回结果的。 我们先从我们访问数据库说起 我们想要查询数据库,首先得建立网络连接 MySQL 驱动负责建立网络连接,然后请求 MySQL 数据库 其实就是创建了一个数

qq_17164811的博客 1957

STM32 使用rtthread的DMA 串口发送失败

在一次使用RTthread的DMA 串口发送时,持续性通过DMA 发送串口数据时,偶发发送过程中后续数据包无法正常发送出去,后经查,发现为RT-Thread的串口中断处理有瑕疵,后做出修改。另,为了更方便的排查为题,建议修改。左为修改前,右为修改后。

qq_39294918的博客 1108

【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑

一篇文章快速上手数据库内核开发,从0到1部署开源数据库(MinoOB),引爆你的数据库学习热情,挑战数据库领域最强大脑,成为开源社区的contributor

半旧518的博客 6628

FPGA新手必看:XC7Z020最小系统搭建全攻略(附原理图解析)

本文为FPGA新手提供了XC7Z020最小系统搭建的完整实战指南。文章详细解析了电源架构、时钟复位、配置调试等关键硬件电路设计,并重点剖析了外围电路与端口引脚的连接要点及常见陷阱,帮助读者从零开始构建稳定可靠的开发平台。

weixin_29189377的博客 360

AGV、RGV、四向车openTCS调度系统(三)车辆适配器解读,封装自己的适配器

AGV、RGV、四向车调度。理解适配器的整体作用,以及如何使用官方例子改造自己的适配器,

要这头发有何用 3612

数据库内核杂谈 - 一小时实现一个基本功能的数据库

我们摒弃直接介绍数据库内核各个模块的思路,而是从应用开发者的角度出发,来看实现一个数据库需要哪些基本功能,然后把这些功能细分成最小的模块再手把手一起实现。 对与应用开发者而言,一个数据库需要哪些必要的功能呢? 1)创建数据库和数据表:create database,schema, table等 2)存储数据:insert /update数据,或者从其他方式导入数据(比如csv文件) 3)读取查询数据:通过SQL语句,对数据进行读取和查询,比如sort,aggregate,filter等 因为要和数据库

bcbobo21cn的专栏 527

高通开发系列 - Camera之摄像头调试记录

记录一些调试内容

fulinux的博客 1217

数据库内核杂谈阅读笔记

数据库内核杂谈-InfoQ 文章目录简单数据库实现存储索引优化执行模式ParsingBindingOptimizingExecuting排序和聚合排序聚合JOIN优化器Query RewriteHeuristic approachCardinality EstimationCost Model事务、隔离、并发单机数据库扩展到分布式 简单数据库实现 一个sql查询语句,可以拆分成原子operator的叠加,把operator组建成operator tree,自底向上执行最终得到结果 Mysql和Postgr

Mrs_Two的博客 746

Ascend开发包Acllite安装

设置环境变量,配置程序编译依赖的头文件,库文件路径。“$HOME/Ascend”请替换“Ascend-cann-toolkit”包的实际安装路径。将YOLOV7原始模型转换为适配昇腾310处理器的离线模型(*.om文件),放在model路径下。运行完成后,会在样例工程的out目录下生成推理后的图片,显示对比结果如下所示。可以使用以下两种方式下载,请选择其中一种进行源码准备。请从以下链接获取该样例的输入图片,放在data目录下。执行以下命令,执行编译脚本,开始样例编译。执行运行脚本,开始样例运行。

如果想成为中心,那么就到中心去吧。 318

Django 6.0:有哪些新特性以及它们对实际项目的重要性

Django 6.0 感觉像是一个成熟的版本,它基于实际应用案例而打造。它减少了不必要的复杂性,同时扩展了框架的开箱即用功能。升级到 Django 6.0 不仅仅是为了保持版本更新,更是为了构建更易于维护、更安全、更能适应未来发展的应用程序。

iCloudEnd的博客 341

model存数据_数据库内核杂谈 存储

中文名:顾仲贤现任Facebook资深架构师专注于数据库,分布式系统,数据密集型应用后端架构与开发。拥有多年分布式数据库内核开发经验。发表数十篇数据库最顶级期刊并申请获得多项专利。对搜索,即时通讯系统有深刻理解。爱设计爱架构,持续跟进互联网前沿技术。个人经历: 2008年毕业于上海交大软件学院;12年,4年时间完成在美国加州大学戴维斯分校的学习并获得计算机硕士,博士学位;13-14年任P...

weixin_39519741的博客 323

【数据集3】高分辨率统计降尺度日值数据集NEX-GDDP的介绍与下载方法

对NEX-GDDP数据集进行介绍和下载说明

WW、forever的博客 2393

Redis杂谈

Redis持久化 redis持久化有两种,快照和日志,快照也就是RDB,原理是根据用户配置的信息fork一个子进程对内存数据写到rdb文件, Linux的fork系统调用是读写分离的,具有时刻性,当fork系统调用的时候,内存就会形成一个快照, 后续父进程对内存进行修改操作会对相应内存复制一份出来单独进行修改,不会影响子进程,读操作的内存和子进程的相同, 快照RDB也可以通过save命令和bgsave命令来执行,bgsave是异步执行,不会阻塞客户端 日志AOF是redis每操作一条写的命令就把这条命令写到

weixin_42002747的博客 141

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

杂谈 跟编程无关的事情22

暂时写这么多吧,估计中间会穿插的投简历找工作,到时候看情况再说。马上要9月一号开学了,我到时候找找现在好大学CS科班的课表,结合我的实际情况再修改下。我不是个很喜欢设立计划表的人,现在先尝试试试吧。大家有好的计划或者想法,观点欢迎留言。...

chen20100531的博客 489

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

(二)未来十至二十年的信息技术核心领域(AI、数据库、编程语言)完全零基础者的学习路径与技能提升策略

通过以上路径,零基础者可在2-3年内完成从入门到中级开发者的转型,并在AI或数据库领域建立扎实竞争力。需注意:技术迭代速度极快,需保持每年投入至少200小时于新工具学习(如量子计算模拟器、边缘AI框架)。未来十至二十年的信息技术核心领域(AI、数据库、编程语言)对零基础学习者而言,需从基础知识构建→领域专项突破→项目实战→持续迭代四个阶段展开。1. 百度飞桨(PaddlePaddle)1. 中国大学MOOC《人工智能数学基础》中文文档完善,适配国产硬件(如昇腾芯片)2. 《程序员的数学》(结城浩著)

gzgenius的博客 1793

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

博客导读

  2016-11-06 朱洁 大数据和云计算技术 闲来无事,简单整理下博客,方便大家阅读。 具体的不解释,自己看。   一、胡扯乱聊   一万小时定律 写给自己的2014 年中回顾 2015年完成的第一本英文原著书 写给自己定2015 第二次机器革命 《大数据架构详解》答疑(一) 为什么写《大数据架构详解》这本书 书籍推荐:《大数据架构详解》,京东已...

人生重要的不是所站的位置,而是所朝的方向。 227

互联网摸鱼日报(2023-06-06)

精选一线企业最佳生产实践,《Apache Doris 用户案例集》重磅发布!QCon 广州五场闭门会,深度交流企业研发、DevOps与平台工程、成本优化与稳定性等话题Apache Doris 用户案例集SeaTunnel毕业!首个国人主导的数据集成项目成为Apache顶级项目抗拒使用GPT-4和Copilot写代码,拥有19年编程经验的老程序员“面试”被淘汰阿里巴巴 GTS 资深技术专家朱超健确认担任 ArchSummit 深圳专题出品人并演讲AI 时代背景下的平台工程之路 | 极客有约一个简单的代码拼写错

weixin_43849685的博客 447

系统设计基本功:流量与存储需求估算

本文介绍了系统设计中流量估算与服务器需求评估的方法。主要内容包括:1)流量估算的三个指标(TPS、HPS、QPS)及经典案例练习,通过推特发帖场景演示如何计算QPS和存储需求;2)服务器配置估算方法,包括CPU核数计算公式、数据库服务器读写分离策略;3)存储需求估算要点,涉及存储方式选择和数据安全冗余。文章强调估算需结合实际业务场景,通过合理假设和简化计算快速得出近似结果,为系统设计提供基础参考。

啾啾头号大粉丝打工买粮博客 1280

InterviewGuide 职场实录:入职字节跳动一周全体验——工作强度、福利待遇与新人培养

> **导读**:本文整理自 InterviewGuide(阿秀的学习笔记)"互联网职场杂谈"系列的《入职字节一周了》,记录作者 2021 年 7 月入职字节跳动抖音部门(IES)第一周的亲身见闻,涵盖工作强度与团队作息、房补/三餐/下午茶等福利待遇、Bootcamp 与 Mentor 新人培养机制,以及"字节是否非 985/211 不要""是否只要科班生""校招社招最看重什么"三个校招同学最关心

gitblog_00595的博客 377

字节跳动、腾讯后台开发面经分享(2019.5)

作 者:天澄来 源:天澄技术杂谈广而告之:由于此订阅号换了个皮肤,系统自动取消了读者的公众号置顶。导致用户接受文章不及时。可以打开订阅号,选择置顶(标星)公众号,重磅干货...

公众号:Java后端 337

做了个决定

有些读者跟我讲,希望我能提供一套完整的Java学习手册,我计划用一年时间写套Java相关的后端学习指南,目录大致如下:公众号很多历史文章也在上面这个系列中,为了让整个知识体系化,历史文章我都会回炉重造,为了方便大家快速查找,弄个汇总文章的目录。那重点来了,上面这些板块,从哪一个开始呢?打算把决定权交给你们,你最希望最快看到什么,就投票选它: scrolling="no" frameborder="0" class="vote_iframe js_editor_vote_card" data-display-

安琪拉的博客 1188

互联网摸鱼日报(2023-03-22)

腾讯大规模云原生技术实践案例集不止于监控,夜莺V6全新升级为开源观测平台阿里副总裁贾扬清即将离职,独家回应称“暂未创立公司”腾讯发布2022研发大数据报告:Go语言蝉联最热编程语言行知数字中国数字化转型案例集锦麒麟桌面操作系统运行安卓移动应用的技术实践数据库内核杂谈(二十八)- 和ChatGPT一起精读 DynamoDB 2022 论文微服务先行者 James Lewis:别纠结单体还是微服务,面向服务才是正解GPT-4“失控”行为大赏:创建行动计划欲接管推特并取代马斯克,还引诱教授帮其制定逃跑计划IBM公

weixin_43849685的博客 607

互联网摸鱼日报(2023-02-02)

英特尔大规模降薪:CEO降薪25%,小时工和底层员工不受影响数据库内核杂谈(二十六)- 精读 DynamoDB 2022 论文(1)为谷歌工作 16 年被当“垃圾”无情辞退,数千网友留言:为公司“卖命”不值得《2022 龙蜥操作系统生态用户实践精选 》谷歌开源部门裁员“大地震”:多名开源功臣粗暴被裁,61岁程序员被迫再求职顶会论文 | 虚拟网络探测技术的探索与实践Just:Spring Boot应用的新命令行界面《流浪地球2》里的修网剧情,放进现实里可能更刺激2022,又一批 AI 大牛从大厂出走了股东再削

weixin_43849685的博客 651

Linux内存管理:虚拟地址空间(静态分析总篇)

由一个进程的虚拟(或逻辑)地址所构成的地址空间,一看就非常抽象,说了跟没说一样,现在让我们先抛弃抽象的概念,从一个故事开始:现在有一个千万富翁,他手里面有3千万,这个富翁有5个儿子,富翁对他的每一个儿子都说:儿啊,等我死后,我的三千万就都是你的了。此时他的每一个儿子都很开心,他们都认为等老爹死了就可以得到他的三千万,然后他们就开始幻想了,大儿子想等拿到钱后就买一百双AJ,二儿子想等拿到线后就去澳门当赌神.....但是此时钱还不是他们的,他们就只是在做白日梦而已。

TCW1121的博客 492

互联网摸鱼日报(2023-07-14)

数据库内核杂谈(三十五)- 向量数据库(3)Inverted File Index 和Locality Sensitive HashingMaaS赛道再添选手,京东推出言犀大模型:把大模型做实,把供应链做透OB Cloud 上新,4.1 版本支持云上单机分布式一体化能力七部门公布《生成式人工智能服务管理暂行办法》:鼓励采用安全可信的芯片、软件、工具、算力和数据资源AI大模型竞争白热化,算力优化才是“超车点”?向量检索在大模型应用场景的技术和实践“ AI 框架”与“ AI 中台”;在大模型训练实践中如何发挥作

weixin_43849685的博客 302
上一篇: clickhouse(五、运维查看后台进程并杀死)
下一篇: nginx服务器高并发配置详解(单机3w+并发)
yyoc97
博客等级 码龄12年 272粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值