Victor's Code Journey
Victor's Code Journey

varint编码

Varint是一种使用一个或多个字节序列化整数的方法,会把整数编码为变长字节。对于32位整型的4个字节数据经过Varint编码后需要1~5个字节,小的数字使用1个byte,大的数字使用5个bytes。64位整型数据编码后占用1~10个字节。

在实际场景中小数字的使用率远远多于大数字,因此通过Varint编码对于大部分场景都可以起到很好的压缩效果。

异步编程模型:Promises vs Futures

本文将介绍两种异步编程模型: Promise 和 Future。在计算机科学中,future、promise,是在某些并发编程语言中,指称用于同步程序执行的一种构造。由于某些计算尚未结束,故而需要一个对象来代理这个未知的结果。Future 和 Promise 的设计理念整体上非常相似,但是在不同的语言和框架实现中又存在一定的区别,对此,这里我们基于最广泛的定义进行介绍。

  • Future:表示异步任务的返回值,表示一个未来值(只读)的占位符,即未来值的消费者。
  • Promise:表示异步任务的执行过程,表示一个可写的单赋值容器,即未来值的生产者。

在同时包含 Future 和 Promise 的实现中,一般 Promise 对象会有一个关联的 Future 对象。当 Promise 创建时,Future 对象会自动实例化。当异步任务执行完毕,Promise 在内部设置结果,从而将值绑定至 Future 的占位符中。Future 则提供读取方法。将异步操作分成 Future 和 Promise 两个部分的主要原因是 为了实现读写分离,对外部调用者只读,对内部实现者只写。

Rust 所有权

Rust 为了解决内存安全问题,引入了所有权系统。

所有的程序都必须和计算机内存打交道,如何从内存中申请空间来存放程序的运行内容,如何在不需要的时候释放这些空间,成了重中之重,也是所有编程语言设计的难点之一。在计算机语言不断演变过程中,出现了三种流派:

  • 垃圾回收机制(GC),在程序运行时不断寻找不再使用的内存,典型代表:Java、Go
  • 手动管理内存的分配和释放, 在程序中,通过函数调用的方式来申请和释放内存,典型代表:C++
  • 通过所有权来管理内存,编译器在编译时会根据一系列规则进行检查。

Rust 选择了第三种,最妙的是,这种检查只发生在编译期,因此对于程序运行期,不会有任何性能上的损失。

形式化关系查询语言

查询语言是用户用来从数据库中请求信息的语言。查询语言可以分为过程化和非过程化的。在过程化语言中用户指导系统对数据库执行一系列操作以计算出结果。在非过程化语言中,用户只需要描述所需信息,而不用给出具体过程。

实际上使用的查询语言既包含过程化的成分,又包含非过程化的成分。在一些"纯"查询语言中,关系代数是过程化的,而元组关系演算和域关系演算是非过程的。

在解释关系代数操作之前,介绍一些基本概念:

  • 关系:在关系代数中,关系是由行和列组成的表,以结构化格式表示数据。每个关系都有一个唯一的名称,并由元组组成。
  • 元组:元组是关系中的一行,其中包含每个属性的一组值。它表示关系表中的单个数据条目或记录。
  • 属性:属性是关系中的列,每个列表示数据的特定特征或属性。例如,在“学生”关系中,属性可以是“姓名”、“年龄”和“年级”。
  • 域:域是属性可以具有的可能值的集合。它定义可以存储在关系的每一列中的数据类型,如整数、字符串或日期。

Trino Sql优化:Removing redundant ORDER BY

一些SQL构造(如ORDER BY)在许多情况下不会影响查询结果,并且会产生影响性能的负面影响(查询中的每个ORDER BY子句都代表一个排序执行计划)。如果用户无意中在没有效果的地方使用ORDER BY,可能会导致严重的性能下降和资源浪费。

sql规范(ISO 9075 Part 2)中说明:

  • 一个<query expression>可以包含一个可选的<order by clause>
  • <query expression>z中行的顺序仅由<query expression>直接包含的<order by clause>指定。

上述规范意味着,查询引擎可以自由地忽略任何不适合上下文的ORDER BY子句。

Trino源码学习-自定义函数

Presto Functions 并不能像 Hive UDF 一样动态加载,需要根据 Function 的类型,实现 Presto 内部定义的不同接口,在 Presto 服务启动时进行注册,然后才能在 SQL 执行时进行调用。

蓄水池采样算法

蓄水池采样算法是一种随机抽样算法,它能够在一个很大的集合中,抽取一部分样本,并保证每个样本的选取概率都是相等并随机的。

  • 特点:
    • 选取集合可以非常大,甚至不知道边界。
    • 每个样本的选取随机且概率相等。
    • 时间复杂度较低,O(n),节省内存。
  • 适用场景:
    • 在一些非常大的集合,或者未知大小的集合,不知道边界的集合,不知道文件总行数的情况下,随机抽取k个元素。
    • 保证每个元素抽取都是均匀随机的并且概率相等。
    • 尽量高效,节省内存地抽取

Trino源码学习-内存管理

Trino中的内存管理分为两块:

  • LocalMemoryManager: 在ServerMainModule中声明,用于管理当前节点的内存使用
  • ClusterMemoryManager: 在CoordinatorModule中声明,用于管理集群的内存使用