建表,排序,索引及注意事项
https://clickhouse.tech/docs/zh/operations/table_engines/mergetree/
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree()
[PARTITION BY expr]
[ORDER BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
我们以 (CounterID, Date)
以主键。排序好的索引的图示会是下面这样:
如果指定查询如下:
CounterID in ('a', 'h')
,服务器会读取标记号在 [0, 3)
和 [6, 8)
区间中的数据。
CounterID IN ('a', 'h') AND Date = 3
,服务器会读取标记号在 [1, 3)
和 [7, 8)
区间中的数据。
Date = 3
,服务器会读取标记号在 [1, 10]
区间中的数据。
上面例子可以看出使用索引通常会比全表描述要高效。
稀疏索引会引起额外的数据读取。当读取主键单个区间范围的数据时,每个数据块中最多会多读 index_granularity * 2
行额外的数据。大部分情况下,当 index_granularity = 8192
时,ClickHouse的性能并不会降级。
稀疏索引让你能操作有巨量行的表。因为这些索引是常驻内存(RAM)的。
ClickHouse 不要求主键惟一。所以,你可以插入多条具有相同主键的行。
主键的选择
https://clickhouse.tech/docs/zh/operations/table_engines/mergetree/#zhu-jian-de-xuan-ze
主键中列的数量并没有明确的限制。依据数据结构,你应该让主键包含多些或少些列。这样可以:
改善索引的性能。
如果当前主键是 (a, b)
,然后加入另一个 c
列,满足下面条件时,则可以改善性能: - 有带有 c
列条件的查询。 - 很长的数据范围( index_granularity
的数倍)里 (a, b)
都是相同的值,并且这种的情况很普遍。换言之,就是加入另一列后,可以让你的查询略过很长的数据范围。
改善数据压缩。
ClickHouse 以主键排序片段数据,所以,数据的一致性越高,压缩越好。
CollapsingMergeTree 和 SummingMergeTree 引擎里,数据合并时,会有额外的处理逻辑。
在这种情况下,指定一个跟主键不同的 排序键 也是有意义的。
长的主键会对插入性能和内存消耗有负面影响,但主键中额外的列并不影响 SELECT
查询的性能。
选择跟排序键不一样主键
指定一个跟排序键(用于排序数据片段中行的表达式) 不一样的主键(用于计算写到索引文件的每个标记值的表达式)是可以的。 这种情况下,主键表达式元组必须是排序键表达式元组的一个前缀。
分区
https://clickhouse.tech/docs/zh/operations/table_engines/custom_partitioning_key/
(
VisitDate Date,
Hour UInt8,
ClientID UUID
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(VisitDate)
ORDER BY Hour;
分区键也可以是表达式元组(类似 [主键]例如:
ENGINE = ReplicatedCollapsingMergeTree('/clickhouse/tables/name', 'replica1', Sign)
PARTITION BY (toMonday(StartDate), EventType)
ORDER BY (CounterID, StartDate, intHash32(UserID));
上例中,我们设置按一周内的事件类型分区。
新数据插入到表中时,这些数据会存储为按主键排序的新片段(块)。插入后 10-15 分钟,同一分区的各个片段会合并为一整个片段。
可以通过 [system.parts]表查看表片段和分区信息。例如,假设我们有一个 visits
表,按月分区。对 system.parts
表执行 SELECT
:
SELECT
partition,
name,
active
FROM system.parts
WHERE table = 'visits'
──partition─┬─name───────────┬─active─┐
│ 201901 │ 201901_1_3_1 │ 0 │
│ 201901 │ 201901_1_9_2 │ 1 │
│ 201901 │ 201901_8_8_0 │ 0 │
│ 201901 │ 201901_9_9_0 │ 0 │
│ 201902 │ 201902_4_6_1 │ 1 │
│ 201902 │ 201902_10_10_0 │ 1 │
│ 201902 │ 201902_11_11_0 │ 1 │
└───────────┴────────────────┴────────┘
partition
列存储分区的名称。此示例中有两个分区:201901
和 201902
。在 [ALTER ... PARTITION]语句中你可以使用该列值来指定分区名称。
name
列为分区中数据片段的名称。在 [ALTER ATTACH PART] 语句中你可以使用此列值中来指定片段名称。
这里我们拆解下第一部分的名称:201901_1_3_1
:
201901
是分区名称。
1
是数据块的最小编号。
3
是数据块的最大编号。
1
是块级别(即在由块组成的合并树中,该块在树中的深度)。
注意
旧类型表的片段名称为:20190117_20190123_2_2_0
(最小日期 - 最大日期 - 最小块编号 - 最大块编号 - 块级别)。
active
列为片段状态。1
激活状态;0
非激活状态。非激活片段是那些在合并到较大片段之后剩余的源数据片段。损坏的数据片段也表示为非活动状态。
正如在示例中所看到的,同一分区中有几个独立的片段(例如,201901_1_3_1
和201901_1_9_2
)。这意味着这些片段尚未合并。ClickHouse 大约在插入后15分钟定期报告合并操作,合并插入的数据片段。此外,你也可以使用 OPTIMIZE 语句直接执行合并。例:
OPTIMIZE TABLE visits PARTITION 201902;
┌─partition─┬─name───────────┬─active─┐
│ 201901 │ 201901_1_3_1 │ 0 │
│ 201901 │ 201901_1_9_2 │ 1 │
│ 201901 │ 201901_8_8_0 │ 0 │
│ 201901 │ 201901_9_9_0 │ 0 │
│ 201902 │ 201902_4_6_1 │ 0 │
│ 201902 │ 201902_4_11_2 │ 1 │
│ 201902 │ 201902_10_10_0 │ 0 │
│ 201902 │ 201902_11_11_0 │ 0 │
└───────────┴────────────────┴────────┘
非激活片段会在合并后的10分钟左右删除。
查看片段和分区信息的另一种方法是进入表的目录:/var/lib/clickhouse/data///。例如:
/var/lib/clickhouse/data/default/visits$ ls -l
total 40
drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 1 16:48 201901_1_3_1
drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 16:17 201901_1_9_2
drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 15:52 201901_8_8_0
drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 15:52 201901_9_9_0
drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 16:17 201902_10_10_0
drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 16:17 201902_11_11_0
drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 16:19 201902_4_11_2
drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 12:09 201902_4_6_1
drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 1 16:48 detached
[root@izm5eja0h0h0p04ol7ijrpz 20200319_10_10_0]# pwd
/var/lib/clickhouse/data/logs/logs/20200319_10_10_0
[root@izm5eja0h0h0p04ol7ijrpz 20200319_10_10_0]# ll
total 104
-rw-r----- 1 clickhouse clickhouse 831 Mar 19 23:01 checksums.txt
-rw-r----- 1 clickhouse clickhouse 234 Mar 19 23:01 columns.txt
-rw-r----- 1 clickhouse clickhouse 34 Mar 19 23:01 content.bin
-rw-r----- 1 clickhouse clickhouse 48 Mar 19 23:01 content.mrk2
-rw-r----- 1 clickhouse clickhouse 1 Mar 19 23:01 count.txt
-rw-r----- 1 clickhouse clickhouse 30 Mar 19 23:01 create_time.bin
-rw-r----- 1 clickhouse clickhouse 48 Mar 19 23:01 create_time.mrk2
-rw-r----- 1 clickhouse clickhouse 38 Mar 19 23:01 ip.bin
-rw-r----- 1 clickhouse clickhouse 48 Mar 19 23:01 ip.mrk2
-rw-r----- 1 clickhouse clickhouse 32 Mar 19 23:01 level.bin
-rw-r----- 1 clickhouse clickhouse 48 Mar 19 23:01 level.mrk2
-rw-r----- 1 clickhouse clickhouse 34 Mar 19 23:01 log_file_name.bin
-rw-r----- 1 clickhouse clickhouse 48 Mar 19 23:01 log_file_name.mrk2
-rw-r----- 1 clickhouse clickhouse 8 Mar 19 23:01 minmax_partition_date.idx
-rw-r----- 1 clickhouse clickhouse 4 Mar 19 23:01 partition.dat
-rw-r----- 1 clickhouse clickhouse 30 Mar 19 23:01 partition_date.bin
-rw-r----- 1 clickhouse clickhouse 48 Mar 19 23:01 partition_date.mrk2
-rw-r----- 1 clickhouse clickhouse 34 Mar 19 23:01 primary.idx
-rw-r----- 1 clickhouse clickhouse 34 Mar 19 23:01 service_name.bin
-rw-r----- 1 clickhouse clickhouse 48 Mar 19 23:01 service_name.mrk2
-rw-r----- 1 clickhouse clickhouse 33 Mar 19 23:01 thread_name.bin
-rw-r----- 1 clickhouse clickhouse 48 Mar 19 23:01 thread_name.mrk2
-rw-r----- 1 clickhouse clickhouse 30 Mar 19 23:01 timestamp.bin
-rw-r----- 1 clickhouse clickhouse 48 Mar 19 23:01 timestamp.mrk2
-rw-r----- 1 clickhouse clickhouse 27 Mar 19 23:01 trace_id.bin
-rw-r----- 1 clickhouse clickhouse 48 Mar 19 23:01 trace_id.mrk2
文件夹 '201901_1_1_0','201901_1_7_1' 等是片段的目录。每个片段都与一个对应的分区相关,并且只包含这个月的数据(本例中的表按月分区)。
detached
目录存放着使用 DETACH 语句从表中分离的片段。损坏的片段也会移到该目录,而不是删除。服务器不使用detached
目录中的片段。可以随时添加,删除或修改此目录中的数据 – 在运行 ATTACH 语句前,服务器不会感知到。
注意 在操作服务器时,你不能手动更改文件系统上的片段集或其数据,因为服务器不会感知到这些修改。对于非复制表,可以在服务器停止时执行这些操作,但不建议这样做。对于复制表,在任何情况下都不要更改片段文件。
注意 那些有相同分区表达式值的数据片段才会合并。这意味着 你不应该用太精细的分区方案(超过一千个分区)。否则,会因为文件系统中的文件数量和需要找开的文件描述符过多,导致 SELECT 查询效率不佳。
弹性支持
click house elastic (不支持弹性架构) https://clickhouse.yandex/docs/en/development/architecture
ClickHouse 集群由独立的分片组成,每一个分片由多个副本组成。集群不是弹性的,因此在添加新的分片后,数据不会自动在分片之间重新平衡。相反,集群负载将变得不均衡。该实现为你提供了更多控制,对于相对较小的集群,例如只有数十个节点的集群来说是很好的。但是对于我们在生产中使用的具有数百个节点的集群来说,这种方法成为一个重大缺陷。我们应该实现一个表引擎,使得该引擎能够跨集群扩展数据,同时具有动态复制的区域,这些区域能够在集群之间自动拆分和平衡。
The ClickHouse cluster consists of independent shards, and each shard consists of replicas. The cluster is not elastic, so after adding a new shard, data is not rebalanced between shards automatically. Instead, the cluster load will be uneven. This implementation gives you more control, and it is fine for relatively small clusters such as tens of nodes. But for clusters with hundreds of nodes that we are using in production, this approach becomes a significant drawback. We should implement a table engine that will span its data across the cluster with dynamically replicated regions that could be split and balanced between clusters automatically.
表结构设计参考
CREATE TABLE logs.logs (
ip String,
log_file_name String,
service_name String,
thread_name String,
trace_id String,
timestamp DateTime,
partition_date UInt32,
level String,
content String,
create_time DateTime
) ENGINE = MergeTree() PARTITION BY partition_date
ORDER BY (create_time,service_name, trace_id)
SETTINGS index_granularity = 8192
Distributed(cluster_name, db_name, table_name[, sharding_key])
sharding_key=rand()随机写
CREATE TABLE logs.logs_view
(
ip String,
log_file_name String,
service_name String,
thread_name String,
trace_id String,
timestamp DateTime,
partition_date UInt32,
level String,
content String,
create_time DateTime
)ENGINE =Distributed(log_collector,logs, logs, rand());
insert into logs.logs(ip,log_file_name,service_name,thread_name,partition_date,level,content,create_time,timestamp)values('192.168.1.1','log.log','sparrow','thread',20200319,'level','content','2020-03-19 22:59:00','2020-03-19 22:58:00') ;
删除分区 delete parition
https://clickhouse.tech/docs/zh/query_language/alter/#alter_manipulations-with-partitions
ALTER TABLE testdb.testtable DROP PARTITION '201907'
性能及使用建议
性能测试对比
https://clickhouse.tech/benchmark.html
https://clickhouse.yandex/docs/en/introduction/performance/
数据的写入性能
我们建议每次写入不少于1000行的批量写入,或每秒不超过一个写入请求。当使用tab-separated格式将一份数据写入到MergeTree表中时,写入速度大约为50到200MB/s。如果您写入的数据每行为1Kb,那么写入的速度为50,000到200,000行每秒。如果您的行更小,那么写入速度将更高。为了提高写入性能,您可以使用多个INSERT进行并行写入,这将带来线性的性能提升。
常用命令行
clickhouse-client -h 192.168.1.195 -u root --password=123456
clickhouse-client -m
clickhouse-client --multiline //开启多行模式
create database logs
show databases;
select * from system.clusters; //查询集群状态
安装配置
trace
/var/log/clickhouse-server/clickhouse-server.log
/var/log/clickhouse-server/clickhouse-server.err.log
1000M
10
8123
9000
9009
my-host-name
0.0.0.0
4096
3000
1000
0
21474836480
25769803776
/data/clickhouse/
/data/clickhouse/tmp/
/data/clickhouse/user_files/
users.xml
default
default
3600
/data/clickhouse/format_schemas/
/etc/clickhouse-server/metrika.xml
metrika.xml
true
192.168.2.254
9000
root
123456
true
122.168.2.255
9000
log_collector
123456
192.168.209.78
2181
192.168.192.166
2181
192.168.209.79
2181
192.168.192.179
2181
192.168.209.92
2181
192.168.209.94
2181
192.168.192.184
2181
logs_01
::/0
10000000000
0.01
lz4
users.xml
25769803776
0
random
1
25769803776
0
random
::/0
default
default
123456
::/0
default
default
logs
::1
127.0.0.1
readonly
default
3600
0
0
0
0
0
服务启动
sudo systemctl start
clickhouse-server.service
你可能感兴趣的:(Clickhouse 使用简介及MergeTree存储分析)
x86-64汇编语言训练程序与实战
十除以十等于一
本文还有配套的精品资源,点击获取简介:汇编语言是一种低级语言,与机器代码紧密相关,特别适用于编写系统级代码及性能要求高的应用。nasm编译器是针对x86和x86-64架构的汇编语言编译器,支持多种语法风格和指令集。项目Euler提供数学和计算机科学问题,鼓励编程技巧应用,前100个问题的答案可共享。x86-64架构扩展了寄存器数量并引入新指令,提升了数据处理效率。学习汇编语言能够深入理解计算机底层
三菱PLC全套学习资料及应用手册
good2know
本文还有配套的精品资源,点击获取简介:三菱PLC作为工业自动化领域的核心设备,其系列产品的学习和应用需要全面深入的知识。本次资料包为学习者提供从基础到进阶的全方位学习资源,包括各种型号PLC的操作手册、编程指南、软件操作教程以及实际案例分析,旨在帮助用户系统掌握PLC的编程语言、指令系统及在各类工业应用中的实施。1.三菱PLC基础知识入门1.1PLC的基本概念可编程逻辑控制器(PLC)是工业自动化
移动端城市区县二级联动选择功能实现包
good2know
本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery
15个小技巧,让我的Windows电脑更好用了!
曹元_
01.桌面及文档处理第一部分的技巧,主要是围绕桌面的一些基本操作,包括主题设置、常用文档文件快捷打开的多种方式等等。主题换色默认情况下,我们的Win界面可能就是白色的文档界面,天蓝色的图表背景,说不出哪里不好看,但是就是觉得不够高级。imageimage说到高级感,本能第一反应就会和暗色模式联想起来,如果我们将整个界面换成黑夜模式的话,它会是这样的。imageimage更改主题颜色及暗色模式,我们
9、汇编语言编程入门:从环境搭建到简单程序实现
神经网络酱
汇编语言 MEPIS GNU工具链
汇编语言编程入门:从环境搭建到简单程序实现1.数据存储介质问题解决在处理数据存储时,若要使用MEPIS系统,需确保有其可访问的存储介质。目前,MEPIS无法向采用NTFS格式(常用于Windows2000和XP工作站)的硬盘写入数据。不过,若硬盘采用FAT32格式,MEPIS就能进行写入操作。此外,MEPIS还能将文件写入软盘和大多数USB闪存驱动器。若工作站连接到局域网,还可通过FTP协议或挂载
贝多芬诞辰250周年纪念
万千星河赴远方
就算不是古典音乐爱好者,你也一定听说过贝多芬。作为古典音乐史上最伟大的音乐家之一,他不仅是古典主义风格的集大成者,同时也是浪漫主义风格的开创者。贝多芬肖像画(1813年)贝多芬的一生共创作了9部交响曲、36首钢琴奏鸣曲、10部小提琴奏鸣曲、16首弦乐四重奏、1部歌剧及2部弥撒曲等等。数量虽然不及前辈海顿、莫扎特多,但他几乎改造了当时所有的音乐表达形式,赋予了它们全新的价值,对后世音乐的发展产生了极
实时数据流计算引擎Flink和Spark剖析
程小舰
flink spark 数据库 kafka hadoop
在过去几年,业界的主流流计算引擎大多采用SparkStreaming,随着近两年Flink的快速发展,Flink的使用也越来越广泛。与此同时,Spark针对SparkStreaming的不足,也继而推出了新的流计算组件。本文旨在深入分析不同的流计算引擎的内在机制和功能特点,为流处理场景的选型提供参考。(DLab数据实验室w.x.公众号出品)一.SparkStreamingSparkStreamin
深入解析JVM工作原理:从字节码到机器指令的全过程
一、JVM概述Java虚拟机(JVM)是Java平台的核心组件,它实现了Java"一次编写,到处运行"的理念。JVM是一个抽象的计算机器,它有自己的指令集和运行时内存管理机制。JVM的主要职责:加载:读取.class文件并验证其正确性存储:管理内存分配和垃圾回收执行:解释或编译字节码为机器指令安全:提供沙箱环境限制恶意代码二、JVM架构详解JVM由三个主要子系统组成:1.类加载子系统类加载过程分为
企业级区块链平台Hyperchain核心原理剖析
boyedu
区块链 区块链 企业级区块链平台 Hyperchain
Hyperchain作为国产自主可控的企业级联盟区块链平台,其核心原理围绕高性能共识、隐私保护、智能合约引擎及可扩展架构展开,通过多模块协同实现企业级区块链网络的高效部署与安全运行。以下从核心架构、关键技术、性能优化、安全机制、应用场景五个维度展开剖析:一、核心架构:分层解耦与模块化设计Hyperchain采用分层架构,将区块链功能解耦为独立模块,支持灵活组合与扩展:P2P网络层由验证节点(VP)
Aop +反射 实现方法版本动态切换
需求分析在做技术选型的时候一直存在着两个声音,mongo作为数据库比较mysql好,mysql做为该数据比mongo好。当然不同数据库都有有着自己的优势,我们在做技术选型的时候无非就是做到对数据库的扬长避短。mysql最大的优势就是支持事务,事务的五大特性保证的业务可靠性,随之而来的就是事务会产生的问题:脏读、幻读、不可重复度,当然我们也会使用不同的隔离级别来解决。(最典型的业务问题:银行存取钱)
最新阿里四面面试真题46道:面试技巧+核心问题+面试心得
风平浪静如码
前言做技术的有一种资历,叫做通过了阿里的面试。这些阿里Java相关问题,都是之前通过不断优秀人才的铺垫总结的,先自己弄懂了再去阿里面试,不然就是去丢脸,被虐。希望对大家帮助,祝面试成功,有个更好的职业规划。一,阿里常见技术面1、微信红包怎么实现。2、海量数据分析。3、测试职位问的线程安全和非线程安全。4、HTTP2.0、thrift。5、面试电话沟通可能先让自我介绍。6、分布式事务一致性。7、ni
编程算法:技术创新的引擎与业务增长的核心驱动力
在数字经济时代,算法已成为推动技术创新与业务增长的隐形引擎。从存内计算突破冯·诺依曼瓶颈,到动态规划优化万亿级金融交易,编程算法正在重塑产业竞争格局。一、存内计算:突破冯·诺依曼瓶颈的算法革命1.1存内计算的基本原理传统计算架构中90%的能耗消耗在数据搬运上。存内计算(Processing-in-Memory)通过直接在存储单元执行计算,实现能效10-100倍提升:#传统计算vs存内计算能耗模型i
图论算法经典题目解析:DFS、BFS与拓扑排序实战
周童學
数据结构与算法 深度优先 算法 图论
图论算法经典题目解析:DFS、BFS与拓扑排序实战图论问题是算法面试中的高频考点,本博客将通过四道LeetCode经典题目(均来自"Top100Liked"题库),深入讲解图论的核心算法思想和实现技巧。涵盖DFS、BFS、拓扑排序和前缀树等知识点,每道题配有Java实现和易错点分析。1.岛屿数量(DFS遍历)问题描述给定一个由'1'(陆地)和'0'(水)组成的二维网格,计算岛屿的数量。岛屿由水平或
基于redis的Zset实现作者的轻量级排名
周童學
Java redis 数据库 缓存
基于redis的Zset实现轻量级作者排名系统在今天的技术架构中,Redis是一种广泛使用的内存数据存储系统,尤其在需要高效检索和排序的场景中表现优异。在本篇博客中,我们将深入探讨如何使用Redis的有序集合(ZSet)构建一个高效的笔记排行榜系统,并提供相关代码示例和详细的解析。1.功能背景与需求假设我们有一个笔记分享平台,用户可以发布各种笔记,系统需要根据用户发布的笔记数量来生成一个实时更新的
我最喜欢的公众号
素颜创始人小云
一年多前,也是因为工作的原因。认识了她,她是我七个人物法其一,她在我心里也是很敬佩的一个女孩子。她会讲一些护肤知识,哪些产品好用哪些不好用而他讲解的产品都是我跃跃欲试的。图片发自App她做的每一篇文章都很精美,可以吸引到我从头看到尾,看每一个字都会很珍惜很期待,做事也特别的认真仔细。去年出了一本《活得漂亮》我也看了她的创业故事,很厉害!她的认真及敬业精神我觉得是很难学得来的,现在怀孕3个月了,依然
D124:如何训练独立思考力?
大栗子_
当我们要判断一个理论或者思想是否正确,需要有三个层次,分别是体验、解释和分析。首先看体验。很多时候,我们会相信“听上去、感觉是对的”的事情。我们之前讲的太空笔的故事之所以大多数人都认为是对的,就是有一些看似真实的关键词,比如美国,NASA,设计等,这些词看起来非常权威,但是离我们又遥远,这时候我们的大脑就会放松警惕了。于是,我们毫不犹豫就接受了。说到这里,你有没有发现之前的电视广告中的各种高让我们
京东中秋节会打折吗?京东中秋节活动力度大吗?
高省APP珊珊
京东中秋节会打折,并且活动力度通常是比较大的。以下是具体分析:京东中秋节打折情况降价促销:京东在中秋节期间会推出大规模的降价促销活动,涵盖食品、家居、家电等多个品类,以及众多热门品牌。消费者可以在此期间享受到实实在在的降价优惠。多种优惠形式:除了直接的降价促销,京东还会通过满减优惠、折扣促销、限时秒杀等多种形式的优惠活动来吸引消费者。这些优惠活动通常具有较高的吸引力,能够激发消费者的购买欲望。目前
第八课: 写作出版你最关心的出书流程和市场分析(无戒学堂复盘)
人在陌上
今天是周六,恰是圣诞节。推掉了两个需要凑腿的牌局,在一个手机,一个笔记本,一台电脑,一杯热茶的陪伴下,一个人静静地回听无戒学堂的最后一堂课。感谢这一个月,让自己的习惯开始改变,至少,可以静坐一个下午而不觉得乏味枯燥难受了,要为自己点个赞。我深知,这最后一堂课的内容,以我的资质和毅力,可能永远都用不上。但很明显,无戒学堂是用了心的,毕竟,有很多优秀学员,已经具备了写作能力,马上就要用到这堂课的内容。
Android 应用权限管理详解
文章目录1.权限类型2.权限请求机制3.权限组和分级4.权限管理的演进5.权限监控和SELinux强制访问控制6.应用权限审核和GooglePlayProtect7.开发者最佳实践8.用户权限管理9.Android应用沙箱模型10.ScopedStorage(分区存储)11.背景位置权限(BackgroundLocationAccess)12.权限回收和自动清理13.权限请求的用户体验设计14.G
uniapp微信小程序 - 详解微信小程序平台用户授权登录全流程,uniapp v3版本中小程序端开发下用户点击登录后获取手机号/昵称/性别/头像等信息完成登录(提供完整示例代码,一键复制开箱即用)
十一猫咪爱养鱼
前端组件与功能(开箱即用) uniapp常见问题解决 uniapp vue3 uniapp3小程序授权登录 微信小程序登录获取用户信息教程 获取用户昵称手机号头像信息登录 vue3版本小程序平台授权登录 uniap小程序端用户登录流程 uni完整的小程序平台登录源码
效果图在uniapp微信小程序端开发中,超详细实现用户授权登录完整功能源码,用户授权后获取手机号/昵称/头像/性别等,提供完整思路流程及逻辑讲解。uniappVue3和Vue2都能用,你也可以直接复制粘贴,然后改下参数放到你的项目中去就行。整体思路做功能之前,先来看一下整体流程是
元宇宙中的视觉技术:虚拟化身与场景生成
xcLeigh
计算机视觉CV 元宇宙 虚拟化身 场景生成 AIGC 数字孪生
元宇宙中的视觉技术:虚拟化身与场景生成前言一、元宇宙与视觉技术的深度关联1.1元宇宙概念深度剖析1.2视觉技术:元宇宙的“灵魂之窗”二、虚拟化身:数字世界的“第二自我”2.1虚拟化身技术的深度解析2.1.1核心技术构成2.1.2技术实现原理与流程2.2虚拟化身的应用领域及案例展示2.2.1游戏娱乐领域2.2.2教育培训领域三、场景生成:构建元宇宙的虚拟天地3.1场景生成技术全景透视3.1.1关键技
处于停机等非正常状态_设备非正常停机管理指导办法
设备非正常停机管理指导办法一、设备非正常停机的范围:1、维护、维修不良:未遵守设备维护及维修规程,导致维护、维修质量无法满足设备运行的技术、环境要求而造成的设备停机,例如:未按维护保养计划保养、维护质量不到位、违章检修,故障维修不彻底,润滑缺油或变质等。2、违章操作:未按照设备操作规程及作业文件等操作而造成的设备停机。3、设备点检缺失:是指设备操作者及维修人员未严格按照点检标准有效地对设备各部位进
【Coze搞钱实战】3. 避坑指南:对话流设计中的6个致命错误(真实案例)
AI_DL_CODE
Coze平台 对话流设计 客服Bot避坑 用户流失 封号风险 智能客服配置 故障修复指南
摘要:对话流设计是智能客服Bot能否落地的核心环节,直接影响用户体验与业务安全。本文基于50+企业Bot部署故障分析,聚焦导致用户流失、投诉甚至封号的6大致命错误:无限循环追问、人工移交超时、敏感词过滤缺失、知识库冲突、未处理否定意图、跨平台适配失败。通过真实案例拆解每个错误的表现形式、技术根因及工业级解决方案,提供可直接复用的Coze配置代码、工作流模板和检测工具。文中包含对话流健康度检测工具使
深入理解 Tomcat Wrapper 原理
北漂老男人
Tomcat tomcat java
深入理解TomcatWrapper原理一、引言在Tomcat的分层容器架构中,Wrapper作为最底层的容器,专门负责管理单个Servlet的生命周期及请求分发。每一个Servlet(包括JSP、Filter等)都对应一个Wrapper。Wrapper是Servlet规范与Tomcat容器实现之间的桥梁,直接关系到请求的分发效率、Servlet的加载与重用、安全隔离等。本文将系统剖析Wrapper
斗罗大陆:没有魂环的唐三紫极魔瞳加鬼影迷踪战力有多强
嘚瑟_a3a5
自从唐三穿越到斗罗大陆以后,由于修炼体系和前世的不同,虽然玄天功也是勤修不辍可是无论怎样修炼都毫无进展,总是难以突破瓶颈,而紫极魔瞳和鬼影迷踪也因为内力的限制发挥不出其真正的威力。后来通过在素云涛那里了解了一些斗罗大陆修炼的方法和体系之后,唐三才知道魂力也就是他前世的内力需要突破的话需要附加魂环以后才可以进入下一阶段的修炼。而在小刚老师详细介绍和针对唐三的具体情况分析指导以后,唐三也不再迷茫决定重
Pktgen-DPDK:开源网络测试工具的深度解析与应用
艾古力斯
本文还有配套的精品资源,点击获取简介:Pktgen-DPDK是基于DPDK的高性能流量生成工具,适用于网络性能测试、硬件验证及协议栈开发。它支持多种网络协议,能够模拟高吞吐量的数据包发送。本项目通过利用DPDK的高速数据包处理能力,允许用户自定义数据包内容,并实现高效的数据包管理与传输。文章将指导如何安装DPDK、编译Pktgen、配置工具以及使用方法,最终帮助开发者和网络管理员深入理解并优化网络
中原焦点团队 坚持原创分享第 1172天
金JJ
信阳案例督导:在学生出现危机时,学校启动心理应急程序,一位心理老师安抚个案的同时,其他心理老师给班级同学进行团体心理辅导,学校方面马上通知家长前来学校。学校危机干预应急流程的成熟,能有效降低个案的自杀风险。个案不愿谈及家庭及自己自杀行为等问题时,用沙盘、玩具等分散注意力,谈论他感兴趣的话题,老师温和的态度,关切的言语,个案的情绪逐渐平复。从个案自己说的,流露的非言语,家长、老师、同学、以往的记录,
Deepseek技术深化:驱动大数据时代颠覆性变革的未来引擎
荣华富贵8
spring boot 搜索引擎 后端 缓存 redis
在大数据时代,信息爆炸和数据驱动的决策逐渐重塑各行各业。作为一项前沿技术,Deepseek正在引领新一轮技术革新,颠覆传统数据处理与分析方式。本文将从理论原理、应用场景和前沿代码实践三个层面,深入剖析Deepseek技术如何为大数据时代提供颠覆性变革的解决方案。一、技术背景与核心思想1.1大数据挑战与机遇在数据量呈指数级增长的背景下,传统数据处理方法面临数据存储、计算效率和信息提取精度的诸多挑战。
Anaconda 和 Miniconda:功能详解与选择建议
古月฿
python入门 python conda
Anaconda和Miniconda详细介绍一、Anaconda的详细介绍1.什么是Anaconda?Anaconda是一个开源的包管理和环境管理工具,在数据科学、机器学习以及科学计算领域发挥着关键作用。它以Python和R语言为基础,为用户精心准备了大量预装库和工具,极大地缩短了搭建数据科学环境的时间。对于那些想要快速开展数据分析、模型训练等工作的人员来说,Anaconda就像是一个一站式的“数
求解——妊娠纹霜哪个牌子好?皮肤专家推荐的热门秘诀!
zhangxing0100
妊娠纹会严重影响女性的美观,那孕期的女性朋友该如何避免减少妊娠纹的出现呢?下面美腹丽人小编为大家分享了预防妊娠纹的方法,赶紧一起来学习吧!一、预防妊娠纹的饮食习惯1、多食用对皮肤内胶原纤维有利的食品来增强皮肤的弹性。2、控制糖分摄入,少吃色素含量高的食物。3、早晚两杯脱脂牛奶,多食用维丰富的蔬菜、水果和富含维生素及矿物质的食物,增加细胞膜的通透性和皮肤的新陈代谢功能。4、正确的喝水习惯可以提速皮肤
Java实现的基于模板的网页结构化信息精准抽取组件:HtmlExtractor
yangshangchuan
信息抽取 HtmlExtractor 精准抽取 信息采集
HtmlExtractor是一个Java实现的基于模板的网页结构化信息精准抽取组件,本身并不包含爬虫功能,但可被爬虫或其他程序调用以便更精准地对网页结构化信息进行抽取。
HtmlExtractor是为大规模分布式环境设计的,采用主从架构,主节点负责维护抽取规则,从节点向主节点请求抽取规则,当抽取规则发生变化,主节点主动通知从节点,从而能实现抽取规则变化之后的实时动态生效。
如
java编程思想 -- 多态
百合不是茶
java 多态详解
一: 向上转型和向下转型
面向对象中的转型只会发生在有继承关系的子类和父类中(接口的实现也包括在这里)。父类:人 子类:男人向上转型: Person p = new Man() ; //向上转型不需要强制类型转化向下转型: Man man =
[自动数据处理]稳扎稳打,逐步形成自有ADP系统体系
comsci
dp
对于国内的IT行业来讲,虽然我们已经有了"两弹一星",在局部领域形成了自己独有的技术特征,并初步摆脱了国外的控制...但是前面的路还很长....
首先是我们的自动数据处理系统还无法处理很多高级工程...中等规模的拓扑分析系统也没有完成,更加复杂的
storm 自定义 日志文件
商人shang
storm cluster logback
Storm中的日志级级别默认为INFO,并且,日志文件是根据worker号来进行区分的,这样,同一个log文件中的信息不一定是一个业务的,这样就会有以下两个需求出现:
1. 想要进行一些调试信息的输出
2. 调试信息或者业务日志信息想要输出到一些固定的文件中
不要怕,不要烦恼,其实Storm已经提供了这样的支持,可以通过自定义logback 下的 cluster.xml 来输
Extjs3 SpringMVC使用 @RequestBody 标签问题记录
21jhf
springMVC使用 @RequestBody(required = false) UserVO userInfo
传递json对象数据,往往会出现http 415,400,500等错误,总结一下需要使用ajax提交json数据才行,ajax提交使用proxy,参数为jsonData,不能为params;另外,需要设置Content-type属性为json,代码如下:
(由于使用了父类aaa
一些排错方法
文强chu
方法
1、java.lang.IllegalStateException: Class invariant violation
at org.apache.log4j.LogManager.getLoggerRepository(LogManager.java:199)at org.apache.log4j.LogManager.getLogger(LogManager.java:228)
at o
Swing中文件恢复我觉得很难
小桔子
swing
我那个草了!老大怎么回事,怎么做项目评估的?只会说相信你可以做的,试一下,有的是时间!
用java开发一个图文处理工具,类似word,任意位置插入、拖动、删除图片以及文本等。文本框、流程图等,数据保存数据库,其余可保存pdf格式。ok,姐姐千辛万苦,
php 文件操作
aichenglong
PHP 读取文件 写入文件
1 写入文件
@$fp=fopen("$DOCUMENT_ROOT/order.txt", "ab");
if(!$fp){
echo "open file error" ;
exit;
}
$outputstring="date:"." \t tire:".$tire."
MySQL的btree索引和hash索引的区别
AILIKES
数据结构 mysql 算法
Hash 索引结构的特殊性,其 检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。
可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢
JAVA的抽象--- 接口 --实现
百合不是茶
抽象 接口 实现接口
//抽象 类 ,方法
//定义一个公共抽象的类 ,并在类中定义一个抽象的方法体
抽象的定义使用abstract
abstract class A 定义一个抽象类 例如:
//定义一个基类
public abstract class A{
//抽象类不能用来实例化,只能用来继承
//
JS变量作用域实例
bijian1013
作用域
<script>
var scope='hello';
function a(){
console.log(scope); //undefined
var scope='world';
console.log(scope); //world
console.log(b);
TDD实践(二)
bijian1013
java TDD
实践题目:分解质因数
Step1:
单元测试:
package com.bijian.study.factor.test;
import java.util.Arrays;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import com.bijian.
[MongoDB学习笔记一]MongoDB主从复制
bit1129
mongodb
MongoDB称为分布式数据库,主要原因是1.基于副本集的数据备份, 2.基于切片的数据扩容。副本集解决数据的读写性能问题,切片解决了MongoDB的数据扩容问题。
事实上,MongoDB提供了主从复制和副本复制两种备份方式,在MongoDB的主从复制和副本复制集群环境中,只有一台作为主服务器,另外一台或者多台服务器作为从服务器。 本文介绍MongoDB的主从复制模式,需要指明
【HBase五】Java API操作HBase
bit1129
hbase
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.ha
python调用zabbix api接口实时展示数据
ronin47
zabbix api接口来进行展示。经过思考之后,计划获取如下内容: 1、 获得认证密钥 2、 获取zabbix所有的主机组 3、 获取单个组下的所有主机 4、 获取某个主机下的所有监控项  
jsp取得绝对路径
byalias
绝对路径
在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下:
一、使用${pageContext.request.contextPath}
代码” ${pageContext.request.contextPath}”的作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的。
Java定时任务调度:用ExecutorService取代Timer
bylijinnan
java
《Java并发编程实战》一书提到的用ExecutorService取代Java Timer有几个理由,我认为其中最重要的理由是:
如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以 TimerTask抛出的未检查的异常会终止timer线程。这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。此时,已经被
SQL 优化原则
chicony
sql
一、问题的提出
在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统
java 线程弹球小游戏
CrazyMizzz
java 游戏
最近java学到线程,于是做了一个线程弹球的小游戏,不过还没完善
这里是提纲
1.线程弹球游戏实现
1.实现界面需要使用哪些API类
JFrame
JPanel
JButton
FlowLayout
Graphics2D
Thread
Color
ActionListener
ActionEvent
MouseListener
Mouse
hadoop jps出现process information unavailable提示解决办法
daizj
hadoop jps
hadoop jps出现process information unavailable提示解决办法
jps时出现如下信息:
3019 -- process information unavailable3053 -- process information unavailable2985 -- process information unavailable2917 --
PHP图片水印缩放类实现
dcj3sjt126com
PHP
<?php
class Image{
private $path;
function __construct($path='./'){
$this->path=rtrim($path,'/').'/';
}
//水印函数,参数:背景图,水印图,位置,前缀,TMD透明度
public function water($b,$l,$pos
IOS控件学习:UILabel常用属性与用法
dcj3sjt126com
ios UILabel
参考网站:
http://shijue.me/show_text/521c396a8ddf876566000007
http://www.tuicool.com/articles/zquENb
http://blog.csdn.net/a451493485/article/details/9454695
http://wiki.eoe.cn/page/iOS_pptl_artile_281
完全手动建立maven骨架
eksliang
java eclipse Web
建一个 JAVA 项目 :
mvn archetype:create
-DgroupId=com.demo
-DartifactId=App
[-Dversion=0.0.1-SNAPSHOT]
[-Dpackaging=jar]
建一个 web 项目 :
mvn archetype:create
-DgroupId=com.demo
-DartifactId=web-a
配置清单
gengzg
配置
1、修改grub启动的内核版本
vi /boot/grub/grub.conf
将default 0改为1
拷贝mt7601Usta.ko到/lib文件夹
拷贝RT2870STA.dat到 /etc/Wireless/RT2870STA/文件夹
拷贝wifiscan到bin文件夹,chmod 775 /bin/wifiscan
拷贝wifiget.sh到bin文件夹,chm
Windows端口被占用处理方法
huqiji
windows
以下文章主要以80端口号为例,如果想知道其他的端口号也可以使用该方法..........................1、在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等. 这里主要是用到windows下的DOS工具,点击"开始"--"运行",输入&
开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !
天梯梦
mobile
CKplayer,其全称为超酷flv播放器,它是一款用于网页上播放视频的软件,支持的格式有:http协议上的flv,f4v,mp4格式,同时支持rtmp视频流格 式播放,此播放器的特点在于用户可以自己定义播放器的风格,诸如播放/暂停按钮,静音按钮,全屏按钮都是以外部图片接口形式调用,用户根据自己的需要制作 出播放器风格所需要使用的各个按钮图片然后替换掉原始风格里相应的图片就可以制作出自己的风格了,
简单工厂设计模式
hm4123660
java 工厂设计模式 简单工厂模式
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式。是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
maven笔记
zhb8015
maven
跳过测试阶段:
mvn package -DskipTests
临时性跳过测试代码的编译:
mvn package -Dmaven.test.skip=true
maven.test.skip同时控制maven-compiler-plugin和maven-surefire-plugin两个插件的行为,即跳过编译,又跳过测试。
指定测试类
mvn test
非mapreduce生成Hfile,然后导入hbase当中
Stark_Summer
map hbase reduce Hfile path实例
最近一个群友的boss让研究hbase,让hbase的入库速度达到5w+/s,这可愁死了,4台个人电脑组成的集群,多线程入库调了好久,速度也才1w左右,都没有达到理想的那种速度,然后就想到了这种方式,但是网上多是用mapreduce来实现入库,而现在的需求是实时入库,不生成文件了,所以就只能自己用代码实现了,但是网上查了很多资料都没有查到,最后在一个网友的指引下,看了源码,最后找到了生成Hfile
jsp web tomcat 编码问题
王新春
tomcat jsp pageEncode
今天配置jsp项目在tomcat上,windows上正常,而linux上显示乱码,最后定位原因为tomcat 的server.xml 文件的配置,添加 URIEncoding 属性:
<Connector port="8080" protocol="HTTP/1.1"
connectionTi