首页 文章 精选 留言 我的

精选列表

搜索[日活数],共10010篇文章
优秀的个人博客,低调大师

一文讲述数仓组件SysCache

摘要:SysCache是ThreadLocal结构,每个线程都具有各自的SysCache,其中存储的缓存信息由执行的业务决定。 本文分享自华为云社区《GaussDB(DWS)CBB组件之SysCache原理介绍》,作者:疯狂朔朔。 SysCache是什么?我们为什么需要SysCache? 在说明这个问题之前,我们需要简单说明一下GaussDB(DWS)的基本工作原理。 在我们链接数据库后,数据库将在后台为我们分配一根单独的线程,该线程负责执行我们发送的请求,假设我们按顺序发送以下语句: create table abc (a int, b int, c int); insert into abc values (1, 2, 3); insert into abc values (2, 3, 4); insert into abc values (3, 4, 5); 在创建表abc后,连续向abc中插入了3条数据,每条插入语句均需要访问abc的元数据,包括但不仅限于: pg_authid:读取用户相关信息, pg_resource_pool:读取资源池相关信息, pg_class:读取表相关元数据, pgxc_group:读取nodegroup相关信息, pg_namespace:读取schema相关信息, pg_type:读取字段类型, pg_attribute:读取表列属性信息。 可见,虽然简单执行了一条insert语句,其中涉及到的解析、校验逻辑是异常复杂的,会关联大量系统表相关查询操作。为了加快系统表查询速率,GaussDB(DWS)中针对系统表查询操作构建了SysCache缓存,以加速系统表查询速率。在上述例子中,语句b)在执行时,会访问相关系统表元数据,并通过SysCache进行缓存,之后在语句c)和语句d)执行时,直接从SysCache获取相应的缓存信息,以加速执行效率。 NOTE:实际上,GaussDB(DWS)中SysCache与PG的SysCache原理一致,不同之处在于,GaussDB(DWS)做了线程化改造,将PG多进程模型改为多线程模型。 NOTE:一句话解释SysCache,SysCache是GaussDB(DWS)内核系统表Tuple高速缓存。 SysCache存储结构 SysCache是ThreadLocal结构,每个线程都具有各自的SysCache,其中存储的缓存信息由执行的业务决定。下图展示了SysCache的大体结构: 图1 SysCache结构 SysCache在内存中以指针数组的形式进行存储,数组中每个元素均为一个CatCache结构体,CatCache中存储了系统表中的元数据信息。在CatCache中可能存在大量被缓存的数据,为加速查找,CatCache中设计了哈希数组,哈希数组包含多个哈希桶,每个哈希桶中记录了元数据链表信息,最终元数据是以双向链表的形式存于哈希桶中的。 以一个例子进行说明:假设执行以下语句: select * from public.abc; 系统在执行该语句时,在SysCache中会经历以下三步: 查找pg_class对应的CatCache:该语句的输入参数有三个,从pg_class查询Schema名为public,表名为abc的元数据信息。因此,执行该语句时,会直接查询pg_class对应的CatCache。 计算哈希值:通过输入参数public和abc计算其对应的哈希值,定位哈希桶的位置。 遍历哈希桶:遍历哈希桶中元数据信息,若匹配到public.abc的元数据,则直接返回该数据,若未匹配到,则需要进一步扫描pg_class,以读取元数据信息。 NOTE:一句话解释SysCache存储结构:SysCache存储结构本质上是多个哈希桶,每个哈希桶中元数据是以双向链表的形式进行存储。 SysCache对外接口 SysCache对外接口主要包括两个: 查询SysCache和释放SysCache,这两个方法需要配对使用,在SysCache返回查询结果后,需要再次调用释放SysCache接口,以释放SysCache相关数据。 下图展示了查询SysCache的主要步骤: 图2 查询SysCache流程图 在查询SysCache前,需要确保CatCache初始化,之后,需要依据查询的key信息计算哈希值,以定位哈希桶位置。对于SysCache而言,数据的key最多为4个,在上述例子中,key1=public,key2=abc,key3和key4将以0进行补全。 计算哈希值之后,将扫描对应哈希桶中的双向链表,逐个进行匹配,若未匹配到,将进一步扫描该系统表的数据页。若数据页中也没有该数据,则说明不存在该数据,需要建立一个假的CatCTup,并标记为negative,以提升查询miss效率,若数据页中包含该数据,则将该条数据进行封装,建立CatCTup,并插入到对应的哈希桶中。 在匹配到CatCTup后,需要将当前CatCTup的引用数量refcount加一,并进行返回,refcount的作用是计数引用,以防止被错误释放。 对于释放SysCache,其主要步骤是将引用数量refcount减一,并释放refcount为0的资源。 图3 释放SysCache流程图 NOTE:在查询SysCache和释放SysCache的过程中,会将当前匹配的tuple与CurrentResourceOwner进行绑定,该操作的主要目的是在线程退出或者事务提交时进行资源泄漏的校验。 NOTE:SysCache支持模糊查询,接口为SearchCatCacheList,有兴趣的小伙伴可自行百度,本问只以最简单的情况进行介绍。 SysCache失效机制 在解释SysCache失效之前,需要先解释一下SysCache为什么需要失效。我们说过,SysCache为ThreadLocal结构,假设线程1在SysCache中缓存了表abc的元数据,而线程2删除了表abc,那么线程1中abc的元数据需要进行失效处理,GaussDB(DWS)中SysCache失效机制主要通过失效消息队列实现。 图4 SysCache失效机制 我们以一个简单例子进行说明,上图为语句执行过程中,SysCache失效消息发送流程图。 在事务开始时,本线程将主动接收并处理失效消息队列中的消息。在开启子事务时,会初始化失效消息存储结构,主要包括两部分结构,CurrnetCmdInvalidMsgs(当前失效消息),主要存储当前执行语句产生的失效消息,PriorCmdInvalidMsgs(历史失效消息),主要用于存储从事务开启到当前时间点,产生的失效消息,其中CurrnetCmdInvalidMsgs和PriorCmdInvalidMsgs均为ThreadLocal结构。 在每个语句执行前,会将前一个语句的失效消息从CurrnetCmdInvalidMsgs移动到PriorCmdInvalidMsgs。之后在语句执行完毕以后,将失效消息加入到CurrnetCmdInvalidMsgs。 在子事务提交时,分为两种情况,若事务rollback,则需要失效本地所有的PriorCmdInvalidMsgs。若事务提交,则需要将子事务的PriorCmdInvalidMsgs和CurrnetCmdInvalidMsgs加入到父事务的PriorCmdInvalidMsgs中,并将当前事务信息切换为父事务环境。 在父事务提交时,同样分为两种情况,若事务rollback,则需要失效本地所有的PriorCmdInvalidMsgs。若事务提交,则需要向失效消息队列提交该线程产生的全部失效消息。 NOTE:一句话解释SysCache失效机制,内核在事务提交成功时会主动将本线程产生的失效消息提交到失效消息队列,供其他线程同步。 NOTE:此处并未详细解释失效消息队列相关内容,大家可将失效消息队列当作黑盒,失效消息队列对外提供失效消息提交和读取接口,用于失效消息同步,后续文章会详细介绍失效消息队列相关内容。 想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料~ 点击关注,第一时间了解华为云新鲜技术~

优秀的个人博客,低调大师

数仓无损压缩算法:gzip算法

摘要:一种无损的压缩数据格式,是一个在类Unix上的一种文件解压缩软件。 本文分享自华为云社区《GaussDB(DWS) gzip算法简介》,作者:hw0086。 【算法原理】 gzip是一种无损压缩算法,其基础为Deflate,Deflate是LZ77与哈弗曼编码的一个组合体。它的基本原理是:对于要压缩的文件,首先使用LZ77算法的一个变种进行压缩,对得到的结果再使用哈夫曼编码(根据情况,使用静态哈弗曼编码或动态哈夫曼编码)的方法进行压缩。Deflate最初作为LZW以及其他受专利保护的数据压缩算法的替代版本而设计的,当时那些专利限制了compress以及其它一些流行的归档工具的应用。 【压缩核心Deflate】 1.LZ77算法 LZ77的核心思路是如果一个串中有两个重复的串中有两个重复的串,那么只需要知道后面的串与前面串重复的长度和后面串起始字符与前面串起始字符相对于起始位置的距离。 例如:ABCCDEFABCCDEGH 通过LZ77算法可压缩为ABCCDEF(7,6)GH,其中7表示重复串起始字符A到前面串起始字符的距离,5表示重复部分的长度(ABCCDE)。 LZ77采用滑动窗口(sliding-window compression)来实现这个算法,扫描头从串的头部开始扫描,在扫描头的前面有一个长度未N的滑动窗口。若发现扫描头处的串和窗口里的最长匹配串是相同的,则用(两个串之间的距离, 串长度)来代替后一个重复的串,同时还需要添加一个表示是真实串还是替换后的串的字节在前面以方便解压。实际过程中滑动窗口的大小固定,匹配的串也有最小长度的限制,以方便(标识+串之间距离+串长度)之和所占用的字节是固定的。 2.哈夫曼编码 哈夫曼编码是数据结构课程中一种常见的算法。哈夫曼编码使用变长编码表对源符号进行编码,变长编码表通过一种评估来源符号出现概率的方法得到,出现概率较高的字母使用较短的编码,反之出现概率低的使用较长的编码,这样使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。通过构造Huffman Tree的方式给字符重新编码,避免一个叶子的路径是另一个叶子路径的前缀,以保证出现频率越高的字符占用的字节越少。 例如:给英文单字“F O R G E T”进行哈弗曼编码,将每个英文字母出现频率由小排到大,如下图。 每个字母与都代表一个终端节点(叶子节点),比较留个字母中每个字母出现的频率,将最小的两个字母相加合成一个新的节点。如下图。组成哈弗曼树。 将上图给定的哈弗曼树的所有左链接设为0.右链接设为1,从根节点到叶子节点一次记录每个字母的编码,所得每个字母的编码表如下图。 【文件格式】 10字节的头,包含幻数、版本号以及时间戳 可选的扩展头,如原文件名 文件体,包括DEFLATE压缩的数据 8字节的尾注,包括CRC-32校验和以及未压缩的原始数据长度 通常gzip仅用来压缩单个文件,再对多个文件的压缩归档通常会将这些文件合并成一个tar文件,再使用gzip对tar文件进行压缩,最后生成.tar.gz或者.tgz文件,即“tar压缩包”或者“tarball”。 【应用】 -c,--stdout将解压缩的内容输出到标准输出,原文件保持不变 -d,--decompress解压缩 -f,--force强制覆盖旧文件 -l,--list列出压缩包内储存的原始文件的信息(如,解压后的名字、压缩率等) -n,--no-name压缩时不保存原始文件的文件名和时间戳,解压缩时不恢复原始文件的文件名和时间戳(此时,解出来的文件,其文件名为压缩包的文件名) -N,--name压缩时保存原始文件的文件名和时间戳,解压缩时恢复原始文件的文件名和时间戳 -q,--quiet抑制所有警告信息 -r,--recursive递归 -t,--test测试压缩文件完整性 -v,--verbose冗余模式(即显示每一步的执行内容) -1、-2、...、-9压缩率依次增大,速度依次减慢,默认为-6 点击关注,第一时间了解华为云新鲜技术~

优秀的个人博客,低调大师

observablehq 美国 COVID-19 确诊数曲线

本线状图用于显示每天美国 COVID-19 的总计感染用户曲线。我们使用的是在线 JSON 数据,数据是通过 AWS 进行读取的。 你可以直接访问下面的链接来获得我们处理上传的数据。 https://cdn.ossez.com/dataset/json/covid19/covid19-confirmed-daily-us.json 虽然我们每天都会自动上传一些数据,但是你可能的更新数据每次都不一样。 我们主要也是希望通过这个平台来学习 D3 图表的使用。 你可以直接访问下面的链接: https://observablehq.com/@yuchenghu/untitled?collection=@yuchenghu/covid-19 对代码修改后进行编译,需要注意的是我们数据是上传到 AWS 的 JSON 数据,数据的来源是从 https://covidtracking.com/api 下载后处理的。 下载的方式是通过 Spring Batch 构建一个批量处理程序,每天定时获得最新数据后存储到本地数据库中,然后从本地数据库中导出为 JSON 数据。我也认为这种处理方式过于繁琐,其实在内存中就可以实现了,在获得原数据的 API 后,你可以直接将源数据转换为对象。 然后利用 gson 将对象转换为需要的字符串后输出成 JSON 就可以了。 如果你对 AWS API 比较了解和熟悉的话,你可以利用 AWS 的API 直接将生成的 json 数据上传到 S3 上存储。 做这个小项目的主要是为了熟悉 Spring Batch 的使用,D3 数据图表的配置,AWS API 的存储和使用。 麻雀虽小,五脏俱全,能够帮助你很好的了解微服务,云平台,数据结构等很多知识。 项目的源代码,我们已经发布到 GitHub 上了。https://github.com/ossez-com/covid-19 如果你有兴趣的话也可以参考。 https://www.cwiki.us/pages/viewpage.action?pageId=62619834

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册