【入门篇】ClickHouse最优秀的开源列式存储数据库
文章目录
- 一、什么是ClickHouse?
- OLAP场景的关键特征
- 列式数据库更适合OLAP场景的原因
- 输入/输出
- CPU
- 1.1 ClickHouse的定义与发展历程
- 1.2 ClickHouse的版本介绍
- 二、ClickHouse的主要特性
- 2.1 高性能的列式存储
- 2.2 实时的分析查询
- 2.3 高度可扩展性
- 2.4 数据压缩
- 2.5 SQL支持
- 2.6 数据复制和容错
- 三、ClickHouse与其他数据库的对比
- 3.1 与传统的关系型数据库对比
- 3.1.1 数据模型
- 3.1.2 性能
- 3.1.3 可扩展性
- 3.1.4 适用场景
- 3.1.5 SQL支持
- 3.1.6 数据压缩
- 3.2 与其他的列式数据库对比
- 四、ClickHouse的应用场景
- 4.1 大数据实时分析
- 4.2 日志分析系统
- 4.3 时序数据存储
一、什么是ClickHouse?
ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。
在传统的行式数据库系统中,数据按如下顺序存储:
Row | WatchID | JavaEnable | Title | GoodEvent | EventTime |
---|---|---|---|---|---|
#0 | 89354350662 | 1 | Investor Relations | 1 | 2016-05-18 05:19:20 |
#1 | 90329509958 | 0 | Contact us | 1 | 2016-05-18 08:10:20 |
#2 | 89953706054 | 1 | Mission | 1 | 2016-05-18 07:38:00 |
#N | … | … | … | … | … |
处于同一行中的数据总是被物理的存储在一起。
常见的行式数据库系统有:MySQL
、Postgres
和MS SQL Server
。
在列式数据库系统中,数据按如下的顺序存储:
Row: | #0 | #1 | #2 | #N |
---|---|---|---|---|
WatchID: | 89354350662 | 90329509958 | 89953706054 | … |
JavaEnable: | 1 | 0 | 1 | … |
Title: | Investor Relations | Contact us | Mission | … |
GoodEvent: | 1 | 1 | 1 | … |
EventTime: | 2016-05-18 05:19:20 | 2016-05-18 08:10:20 | 2016-05-18 07:38:00 | … |
这些示例只显示了数据的排列顺序。来自不同列的值被单独存储,来自同一列的数据被存储在一起。
常见的列式数据库有: Vertica、 Paraccel (Actian Matrix,Amazon Redshift)、 Sybase IQ、 Exasol、 Infobright、 InfiniDB、 MonetDB (VectorWise, Actian Vector)、 LucidDB、 SAP HANA、 Google Dremel、 Google PowerDrill、 Druid、 kdb+。
不同的数据存储方式适用不同的业务场景,数据访问的场景包括:进行了何种查询、多久查询一次以及各类查询的比例;每种类型的查询(行、列和字节)读取多少数据;读取数据和更新之间的关系;使用的数据集大小以及如何使用本地的数据集;是否使用事务,以及它们是如何进行隔离的;数据的复制机制与数据的完整性要求;每种类型的查询要求的延迟与吞吐量等等。
系统负载越高,依据使用场景进行定制化就越重要,并且定制将会变的越精细。没有一个系统能够同时适用所有不同的业务场景。如果系统适用于广泛的场景,在负载高的情况下,要兼顾所有的场景,那么将不得不做出选择。是要平衡还是要效率?
OLAP场景的关键特征
- 绝大多数是读请求
- 数据以相当大的批次(> 1000行)更新,而不是单行更新;或者根本没有更新。
- 已添加到数据库的数据不能修改。
- 对于读取,从数据库中提取相当多的行,但只提取列的一小部分。
- 宽表,即每个表包含着大量的列
- 查询相对较少(通常每台服务器每秒查询数百次或更少)
- 对于简单查询,允许延迟大约50毫秒
- 列中的数据相对较小:数字和短字符串(例如,每个URL 60个字节)
- 处理单个查询时需要高吞吐量(每台服务器每秒可达数十亿行)
- 事务不是必须的
- 对数据一致性要求低
- 每个查询有一个大表。除了他以外,其他的都很小。
- 查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的RAM中
很容易可以看出,OLAP场景与其他通常业务场景(例如,OLTP或K/V)有很大的不同, 因此想要使用OLTP或Key-Value数据库去高效的处理分析查询场景,并不是非常完美的适用方案。例如,使用OLAP数据库去处理分析请求通常要优于使用MongoDB或Redis去处理分析请求。
列式数据库更适合OLAP场景的原因
列式数据库更适合于OLAP场景(对于大多数查询而言,处理速度至少提高了100倍),下面详细解释了原因(通过图片更有利于直观理解):
行式
列式
看到差别了么?下面将详细介绍为什么会发生这种情况。
输入/输出
- 针对分析类查询,通常只需要读取表的一小部分列。在列式数据库中你可以只读取你需要的数据。例如,如果只需要读取100列中的5列,这将帮助你最少减少20倍的I/O消耗。
- 由于数据总是打包成批量读取的,所以压缩是非常容易的。同时数据按列分别存储这也更容易压缩。这进一步降低了I/O的体积。
- 由于I/O的降低,这将帮助更多的数据被系统缓存。
例如,查询«统计每个广告平台的记录数量»需要读取«广告平台ID»这一列,它在未压缩的情况下需要1个字节进行存储。如果大部分流量不是来自广告平台,那么这一列至少可以以十倍的压缩率被压缩。当采用快速压缩算法,它的解压速度最少在十亿字节(未压缩数据)每秒。换句话说,这个查询可以在单个服务器上以每秒大约几十亿行的速度进行处理。这实际上是当前实现的速度。
CPU
由于执行一个查询需要处理大量的行,因此在整个向量上执行所有操作将比在每一行上执行所有操作更加高效。同时这将有助于实现一个几乎没有调用成本的查询引擎。如果你不这样做,使用任何一个机械硬盘,查询引擎都不可避免的停止CPU进行等待。所以,在数据按列存储并且按列执行是很有意义的。
有两种方法可以做到这一点:
- 向量引擎:所有的操作都是为向量而不是为单个值编写的。这意味着多个操作之间的不再需要频繁的调用,并且调用的成本基本可以忽略不计。操作代码包含一个优化的内部循环。
- 代码生成:生成一段代码,包含查询中的所有操作。
这是不应该在一个通用数据库中实现的,因为这在运行简单查询时是没有意义的。但是也有例外,例如,MemSQL使用代码生成来减少处理SQL查询的延迟(只是为了比较,分析型数据库通常需要优化的是吞吐而不是延迟)。
请注意,为了提高CPU效率,查询语言必须是声明型的(SQL或MDX), 或者至少一个向量(J,K)。 查询应该只包含隐式循环,允许进行优化。
1.1 ClickHouse的定义与发展历程
ClickHouse是一个开源的列式数据库管理系统(DBMS)用于在线分析处理(OLAP)。 它能够使用SQL查询实时生成分析数据报告。ClickHouse能够以极高的速度处理多达数十亿甚至数万亿行的数据。这是因为ClickHouse是一个列式数据库,它按列存储数据,使得数据查询变得非常高效。除了高效查询,ClickHouse还提供了高度的数据压缩,使得物理存储占用最小化。
ClickHouse由俄罗斯的互联网公司Yandex开发,Yandex是俄罗斯最大的搜索引擎和Web门户。ClickHouse最初是为了Yandex.Metrica项目开发的,这是全球第三大网页分析系统。ClickHouse于2016年被开源,并迅速在全球范围内获得了广泛的应用,被许多公司用于处理和分析大规模的数据。
1.2 ClickHouse的版本介绍
以下是ClickHouse的一些主要版本及其特性:
-
ClickHouse 1.1:这是首个公开发布的版本,主要特性包括列式存储、SQL查询、数据压缩等基础功能。
-
ClickHouse 1.2:增加了实时数据插入和查询的功能。
-
ClickHouse 1.3:优化了查询性能,可以更快地处理复杂查询。
-
ClickHouse 20.1:新增了数据复制和分布式查询的优化功能。
-
ClickHouse 20.3:提升了在大规模并行查询处理上的性能。
-
ClickHouse 21.1:优化了数据存储和查询性能,增加了对SQL标准的支持。
-
ClickHouse 21.3:最新稳定版本,优化了查询速度,增强了对高并发查询的处理能力。
以上版本中,每一次新版本的发布都包含了新功能的添加和对旧功能的优化,展现了ClickHouse快速发展和不断进步的历程。
二、ClickHouse的主要特性
2.1 高性能的列式存储
Clickhouse是一个列式数据库,这意味着它按列存储数据,而不是按行。例如,如果您有一个包含用户ID,用户名和密码的表,ClickHouse将分别存储用户ID,用户名和密码。当你查询特定的用户名时,只有用户名的列被加载和扫描,而不是整个表。这大大提高了查询性能,因为只有相关的数据被处理。
2.2 实时的分析查询
ClickHouse由于其优化的查询执行引擎和列式存储特性,使其能够在几秒钟内处理大量数据并生成报告。例如,如果你正在运行一个电子商务网站,并希望了解在过去的一小时内,哪些产品被查看次数最多,ClickHouse可以迅速返回结果。
2.3 高度可扩展性
如果你的业务正在快速增长,ClickHouse的高度可扩展性能够应对这种情况。例如,如果你最初在一台服务器上运行ClickHouse,但随着数据量的增加,你可以轻松地添加更多的服务器到你的ClickHouse集群,而不会影响到你现有的查询和报告。
2.4 数据压缩
ClickHouse在存储数据时会对数据进行压缩。例如,如果你的表有一列是日期,这列数据有很多重复的日期值,那么ClickHouse会使用数据压缩技术,如LZ4或ZSTD,将这些重复值压缩,从而节省存储空间,并提高查询性能。
2.5 SQL支持
尽管ClickHouse是一个列式数据库,但它支持SQL查询语言,包括SELECT,INSERT,UPDATE和DELETE语句。例如,你可以用如下SQL语句查询在过去一小时内被查看次数最多的产品:
SELECT product_id, COUNT(*) as view_count
FROM product_views
WHERE view_time > now() - INTERVAL 1 HOUR
GROUP BY product_id
ORDER BY view_count DESC
LIMIT 10;
2.6 数据复制和容错
ClickHouse支持数据复制和容错,这意味着你的数据会被复制到集群中的其他服务器,确保即使某些服务器发生故障,你的数据也不会丢失。例如,如果你有3台服务器,你的数据将被复制3次,任何一台服务器的故障都不会导致数据丢失。同时,数据复制也可以提高查询性能,因为查询可以在多个副本上并行执行。
三、ClickHouse与其他数据库的对比
3.1 与传统的关系型数据库对比
对比项 | 传统关系型数据库(如MySQL, PostgreSQL) | ClickHouse |
---|---|---|
数据模型 | 行存储,适合OLTP工作负载 | 列存储,适合OLAP工作负载 |
性能 | 对大规模数据分析可能存在性能瓶颈 | 高性能,优化了查询执行引擎 |
可扩展性 | 通常运行在单个服务器上,需要手动进行分片和复制 | 分布式系统,自动进行分片和复制 |
适用场景 | 结构化的事务性数据处理,如银行交易、订单管理 | 大数据和实时分析场景,如日志数据分析、实时报告 |
SQL支持 | 支持标准SQL,提供丰富的索引类型和事务支持 | 支持SQL,但不支持事务和一些复杂的SQL特性 |
数据压缩 | 通常不会进行数据压缩,占用存储空间大 | 会对数据进行压缩,节省存储空间和提高查询性能 |
3.1.1 数据模型
-
传统的关系型数据库如MySQL和PostgreSQL通常使用行存储数据。这种方式在处理事务性的OLTP(在线事务处理)工作负载时表现得很好,因为这些工作负载往往只涉及到表中的一小部分行。
-
ClickHouse则采用列存储方式,适用于OLAP(在线分析处理)工作负载,这种工作负载通常涉及到对大量行的聚合和分析。列存储的优势在于只需读取需要的列,可以大大降低I/O负载,提高查询性能。
3.1.2 性能
-
传统关系型数据库在处理大规模数据分析任务时可能会遇到性能瓶颈。例如,对数亿条记录进行分组和聚合的查询可能需要花费很长时间。
-
ClickHouse的查询执行引擎高度优化,能够利用现代多核和矢量处理硬件,查询性能非常高。它能够在几秒钟内处理和分析大量数据。
3.1.3 可扩展性
-
传统关系型数据库通常在单个服务器上运行,虽然有一些关系型数据库提供了分片和复制的功能,但这通常需要手动配置,而且在扩展性和复杂性之间需要进行权衡。
-
ClickHouse设计为分布式系统,提供了自动分片和复制的功能。它可以轻松地通过添加更多的服务器来扩展处理能力和存储容量。
3.1.4 适用场景
-
传统关系型数据库适合处理结构化的事务性数据,例如银行交易、订单管理等应用。
-
ClickHouse则更适合大数据和实时分析场景,例如日志数据分析、实时报告、时间序列数据分析等。
3.1.5 SQL支持
-
传统关系型数据库通常支持标准SQL,并提供了丰富的索引类型和事务支持。但在大规模数据分析任务中,可能需要使用复杂的SQL和索引优化来提高性能。
-
ClickHouse也支持SQL,但不支持事务和一些复杂的SQL特性。然而,它可以执行复杂的分析查询,如多维度聚合、窗口函数等,而无需索引优化。
3.1.6 数据压缩
-
传统关系型数据库通常不会对数据进行压缩,占用的存储空间较大。
-
ClickHouse会对数据进行压缩,以节省存储空间,同时也能提高查询性能。
3.2 与其他的列式数据库对比
这些列式数据库具有不同的特点和适用场景。ClickHouse在大规模数据处理和实时分析方面表现出色,而Apache Cassandra适用于分布式数据存储和高吞吐量写入。Apache Druid专注于实时OLAP查询,而Vertica则提供高性能的大规模数据处理和复杂查询。选择适合的列式数据库取决于具体的需求和应用场景。
特性 | ClickHouse | Apache Cassandra | Apache Druid | Vertica |
---|---|---|---|---|
存储模型 | 列式存储 | 列式存储 | 列式存储 | 列式存储 |
查询性能 | 高性能,适用于大规模数据和复杂查询 | 高性能,适用于大规模数据和分布式查询 | 高性能,适用于实时OLAP查询 | 高性能,适用于大规模数据和复杂查询 |
压缩率 | 高压缩率,节省存储空间 | 较低压缩率 | 可选的压缩算法,节省存储空间 | 中等压缩率 |
可扩展性 | 高度可扩展,支持水平扩展和分布式架构 | 高度可扩展,支持分布式架构 | 高度可扩展,支持分布式架构 | 高度可扩展,支持分布式架构 |
数据复制和容错 | 支持数据复制和故障转移,提供高可用性 | 支持数据复制和故障转移,提供高可用性 | 支持数据复制和故障转移,提供高可用性 | 支持数据复制和故障转移,提供高可用性 |
查询语言 | 完全支持标准SQL语法,包括高级功能 | CQL (Cassandra Query Language) | SQL-like语法 | 完全支持标准SQL语法 |
数据类型 | 支持各种数据类型,包括时间序列和数组 | 支持常见的数据类型 | 支持常见的数据类型 | 支持常见的数据类型 |
实时分析 | 支持实时分析查询,低延迟响应 | 不适合实时分析,更适合高吞吐量的写入 | 适合实时OLAP查询,低延迟响应 | 支持实时分析查询,低延迟响应 |
数据一致性 | 强一致性,数据更新即时可见 | 最终一致性,需要时间同步 | 最终一致性,需要时间同步 | 强一致性,数据更新即时可见 |
开源项目 | 是 | 是 | 是 | 否 |
四、ClickHouse的应用场景
4.1 大数据实时分析
ClickHouse是一个高性能的列式数据库,它的列式存储结构使得它非常适合大数据实时分析。在此应用场景中,大量的结构化数据(例如,用户行为数据、交易数据等)被实时地写入到ClickHouse中,然后使用SQL语句快速地进行分析查询。比如,电商公司可能需要实时分析用户的购买行为,以便于动态调整它们的销售策略。
4.2 日志分析系统
日志分析是ClickHouse的一个重要应用场景。许多公司都有大量的系统日志和应用日志需要处理。 ClickHouse可以接收和存储这些日志数据,并提供SQL接口进行查询分析,如分析系统故障的原因、用户的访问行为等。例如,一个网络安全公司可能使用ClickHouse来收集和分析他们的防火墙日志,以便于快速发现并应对网络攻击。
4.3 时序数据存储
时序数据是指随时间变化而变化的数据,例如股票价格、温度读数等。ClickHouse的列式存储结构使得它非常适合存储和查询时序数据。在此应用场景中,ClickHouse不仅可以用于存储大量的时序数据,还可以提供高效的数据查询和分析。比如,一个金融公司可能使用ClickHouse来存储和分析他们的股票交易数据,以便于快速发现市场趋势和交易机会。
相关文章:
【入门篇】ClickHouse最优秀的开源列式存储数据库
文章目录 一、什么是ClickHouse?OLAP场景的关键特征列式数据库更适合OLAP场景的原因输入/输出CPU 1.1 ClickHouse的定义与发展历程1.2 ClickHouse的版本介绍 二、ClickHouse的主要特性2.1 高性能的列式存储2.2 实时的分析查询2.3 高度可扩展性2.4 数据压缩2.5 SQL支…...
【C++ Exceptions】异常处理的成本
最低成本 exception是C的一部分,编译器必须支持。即使从未使用任何异常处理机制,也必须付出一些空间放置某些数据结构,付出一些时间随时保持那些数据结构的正确性。 第二种成本:来自try语句块 避免非必要的try语句块。 粗略估计&a…...
API接口:原理、实现及应用
API(Application Programming Interface)接口是现代软件开发中不可或缺的一部分。它们提供了一种机制,使得不同的应用程序和服务可以相互通信,共享数据和功能。在这篇文章中,我们将探讨API接口的原理、实现及应用&…...
SpringBoot学习笔记(项目创建,yaml,多环境开发,整合mybatis SMM)
一、SpringBoot入门 1.1 SpringBoot概述 SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。 Spring程序缺点:配置繁琐,依赖设置繁琐。SpringBoot程序优点:自动装配,…...
Linux内核分析:输入输出,字符与块设备 31-35
CPU 并不直接和设备打交道,它们中间有一个叫作设备控制器(Device Control Unit)的组件,例如硬盘有磁盘控制器、USB 有 USB 控制器、显示器有视频控制器等。这些控制器就像代理商一样,它们知道如何应对硬盘、鼠标、键盘、显示器的行为。 输入输出设备我们大致可以分为两类…...
Linux抓包工具tcpdump
一、介绍 tcpdump是一个抓包工具,用于实时捕获和分析网络流量。它通常在unix和linux操作系统上使用。tcpdump能够捕获流经网络接口的数据包,并显示或保存它们以供进一步分析。它提供有关每个数据包的详细信息,包括源IP地址、目标IP地址、使用…...
Qt消息机制和事件
事件 事件是由Qt或者系统在不同时刻发出的,当敲下鼠标,或者按下键盘,或者当窗口需要重新绘制的时候,就会发出一个相应的事件,一些操作由用户的操作发出,一些则由系统自动发出,如系统定时器事件等。 Qt 中所有事件类都继承于 QEvent。 在事件对象创建完毕后, Qt 将这个…...
LeetCode-739-每日温度-单调栈
题目描述:给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 题目…...
MyBatis中当实体类中的属性名和表中的字段名不一样,怎么办
方法1: 在mybatis核心配置文件中指定,springboot加载mybatis核心配置文件 springboot项目的一个特点就是0配置,本来就省掉了mybatis的核心配置文件,现在又加回去算什么事,总之这种方式可行但没人这样用 具体操作&…...
Flutter框架和原理剖析
Flutter是Google推出并开源的跨平台开发框架,主打跨平台、高保真、高性能。开发者可以通过Dart语言开发Flutter应用,一套代码同时运行在ios和Android平台。不仅如此,flutter还支持web、桌面、嵌入应用的开发。flutter提供了丰富的组件、接口&…...
NFS:使用 Ansible 自动化配置 NFS 客户端服务端
考试顺便整理博文内容整理涉及使用 Ansible 部署 NFS 客户端和服务端理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃…...
IntelliJ IDEA使用——Debug操作
文章目录 版本说明图标和快捷键查看变量计算表达式条件断点多线程调试 版本说明 当前的IntelliJ IDEA 的版本是2021.2.2(下载IntelliJ IDEA) ps:不同版本一些图标和设置位置可能会存在差异,但应该大部分都差不多。 图标和快捷键…...
uniapp项目实践总结(十八)自定义多列瀑布流组件
导语:有时候展示图片等内容,会遇到图片高度不一致的情况,这时候就不能使用等高双列或多列展示了,这时候会用到瀑布流的页面布局,下面就一起探讨一下瀑布流的实现方法。 目录 准备工作原理分析实战演练案例展示 准备工…...
Ubuntu 22.04LTS + 深度学习环境安装全流程
一、 CUDA Toolkit 安装 1. 选择需要安装的版本(下载地址) 2. 选择自己的系统版本获取下载地址和安装指令 3. 运行安装指令进行安装 wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run sudo sh cuda_12.2.…...
【lesson7】git的介绍及使用
文章目录 什么是gitgit的历史git使用在gitee上创建仓库git clone HTTPS地址git add .git add 文件名git commit “日志”git pushgit loggit rm 文件名git statusgit pull 什么是git git是版本控制器,那么什么是版本控制器呢? 下面讲个故事为大家讲解一…...
Keepalived+LVS高可用集群
目录 一、keepalived介绍: 二、keepalived工具介绍: (1)管理 LVS 负载均衡软件: (2)支持故障自动切换: (3)实现 LVS 负载调度器、节点服务器的高可用性&…...
AK 9.12 百度Java后端研发B卷 笔试
T1(博弈论) #include <bits/stdc.h>#define endl \nusing namespace std;typedef long long LL;const int N 1e5 10;int n, m, t;void solve() {cin >> n >> m; t n m - 2;if(t & 1) cout << "Yes" << endl;else cout <&l…...
使用Python和XPath解析动态JSON数据
JSON动态数据在Python中扮演着重要的角色,为开发者提供了处理实时和灵活数据的能力。Python作为一种强大的编程语言,提供了丰富的工具和库来处理动态JSON数据使得解析和处理动态JSON数据变得简单和高效。例如,使用内置的json模块,…...
记录一个iOS实现视频分片缓存拖拽快进不能播放的问题
代码现状 首先来看一下我们将视频数据塞给请求的代码 - (void)finishLoadingWithLoadingRequest:(IdiotResourceTask *)task {// printf("哈哈执行到这里执行到到这里\n");printf("哈哈哈数量数量%ld\n", self.taskList.count);//填充信息task.loadingRe…...
如何解决 503 Service Temporarily Unavailable?
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🛠️ 全栈技术 Full Stack: 📚…...
keil报错:Flash Download failed - Could not load file‘..\..\Output\Template.axf
keil报错:Flash Download failed - Could not load file’…\Output\Template.axf,如下图所示: 原因是很多.h文件没有定义位置,可以按照下图操作: 而且,如果是想使用压缩包,那一定要关闭keil后…...
从一到无穷大 #16 ByteSeries,思考内存时序数据库的必要性
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 引言 在[3]中我基于Gorilla讨论了时序数据库设置cache的可行性,最后得出结论&…...
分支和远程仓库
分支 查看分支 git branch -v 创建分支 git branch 分支名 切换分支 git checkout 分支名 合并分支 git merge 分支名 把指定的分支合并到当前分支上 查看当前所有远程地址别名: git remote -v 起别名: git remote add 别名 远程地址推送本地分支上的…...
编译原理 —— 编译器
文章目录 编译原理阶段词法分析器语法分析器语义分析器中间代码生成器代码优化器代码生成器 编译原理阶段 编译器分为9个阶段来将我们所编写的高级代码编译为计算机可执行的机器码 源程序词法分析器语法分析器语义分析器中间代码生成器独立于机器的代码优化器代码生成器依赖于…...
Python灰帽编程——错误异常处理与面向对象
文章目录 错误异常处理与面向对象1. 错误和异常1.1 基本概念1.1.1 Python 异常 1.2 检测(捕获)异常1.2.1 try except 语句1.2.2 捕获多种异常1.2.3 捕获所有异常 1.3 处理异常1.4 特殊场景1.4.1 with 语句 1.5 脚本完善 2. 内网主机存活检测程序2.1 scap…...
【每日一题】154. 寻找旋转排序数组中的最小值 II
154. 寻找旋转排序数组中的最小值 II - 力扣(LeetCode) 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到࿱…...
Linux中如何获取输入设备(如触摸屏、按键等)的事件信息
Linux中如何获取输入设备(如触摸屏、按键等)的事件信息 在Linux中,可以使用getevent命令来获取输入设备(如触摸屏、按键等)的事件信息。如果你想在C程序中获取输入设备事件,可以使用以下步骤: …...
Java学习day05:排序,选择、冒泡、快速、二分、杨辉三角
声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!) Java学习day05:排序࿰…...
Mybatis的mapper.xml批量插入、修改sql
今天要有个功能,要进行一批数据的插入和修改,为了不频繁调用数据库,所以想到了批量插入和修改,因为从毕业后,就没写过批量插入和批量修改,所以在这里记录一下,避免后续再遇到忘记怎么写了 批量…...
Centos7部署单机版MongoDB
目录 Centos7部署单机版MongoDBMongoDB介绍数据模型索引分布式高可用性查询语言驱动和社区用途缺点 下载并解压安装包创建相关文件夹和文件编辑mongod.conf文件启动mongodb创建管理员用户终止MongoDB服务配置自启动服务关闭SELinux编辑自启动服务文件mongodb服务命令 Centos7部…...
电子商务网站设计的基本要求/上海百度推广公司
WScript.Shell(Windows Script Host Runtime Library)是一个对象,对应的文件是C:/WINDOWS/system32/wshom.ocx,Wscript.shell是服务器系统会用到的一种组件。shell 就是“壳”的意思,这个对象可以执行操作系统外壳常用…...
学校网站开发/网址和网站的区别
误解一:数据仓库和数据湖二者在架构上只能二选一 很多人认为数据仓库和数据湖在架构上只能二选一,其实这种理解是错误的。数据湖和数据仓库并不是对立关系,相反它们的并存可以互补给企业架构带来更多的好处: 数据仓库存储结构化的…...
网站建设的设备/希爱力双效片副作用
在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,这种效果在Android中是用AutoCompleteTextView实现的。 <AutoCompleteTextView android:layout_width"match_parent"android:layout_height"wrap_content"android:id&qu…...
做网站python和php/seo外链推广员
本节重点 了解元类了解元类的用途 本节时长需控制在45分钟内 一 知识储备 exec:三个参数 参数一:字符串形式的命令 参数二:全局作用域(字典形式),如果不指定,默认为globals() 参数三&…...
茂名做网站/seo排名怎么样
wordcloud安装参考:下载安装wordcloud snownlp安装参考:下载安装snownlp jieba安装参考:使用码云下载Github文件 wordcloud强调python版本,snownlp和jieba不强调版本,我装的都是python3.6下的。 数据:和鲸社…...
google地图嵌入网站/seminar
目录 1.浅克隆 1.1基本实现 1.2 用原型模式生成“三好学生"奖状 2.深克隆 1.浅克隆 使用场景: 对象的创建非常复杂,可以使用原型模式快捷的创建对象。 性能和安全要求比较高。 1.1基本实现 Realizetype(具体的原型类)…...