当前位置: 首页 > news >正文

clickhouse-题库

1、clickhouse介绍以及架构

clickhouse一个分布式列式存储数据库,主要用于在线分析查询

2、列式存储和行式存储有什么区别?

行式存储:
1)、数据是按行存储的
2)、没有建立索引的查询消耗很大的IO
3)、建立索引和视图花费一定的物理空间和时间资源
4)、面对大量的查询,复杂的复杂的数据库必须使用大量性能才能满足

列式存储:
1)、数据按列存储,每一列单独存放
2)、只访问查询设计的列,大量降低系统的IO
3)、数据类型一致,数据特征相似就可以高效的压缩

优势:

分析场景中往往需要读大量行但是少数几个列。在行式存模式下,数据按行连续存储,所有列的数据都存储在一个block中,不参与计算的列在IO时也要全部读出,读取操作被严重放大。而列存模式下,只需要读取参与计算的列即可,极大的减低了IO
cost,加速了查询。
同一列中的数据属于同一类型,压缩效果显著。列存往往有着高达十倍甚至更高的压缩比,节省了大量的存储空间,降低了存储成本。
更高的压缩比意味着更小的 data size,从磁盘中读取相应数据耗时更短。
自由的压缩算法选择。不同列的数据具有不同的数据类型,适用的压缩算法也就不尽相同。可以针对不同列类型,选择最合适的压缩算法。
高压缩比,意味着同等大小的内存能够存放更多数据,系统cache效果更好。

3、高吞吐写入

CK采用LSM Tree结构,数据写入后定期在后台compaction,因为是LSM Tree,ck在数导入的时候全部都是顺序append;数据会在后台一定时候compaction,但是只要是查询时候,会自动的compaction

4、ck中的数据类型

整型(包括有符号和无符号):int8、int16、int32、int64
浮点型:float32、float64
Decimal:
布尔型:
字符串:string、fixedstring(fixedstring使用null字节填充末尾字符)
枚举类型:
时间类型:datetime精确到秒、datetime64精确到亚秒、date只精确到天
数组类型:

5、表引擎

表引擎是ck的特色,决定了如何存储表
日志系列引擎

1)、tinylog 以列文件的形式保存在磁盘上,不支持索引,没有并发控制,一般保存少量数据的小表
2)、log和StripeLog

memory

内存引擎,数据以未压缩的原始形式直接保存在内存当中,服务器重启数据就会消失,读写操作不会相互阻塞,不支持索引

合并树家族引擎

mergeTree 是ck中最强大的表引擎,支持数据分区、主键索引、数据副本、数据采样等特性,相当于mysql中的innodb
分区目录:是以列文件+索引文件+表定义文件组成的
数据写入与分区合并:任何一个批次的数据写入都会产生一个临时分区,不会纳入任何一个已有的分区,一段时间过后,ck会自动执行合并操作,把临时分区的数据合并到已有的分区中(也可以手动使用optimize执行)

Primary key:主键并不用于去重,而是用于索引,加快查询速度,默认的索引粒度为8192行,为数据生成以及索引并保存到primary.idx文件内,索引数据按照primary
key排序;稀疏索引只需要少量的索引标记就能够记录大量的数据区间位置信息。数据量越大越明显
跳数索引/二级索引:在一级索引的基础之上再加一层索引,它们使ClickHouse能够跳过保证没有匹配值的数据块。——INDEX a
total_amount TYPE minmax GRANULARITY 5
(如果是把一级索引分成几块,那么二级索引的粒度就是每次可以跳几块)GRANULARITY。每个索引块由颗粒(granule)组成。例如,如果主表索引粒度为8192行,GRANULARITY为4,则每个索引“块”将为32768行。

repacingMergeTree 存储特征完全继承MergeTree,会删除排序键值相同的重复项。
ReplacingMergeTree和MergeTree的不同之处在于它会删除排序键值相同的重复项。
数据的去重只能在compaction中出现,合并会在未知的时间在后台进行或者使用optiumize进行(大会引发对数据的大量读写)

使用ORBER BY排序键作为判断重复数据的唯一键。
只有在合并分区的时候才会触发删除重复数据的逻辑。
以数据分区为单位删除重复数据。当分区合并时,同一分区内的重复数据会被删除;不同分区之间的重复数据不会被删除。
在进行数据去重时,因为分区内的数据已经基于ORBER BY进行了排序,所以能够找到那些相邻的重复数据。
在数据合并的时候,ReplacingMergeTree 从所有具有相同排序键的行中选择一行留下:如果ver列未指定,保留最后一条。如果ver列已指定,保留ver值最大的版本。

SummingMergeTree

不查询明细。只关心进行汇总聚合结果的场景,提供一种预聚合的功能 以order
by的列合并为准,作为维度列、不在一个分区内的数据不会被聚合,只有在用一批次插入的数据才会进行聚合
-ClickHouse会把所有具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值。

AggregatingMergeTree

可以理解为SummingMergeTree的升级版,能够在合并分区时候,按照预先定义的条件聚合数据,同时根据预先定义的聚合函数计算数据并得到二进制的格式存入表内
AggregateFunction类型字段使用二进制存储,在写入数据时,需要调用state函数;在读数据时,需要调用merge函数,*表示定义时使用的聚合函数
AggregateMergeTree通常作为物化视图的引擎,与普通的MergeTree搭配使用 CollapsingMergeTree
以增代删的思路,支持行级数据修改和删除的表引擎,通过一个sign标记位字段,记录数据行的状态,如果sign标记为1,表示这是一行有效的数据,如果sign为-1,表示改行数据需要被删除,当进行分区合并时候,同一数据分区内,sign为1和-1的一组数据会被抵消

VersionedCollapsingMergeTree

VersionedCollapsingMergeTree数据折叠也是发生在分区合并时,只会对同分区的数据进折叠

6、Update和delete

ck提供了delete和update能力,被称为mutation,但是一种很重的操作,不支持事务,原因是每次修改或者和删除都会放弃目标数据的原有分区,重建新的分区,所以尽量做批量的变更,不进行小数据的操作
原理:分两步执行,同步执行的部分其实只是进行新增数据新增分区和并把旧分区打上逻辑上失效的标记,直到触发分区合并的时候,才会删除数据释放磁盘空间

7、分片集群

副本可以提高数据的可用性,但每台服务器实际上必须是安全量数据,对数据的横向扩容没有解决
分片是把一份完整的数据进行切分,不同的分片分布到不同的节点上,在通过distributed表引擎把数据拼接起来,该引擎本身不存数据

8、建表优化

为什么ck中能用数值或者日期时间类型就不用字符串:
ck底层将datetime存储为时间戳long类型。但不建议存储long类型,datetime不需要经过含函数转换处理,执行效率高、可读性好
空值存储
nullable类型会拖慢性能,因为存储nullable时候需要创建一额外的文件来存储null的标记,nullable列无法被索引,一般在业务中采用一个没有实际意义的值代替(-1,0,1)
表参数
如果表中不是必须要保留的全量数据,一般指定TTL,避免手动删除过期数据的麻烦
写入和删除优化
不要执行单条或者小批量的插入删除操作,会产生小分区文件(因为每一次插入都会重新分区),给merge任务带来巨大压力,不要一次写入过多分区,或者数据写入太快——会导致merge速度跟不上而报错
谓词下推
所谓的谓词,就是对数据的筛选行为,下推是尽可能将这些筛选条件优先执行(查询的最低端)
聚合计算外推
聚合函数内的计算会外推
聚合函数消除

9、分片集群

副本可以提高数据的可用性,但每台服务器实际上必须是安全量数据,对数据的横向扩容没有解决
分片是把一份完整的数据进行切分,不同的分片分布到不同的节点上,在通过distributed表引擎把数据拼接起来,该引擎本身不存数据

10、建表优化

为什么ck中能用数值或者日期时间类型就不用字符串:
ck底层将datetime存储为时间戳long类型。但不建议存储long类型,datetime不需要经过含函数转换处理,执行效率高、可读性好
空值存储
nullable类型会拖慢性能,因为存储nullable时候需要创建一额外的文件来存储null的标记,nullable列无法被索引,一般在业务中采用一个没有实际意义的值代替(-1,0,1)
表参数
如果表中不是必须要保留的全量数据,一般指定TTL,避免手动删除过期数据的麻烦
写入和删除优化
不要执行单条或者小批量的插入删除操作,会产生小分区文件(因为每一次插入都会重新分区),给merge任务带来巨大压力,不要一次写入过多分区,或者数据写入太快——会导致merge速度跟不上而报错
谓词下推
所谓的谓词,就是对数据的筛选行为,下推是尽可能将这些筛选条件优先执行(查询的最低端)
聚合计算外推
聚合函数内的计算会外推
聚合函数消除

11、查询优化

1)、prewhere代替where
两者的作用相同,不同之处在于perwhere只支持MergeTree系列引擎的表,会先判断数据过滤,等待数据过滤之后再读取select系列字段补全,prewhere最多可提高十倍性能,也会自动优化

2)、数据采样
采样修饰符只有在 MergeTree engine 表中才有效,且在创建表时需要指定采样策略。

3)、列裁剪与分区裁剪
数据量太大时应避免使用 select * 操作,查询的性能会与查询的字段大小和数量成线性 表换,字段越少,消耗的 io 资源越少,性能就会越高。

4)、orderby 结合 where、limit

5)、uniqCombined 替代 distinct
性能可提升 10 倍以上,uniqCombined 底层采用类似 HyperLogLog 算法实现,能接收 2% 左右的数据误差,可直接使用这种去重方式提升查询性能。Count(distinct )会使用 uniqExact精确去重。

12、物化视图

视图只是保存了计算逻辑,不保存数据
视图和物化视图的区别:ck的物化视图是一种查询结果的持久化,用户查起来和普通的表没区别,也像是一张时时刻刻计算的表,
缺点:本质是一个流式数据的使用场景,如果一张表加了很多的物化视图,在写入的时候,就会消耗很多资源
物化视图中的数据是在创建物化视图之后,在往对应表中插入数据时候,对应数据才会写入到物化视图中;
物化视图的名字不能和表明重复

13、ck和mysql主从同步

1)、确保mysql和开启binlog和GTID模式(binglog:记录所有对数据库执行更改的sql语句,不包括查,二进制文件是mysql数据复制恢复;GTID是一种复制方式,通过gtid保证了每个在主库上提交的事务在集群中有一个唯一的id,GTID (Global Transaction ID)是全局事务ID,由主库上生成的与事务绑定的唯一标识,这个标识不仅在主库上是唯一的,在MySQL集群内也是唯一的。

2)、确保ck物化引擎打开

14、ck的数据分布式存储机制如何设计的

1)、分片和复制:ck通过分片将数据水平划分为多个部分,每个部分存储在不同的节点上,每个分片可以有一个或者多个副本,副本之间自动同步数据
2)、分布式表引擎:ck使用分布式表引擎跨节点数据查询和写入
3)、数据分区:每个分片内,数据可以进一步根据分区键被划分为多个分区
4)、负载均衡:在执行查询时候,ck能够自动在所有可用的副本之间进行负载均衡
5)、一致性容错

15、补充:CK为什么快

1)存储引擎视角

ck利用存储引擎的特殊涉及充分减少磁盘IO对查询速度的影响,用户提交的一条SQL,大部分时间消耗在磁盘的IO上

ck对写入数据进行预排序

ck写入数据文件的数据是有序的,将数据在写入磁盘前进行排序,以保证数据在磁盘上有序,预排序在实现范围查找时候,可以将大量的随机读转换为顺序读,提高IO效率;在查找时,预排序能做到和未排序的数据相同的性能

列式存储 在列式数据库中,同一列的所有数据都在同一个文件中,因此在硬盘上是连续的,适合

OLAP 压缩

ck另一个降低IO的手段是压缩,可以减少读取和写入的数据量,减少IO时间;事务数据库大部分情况下是针对行的操作,如果对每一行都进行压缩和解压缩,带来的时间消耗是远大于磁盘IO时间,这也是为什么所有的事务数据库都不使用压缩技术的原因;ck的最小处理单元是块,块一般由8192行数据组成,一次压缩针对8192行数据,降低cpu的压缩和解压缩时间,并且列式数据有更好的压缩比

向量化引擎
ck采用了向量化执行引擎,能够将多个操作合并成单个向量操作,减少了函数调用和内存分配的次数,从而提高了执行效率。此外向量化执行还使得数据在内存中的布局更加紧凑
多线程与分布式处理 实现了多线程处理,提高整体的处理速度

2)计算引擎视角

ck计算快是来自内部向量化引擎的加持,ck计算慢是因为缺乏代价优化器 大量使用向量化运算

为了实现向量化执行,需要利用CPU的SIMD指令(single instruction Multiple data,单条指令操作多条数据),它是通过数据i你高兴以提高性能的一种实现方式,它的原理是在CPU寄存器方面实现数据的并行计算,计算机存储层次如下所示:
其中,从左往右距离CPU越近,访问速度就越快,显然能够容纳的数据大小也就越小,CPU寄存器也是可以存储数据的,CPU从寄存器中获取数据的速度是最快的,是内存的300倍,是磁盘的3000万倍

ck中的很多内置函数。使用时候ck会自动进行向量化优化, 查询中不使用join,或尽可能减少join操作
ck中没有代价优化器,说明在进行join的时候会出现内存不足的情况,使用ck时候,应当避免join操作,但join操作在ODS建模时候大量存在,数据量大的时候,建模工作应当下推到spark中进行
ck快的本质 ck快的本质是利用了cpu进行加速

总结:CK快的原因

ck是列式存储、索引机制、数据压缩、ck使用了向量化引擎(寄存器)、ck使用cpu加速、ck会在内存中进行group by,并使用hash
table装载数据

补充:ck的几点不足
1、不支持事务,不能把它用于OLTP事务操作的场景
2、不擅长根据主键按行粒度进行查询,所以不应该把ck当作键值对数据库使用
3、不擅长删除和修改数据

补充:ck相关补充
1、CK提供了标准的SQL查询接口,CK大小是大小写敏感的,关键字非大小敏感
2、ck中向量化是通过数据级别的并行方式提升了性能,那么多线程处理就是通过线程级并行的方式实现了性能提升
3、在分布式领域,移动计算优于移动数据,在服务器之间网络传输的成本是很高的,相比移动数据,更好的是预先将数据分布到各台服务器,将数据的计算查询直接下推到数据所在的服务器;
4、多主架构,在传统的hdfs、spark中,都采用了主从架构,一个leader节点统筹全局;ck采用多主架构,集群中的每个节点角色对等,客户端访问任意一个节点都能得到相同的效果,集群中所有节点功能相同,避免单点故障
5、数据分片,分区时表的分区,根据关键字将最终结果写入不同的文件中;而分复用了数据库的分区,相当于在原有的分区下,作为第二层分区,是在不同节点上的体现
6、ClickHouse 最终选择了这些算法:对于常量,使用 Volnitsky 算法;对于非常量,使用 CPU 的向量化执行 SIMD,暴力优化;正则匹配使用 re2 和 hyperscan 算法。

相关文章:

clickhouse-题库

1、clickhouse介绍以及架构 clickhouse一个分布式列式存储数据库,主要用于在线分析查询 2、列式存储和行式存储有什么区别? 行式存储: 1)、数据是按行存储的 2)、没有建立索引的查询消耗很大的IO 3)、建…...

在 Sanic 应用中使用内存缓存管理 IP 黑名单

[外链图片转存中…(img-Pm0K9mzd-1734859380698)] 在现代 web 应用中,保护 API 接口免受恶意请求的攻击至关重要。IP 黑名单是一种常见的安全措施,可以有效阻止某些 IP 地址的访问。本文将介绍如何在 Python 的 Sanic 框架中实现 IP 黑名单功能&#xf…...

可翻折的CPCI导冷板卡插拔机构

本技术涉及一种cpci板卡模块拔插,尤其涉及一种可翻折的cpci导冷板卡插拔机构。 背景技术: 1、cpci(compactpci)导冷板卡是一种基于compactpci计算机总线标准的卡式电子模块,它在标准的cpci架构之上增加了导热板来提高散热能力,常…...

面试题整理9----谈谈对k8s的理解2

面试题整理9----谈谈对k8s的理解2 1. Service 资源1.1 ServiceClusterIPNodePortLoadBalancerIngressExternalName 1.2 Endpoints1.3 Ingress1.4 EndpointSlice1.5 IngressClass 2. 配置和存储资源2.1 ConfigMap2.2 Secret2.3 PersistentVolume2.4 PersistentVolumeClaim2.5 St…...

12个城市人文扫街、旅拍、人像风光摄影后期Lightroom调色预设

12个城市人文扫街、旅拍、人像风光摄影后期Lightroom调色预设 12 个专为城市场景设计的专业 Adobe Lightroom 预设。只需单击一下,即可通过一致、专业的基础简化您的编辑流程。 Lightroom & Lightroom Classic,桌面和移动兼容包括 12 张由 pat_kay…...

无人设备遥控器之数传功率篇

一、数传功率的基本概念 数传功率是指遥控器发射端在传输数据时所使用的功率。这个功率值直接影响了数据传输的距离和信号强度。一般来说,数传功率越大,遥控器与无人设备之间的通信距离就越远,信号强度也相应增强。 二、数传功率的调节与选择…...

灭屏情况下,飞行模式+静音模式+插耳,播放音乐,电流异常

1. 功耗现象 灭屏情况下,飞行模式静音模式插耳,播放音乐,电流异常 1.1测试数据 飞行模式静音模式插耳机 原生音乐播放器 DriverOnly 32.5mA User版本 45mA 1.2 电流波形现象 上述看怀疑 CPU 未进入 Deep idle 导致? 2. …...

面向微服务的Spring Cloud Gateway的集成解决方案:用户登录认证与访问控制

🎯导读:本文档详细描述了一个基于Spring Cloud Gateway的微服务网关及Admin服务的实现。网关通过定义路由规则,利用负载均衡将请求转发至不同的后端服务,并集成了Token验证过滤器以确保API的安全访问,同时支持白名单路…...

Jmeter负载测试如何找到最大并发用户数?

在性能测试中,当我们接到项目任务时,很多时候我们是不知道待测接口能支持多少并发用户数的。此时,需要我们先做负载测试,通过逐步加压,来找到最大并发用户数。那么当我们找到一个区间,怎么找到具体的值呢&a…...

Spark-Streaming集成Kafka

Spark Streaming集成Kafka是生产上最多的方式,其中集成Kafka 0.10是较为简单的,即:Kafka分区和Spark分区之间是1:1的对应关系,以及对偏移量和元数据的访问。与高版本的Kafka Consumer API 集成时做了一些调整,下面我们…...

移植 OLLVM 到 Android NDK,Android Studio 中使用 OLLVM

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ OLLVM、LLVM 与 Android NDK 在 Android NDK 中,LLVM/Clang 是默认的编译器。自 Android NDK r18 开始,Google 弃用了 GCC&#xff0c…...

DAY36|动态规划Part04|LeetCode:1049. 最后一块石头的重量 II、494. 目标和、474.一和零

目录 LeetCode:1049. 最后一块石头的重量 II 基本思路 C代码 LeetCode:494. 目标和 基本思路 C代码 LeetCode:474.一和零 基本思路 C代码 LeetCode:1049. 最后一块石头的重量 II 力扣代码链接 文字讲解:LeetCode:1049. 最后一块石头的重量 II 视频讲解&…...

Linux 下SVN新手操作手册

下面来介绍Linux 下 SVN操作方法: 1、SVN的安装 Centos 7 安装Subversion sudo yum -y install subversion Ubuntu 安装Subversion sudo apt-get install subversion 自定义安装,官方地址:https://subversion.apache.org/ 2、SVN的使用…...

障碍感知 | 基于KD树的障碍物快速处理(附案例分析与ROS C++仿真)

目录 1 障碍处理与KD树2 KD树核心原理2.1 KD树的构造2.2 KD树的查找 3 仿真实现3.1 KD树基本算法3.2 ROS C仿真 1 障碍处理与KD树 在机器人感知系统中,传感器(如激光雷达、摄像头等)会采集周围的环境数据,例如代价地图、八叉树地…...

Electron -- Electron Fiddle(一)

Electron Fiddle 是一个由 Electron 团队开发的开源工具,它允许开发者快速创建、运行和调试 Electron 应用。这个工具提供了一个简洁的界面,使用户无需配置复杂的开发环境,就能快速体验和学习 Electron。强烈建议将其安装为学习工具。 学习它…...

详解Redis的常用命令

目录 KEYS 语法 EXISTS 语法 DEL 语法 EXPIRE 语法 TTL 语法 TYPE 语法 Redis数据结构和内部编码 KEYS 返回所有满⾜样式(pattern)的 key。 返回值:匹配 pattern 的所有 key。 语法 ⽀持如下统配样式: h?llo matches hello, ha…...

elasticache备份

Elasticsearch 本地快照操作流程 配置快照存储路径 在 elasticsearch.yml 文件中配置以下字段以指定数据、日志和快照存储路径:path:data: /data/data # 数据存储路径logs: /data/log # 日志存储路径repo: /data/snapshot # 快照存储路径确保路径 /dat…...

Tomcat负载均衡全解析

一、Java项目概述 (一)Java语言特点 Java是一种计算机应用语言,在开发王者和管理系统等方面有着广泛的应用。它具有开源免费的特性,不过需要注意的是,虽然语言本身开源,但是后期开发工具可能会收取费用。 (二)、JDK和Tomcat 1,JDK:作为Java语言的开发工具,在Linu…...

[LeetCode-Python版] 定长滑动窗口8——2461. 长度为 K 子数组中的最大和

题目 给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和: 子数组的长度是 k,且 子数组中的所有元素 各不相同 。 返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件,返回 0 。…...

springboot476基于vue篮球联盟管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统篮球联盟管理系统信息管理难度大,容错率低&am…...

预约参观华为基地,见证行业巅峰

✨ 大家好呀!今天要跟大家分享一个超酷的体验,关于华为的参观学习之旅!🚀 华为成立于1987年,位于深圳,是全球领先的信息与通信技术(ICT)解决方案供应商哦!他们专注于科技…...

【Flink-scala】DataSet编程模型介绍及数据源

DataStream 学习 1.DataStream编程模型总结 文章目录 DataStream 学习介绍一、DataSet编程模型二、数据源1.文件类数据源2.集合类数据源3.通用类数据源4第三方文件系统 介绍 Flink把批处理看成是一个流处理的特例,因此可以在底层统一的流处理引擎上,同…...

Odrive源码分析(四) 位置爬坡算法

Odrive中自带一个简单的梯形速度爬坡算法&#xff0c;本文分析下这部分代码。 代码如下&#xff1a; #include <cmath> #include "odrive_main.h" #include "utils.hpp"// A sign function where input 0 has positive sign (not 0) float sign_ha…...

[Unity Shader][图形渲染] Shader数学基础11 - 复合变换详解

在图形学与Shader编程中,复合变换是将平移、旋转和缩放等基本几何变换组合在一起,从而实现更复杂的物体变换效果。复合变换的本质是通过矩阵的串联操作,依次应用多个变换。 本文将介绍复合变换的数学原理、矩阵计算方法及注意事项,并结合实际编程中的实现细节帮助你掌握其…...

使用Python实现智能家居控制系统:开启智慧生活的钥匙

友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…...

使用 HTML5 Canvas 实现动态蜈蚣动画

使用 HTML5 Canvas 实现动态蜈蚣动画 1. 项目概述 我们将通过 HTML 和 JavaScript 创建一个动态蜈蚣。蜈蚣由多个节段组成&#xff0c;每个节段看起来像一个小圆形&#xff0c;并且每个节段上都附带有“脚”。蜈蚣的头部会在画布上随机移动。 完整代码在底部&#xff01;&…...

计算机视觉目标检测——DETR(End-to-End Object Detection with Transformers)

计算机视觉目标检测——DETR(End-to-End Object Detection with Transformers) 文章目录 计算机视觉目标检测——DETR(End-to-End Object Detection with Transformers)摘要Abstract一、DETR算法1. 摘要&#xff08;Abstract&#xff09;2. 引言&#xff08;Introduction&#…...

uniapp .gitignore

打开HBuilderX&#xff0c;在项目根目录下新建文件 .gitignore复制下面内容 #忽略unpackge目录下除了res目录的所有目录 unpackage/* !unpackage/res/#忽略.hbuilderx目录 .hbuilderx# 忽略node_modules目录下的所有文件 node_modules/# 忽略锁文件 package-lock.json yarn.l…...

JavaWeb Servlet的反射优化、Dispatcher优化、视图(重定向)优化、方法参数值获取优化

目录 1. 背景2. 实现2.1 pom.xml2.2 FruitController.java2.3 DispatcherServlet.java2.4 applicationContext.xml 3. 测试 1. 背景 前面我们做了Servlet的一个案例。但是存在很多问题&#xff0c;现在我们要做优化&#xff0c;优化的步骤如下&#xff1a; 每个Fruit请求都需…...

备忘一个FDBatchMove数据转存的问题

使用FDBatchMove的SQL导入excel表到sql表&#xff0c;设置条件时一头雾水&#xff0c;函数不遵守sql的规则。 比如替换字段的TAB键值为空&#xff0c;replace(字段名,char(9),)竟然提示错误&#xff0c;百思不得其解。 试遍了几乎所有的函数&#xff0c;竟然是chr(9)。 这个…...