paimon的四种changelog模式(4)-full-compaction模式

数据湖Paimon入门指南 如果用户建表时指定'merge-engine' = 'partial-update',那么就会使用部分更新表引擎,可以做到多个 Flink 流任务去更新同一张表,每条流任务只更新一张表的部分列,最终实现一行完整的数据的更新,对于需要拉宽表的业务场景,partial-update 非常适合此场景,而且构建宽表的操作也相对简单。这种方式的成本相对较高,同时官方不建议这样使用,因为下游任务在 State 中存储一份全量的数据,即每条数据以及其变更记录都需要保存在状态中。流式查询将不断产生最新的更改。 阅读详情
AI摘要

本文深入分析Paimon的full-compaction模式,对比lookup模式在checkpoint机制下的差异。该模式通过配置n次checkpoint触发一次compaction,降低资源消耗,适用于对数据延迟不敏感但需高效批量处理的场景,尤其适合非CDC来源且用于后续流式计算的表。

请先了解lookup模式,然后再看full-compaction模式

环境创建

CREATE CATALOG fs_catalog WITH (
    'type'='paimon',
    'warehouse'='file:/data/soft/paimon/catalog'
);

USE CATALOG fs_catalog;

drop table if exists t_changelog_fullcompaction;
 
CREATE TABLE t_changelog_fullcompaction(
      age BIGINT,
      money BIGINT,
      hh STRING,
      PRIMARY KEY (hh) NOT ENFORCED
)WITH (
    'merge-engine' = 'deduplicate',
    'changelog-producer' = 'full-compaction'
);

paimon的snapshot和checkpoint之间的关系

  • 一次snapshot会产生一个data文件
  • 一次checkpoint会产生1-2个snapshot文件,要看这次checkpoint是否触发compaction,触发了就是2个data文件(一个是合并后的数据,一个本次checkpoint写入数据),否则只有一个(本次checkpoint写入数据)
  • paimon 流式写入根据checkpoint间隔,定期生成snapshot
  • 批写(手动执行sql脚本)每一个sql会立即生成snapshot,不管checkpoint间隔配置

lookup模式,一次checkpoint会产生一个chagelog,而full-compaction会等待若干次checkpoint后才产生一个chagelog,这取决于参数
在这里插入图片描述
如果配置 full-compaction.delta-commits = 2 ,意思就是说,在流式处理场景中checkpoint2次,产生2个snapshot后才会生成一个changelog

在批处理场景下,一次sql就会产生一个check

流式写入验证(1)

CREATE TEMPORARY TABLE t_auto_generated_data (
      age BIGINT,
      money BIGINT,
      hh STRING,
      PRIMARY KEY (hh) NOT ENFORCED
) WITH (
    'connector' = 'datagen', -- 使用datagen连接器自动生成数据
    'fields.age.kind' = 'random', -- age字段生成随机数
    'fields.age.min' = '1', -- age字段最小值
    'fields.age.max' = '100', -- age字段最大值
    'fields.money.kind' = 'random', -- money字段生成随机数
    'fields.money.min' = '0', -- money字段最小值
    'fields.money.max' = '10000', -- money字段最大值
    'fields.hh.kind' = 'random', -- hh字段生成随机字符串
    'fields.hh.length' = '10' -- hh字段长度
);
-- 设置checkpoint的间隔60s
SET 'execution.checkpointing.interval'='60 s';
-- 流式写入
insert into t_changelog_fullcompaction select * from t_auto_generated_data;

过一段时间后,我们查看catalog目录,观察changelog产生的时间,1分钟一个和checkpoint的间隔是一样的,现在的现象和lookup是一样的,一次checkpoint产生一个changelog
root@wsl01:/data/soft/paimon/catalog/default.db/t_changelog_fullcompaction/bucket-0# ll
total 66904
-rw-r–r-- 1 root root 335296 Nov 28 10:04 changelog-3b6403dd-f6a3-4492-b376-9d6ecadc97e1-0.parquet
-rw-r–r-- 1 root root 9580478 Nov 28 10:05 changelog-3b6403dd-f6a3-4492-b376-9d6ecadc97e1-2.parquet
-rw-r–r-- 1 root root 9581448 Nov 28 10:06 changelog-3b6403dd-f6a3-4492-b376-9d6ecadc97e1-4.parquet
-rw-r–r-- 1 root root 335296 Nov 28 10:04 data-3a8b0d35-34db-4aca-81de-68dea000a669-0.parquet
-rw-r–r-- 1 root root 9580478 Nov 28 10:05 data-3a8b0d35-34db-4aca-81de-68dea000a669-1.parquet
-rw-r–r-- 1 root root 9581448 Nov 28 10:06 data-3a8b0d35-34db-4aca-81de-68dea000a669-2.parquet
-rw-r–r-- 1 root root 10026806 Nov 28 10:05 data-3b6403dd-f6a3-4492-b376-9d6ecadc97e1-1.parquet
-rw-r–r-- 1 root root 19477692 Nov 28 10:06 data-3b6403dd-f6a3-4492-b376-9d6ecadc97e1-3.parquet

流式写入验证(2)

加上full-compaction.delta-commits = 2参数,看看changelog产生的变化情况

drop table if exists t_changelog_fullcompaction2;
 
CREATE TABLE t_changelog_fullcompaction2(
      age BIGINT,
      money BIGINT,
      hh STRING,
      PRIMARY KEY (hh) NOT ENFORCED
)WITH (
    'merge-engine' = 'deduplicate',
    'changelog-producer' = 'full-compaction',
    'full-compaction.delta-commits' = '2'
);

-- 设置checkpoint的间隔60s
SET 'execution.checkpointing.interval'='60 s';
-- 流式写入
insert into t_changelog_fullcompaction2 select * from t_auto_generated_data;

过一段时间后,我们查看catalog目录,观察changelog产生的时间,2分钟一个,就是根据我们的full-compaction.delta-commits参数*checkpoint间隔,也就是n次checkpoint产生一个changelog
不是根据时间间隔,而是根据checkpoint触发次数,这点在批写的时候会有体现

root@wsl01:/data/soft/paimon/catalog/default.db/t_changelog_fullcompaction2/bucket-0# ll
total 131168
-rw-r–r-- 1 root root 10024339 Nov 28 10:16 changelog-99b10288-0cd7-471e-8afd-075620279701-1.parquet
-rw-r–r-- 1 root root 18879457 Nov 28 10:18 changelog-99b10288-0cd7-471e-8afd-075620279701-3.parquet
-rw-r–r-- 1 root root 2945606 Nov 28 10:20 changelog-99b10288-0cd7-471e-8afd-075620279701-5.parquet
-rw-r–r-- 1 root root 10024339 Nov 28 10:16 data-99b10288-0cd7-471e-8afd-075620279701-0.parquet
-rw-r–r-- 1 root root 28811744 Nov 28 10:18 data-99b10288-0cd7-471e-8afd-075620279701-2.parquet
-rw-r–r-- 1 root root 31599979 Nov 28 10:20 data-99b10288-0cd7-471e-8afd-075620279701-4.parquet
-rw-r–r-- 1 root root 335703 Nov 28 10:15 data-d3f11150-7e72-4cb6-addf-7079367bea42-0.parquet
-rw-r–r-- 1 root root 9575206 Nov 28 10:16 data-d3f11150-7e72-4cb6-addf-7079367bea42-1.parquet
-rw-r–r-- 1 root root 9568870 Nov 28 10:17 data-d3f11150-7e72-4cb6-addf-7079367bea42-2.parquet
-rw-r–r-- 1 root root 9575911 Nov 28 10:18 data-d3f11150-7e72-4cb6-addf-7079367bea42-3.parquet
-rw-r–r-- 1 root root 2941759 Nov 28 10:19 data-d3f11150-7e72-4cb6-addf-7079367bea42-4.parquet
-rw-r–r-- 1 root root 5890 Nov 28 10:20 data-d3f11150-7e72-4cb6-addf-7079367bea42-5.parquet

当不设置delta-commits参数时,样子好像和lookup没有什么差别,因此如果要用full-compaction时,必须要加上delta-commits参数,来控制compaction的触发间隔。

lookup模式每次checkpoint都会进行一次compaction,数据延迟较小,但是资源消耗大,如果你不在乎数据延迟,那么你可以使用full-compaction模式,将若干次的checkpoint攒到一起,然后统一执行一次compaction,这样能减少资源消耗,但是会增大数据延迟

批处理写入验证

批处理每次写入都会触发一次checkpoint,那么在full-compaction下,如果配置了 ‘full-compaction.delta-commits’ = ‘2’,会有什么效果?

三次写入后,产生了4个changelog,原因就是我们配置了2次checkpoint产生一次compaction,在第三次时,发现前边已经完成了两次checkpoint,因此要进行一次compaction,然后还有第三次本身的数据,一共4个changelog,这个简单理解就行,没有人用full-compaction模式的表进行批写
root@wsl01:/data/soft/paimon/catalog/default.db/t_changelog_fullcompaction2/bucket-0# ll
total 40
-rw-r–r-- 1 root root 1217 Nov 28 10:39 changelog-01040eb2-9c68-45b7-b04c-00bd3f4b8c45-0.parquet
-rw-r–r-- 1 root root 1362 Nov 28 10:40 changelog-2ed968c6-d7c3-47c7-9416-00ad010ef7d0-1.parquet
-rw-r–r-- 1 root root 1217 Nov 28 10:39 changelog-30c7d2fe-942b-42bd-884f-c2ccf4c6005d-0.parquet
-rw-r–r-- 1 root root 1362 Nov 28 10:39 changelog-4a1f24c6-8b9c-455b-b153-cd5688b3e9f4-1.parquet
-rw-r–r-- 1 root root 1217 Nov 28 10:39 data-243a924d-b38f-4a8c-9704-bccbbc63a3dd-0.parquet
-rw-r–r-- 1 root root 1217 Nov 28 10:40 data-2ed968c6-d7c3-47c7-9416-00ad010ef7d0-0.parquet
-rw-r–r-- 1 root root 1217 Nov 28 10:39 data-2facc877-fd84-4717-b10f-28187bcca435-0.parquet
-rw-r–r-- 1 root root 1217 Nov 28 10:39 data-4a1f24c6-8b9c-455b-b153-cd5688b3e9f4-0.parquet
-rw-r–r-- 1 root root 1217 Nov 28 10:40 data-82c7c2f9-03b2-4aea-83ae-b0dc28a7427e-0.parquet
-rw-r–r-- 1 root root 1217 Nov 28 10:39 data-fa4c9a01-13e0-46f3-be45-c15f34577282-0.parquet

结论

  • changelog=full-compaction模式相比于lookup模式区别在于changelog的生成时间
    • lookup模式:一次checkpoint产生一次changelog,数据延迟小,资源消耗大
    • full-compaction模式:n次checkpoint产生一次changelog,数据延迟大,资源消耗小

应用场景

  • 非cdc采集的表(不能完整的提供数据变化流)
  • and
  • 后期要进行流式处理的表
  • and
  • 不在乎数据延迟的场景
Apache Paimon:流式数据湖存储实践与核心原理解析 数据湖架构在实时场景中常面临更新困难、小文件膨胀与读取延迟等问题,传统批式存储难以支撑流式写入与增量消费的需求。LSM-Tree 结构通过追加写入与后台合并的方式,平衡写入性能与查询效率,成为流式存储设计的核心思想。Apache Paimon 将 LSM 理念与列式文件格式结合,在 HDFS 或对象存储之上实现支持主键更新、聚合预计算和 Changelog 生成的表格式存储,为实时数仓提供统一的流批一体底座。借助 Flink 的流式计算能力,Paimon 可高效承接 CDC 数据入湖、实时宽表拼接与指标聚合 阅读详情

相关推荐

数据湖Paimon 1.4.2 从理论到实践 —— 第 6 章 表存储模式与 Changelog Producer

Paimon 1.4.2 支持 MOR、COW、MOW 三种主键表存储模式,分别适用于写入密集、读多写少及读写均衡场景。MOW 模式通过 Deletion Vector 实现高效查询与良好写入性能,推荐用于实时查询表。Changelog Producer 提供四种模式:none(默认)、input(低延迟)、lookup(完整变更)、full-compaction(高一致性),根据下游需求选择,lookup 模式兼顾完整性与实时性,是主流推荐方案。

大数据架构师,深耕车联网实时数仓。专注 Flink / Paimon / Doris 流批一体、CDC 同步与实时 AI 推理,把生产里的架构选型、作业实战和故障排查整理成 4 个连载系列,只写实测跑得通的方案,欢迎私信交流。 19

流数据湖平台Apache Paimon(三)Flink进阶使用

默认情况下,不仅checkpoint会导致文件生成,writer的内存(write-buffer-size)耗尽也会将数据flush到DFS并生成相应的文件。稍后可能会发生异步Compaction,CompactManager 生成的提交表包含有关先前文件和合并文件的信息,以便 Committer Operator 可以构造相应的清单条目。Paimon维护文件的多个版本,文件的Compaction和删除是逻辑上的,并没有真正删除文件。如果要减少此数量,可以保留更少的文件,但写入性能可能会受到影响。

Maynor的博客 4060

paimon实战 -- Changelog Producer到底有什么用?

其实是不适用的, 上面我们提到 None 模式的流读其实就是读取 L0的文件, 那么我们只要看 L0的文件是否包含 Key 的变更记录. 因为 write buffer 会有合并的逻辑, 所以, 对于 CDC 的数据, L0中可能会是已经在内存合并后的数据. 比如同一个 key 的-U 和+U 消息, 同时写入, 那么在 writer buffer 写入的时候就已经只保留+U 消息了, 所以 None 模式中 L0文件中的数据, 可能已经是合并后的数据, 对于 CDC 的数据也不适用.

阿华田的博客 1761

3 Paimon数据湖中的表类型详解_paimon表和hive区别

-- /*+ OPTIONS(‘scan.mode’=‘from-snapshot’,‘scan.snapshot-id’ = ‘1’) */ – 通过动态表选项来指定数据读取(扫描)模式,以及从哪里开始读取。|-- /*+ OPTIONS(‘scan.mode’=‘from-snapshot’,‘scan.snapshot-id’ = ‘1’) */ – 通过动态表选项来指定数据读取(扫描)模式,以及从哪里开始读取。

2401_84164672的博客 1095

Paimon实战 -- paimon原理解析

Apache Paimon 原名 Flink Table Store,2022年1月在 Apache Flink 社区从零开始研发,Flink 社区希望能够将 Flink 的 Streaming 实时计算能力和 Lakehouse 新架构优势进一步结合,促进数据在数据湖上真正实时流动起来,并为用户提供实时离线一体化的开发体验。

阿华田的博客 5073

hudi系列-文件压缩(compaction)

压缩(compaction)仅作用于MergeOnRead类型表,MOR表每次增量提交(deltacommit)都会生成若干个日志文件(行存储的avro文件),为了避免读放大以及减少文件数量,需要配置合适的压缩策略将增量的log file合并到base file(parquet)中。...

1032851561的博客 8389

Paimon的Changelog Producer到底有什么用?

很早以前我在一篇文章中提到流批落地的方案,其中之一就是在存储引擎上实现流批的能力。可以说Paimon的Changelog能力是Paimon能够成为流批框架落地最佳选型的核心因素之一。Paimon本身提供了4种Changelog生成方式。他们有什么不同?目的Chaneglog producer 的主要目的是为了在 Paimon 表上产生流读的 changelog, 所以如果只是批读的表是可以不用设置...

微信搜:import_bigdata,大数据领域硬核原创作者 1754

Apache Paimon 数据出仓源码导读(二):Paimon Changelog 到底输出什么?+I、-U、+U、-D 与 Changelog Producer

同一条 MySQL UPDATE,为什么有时输出 +I,有时是 -D/+I,还有时是 -U/+U?本文结合 Apache Paimon 1.4.2 源码,从 RowKind、Changelog Producer、Changelog 文件与 Flink Normalize 入手,讲清 none、input、lookup、full-compaction 的输出差异、实现原因和运维取舍。

随便写写,记录一些生活、想法和偶尔冒出的念头。 393

Paimon系列:主键表流读之changelog producer

在上一篇《主键表之合并引擎merge-engine》中的结尾,当 'merge-engine' = 'first-row',开启流读的时候,会抛一下错误,提示要使用 lookup 或 full-campaction 这两种 changelog producer 才支持流读,input 模式也支持,但是只会返回输入的记录。changelog producer的作用。

2502_92343817的博客 870

基于 FlinkSQL + Paimon + Doris 的车联网流批一体湖仓实践 —— 第 3 章 Paimon 1.4 湖仓底座与 Catalog 配置

本章基于车联网TSP真实生产场景,详解Paimon 1.4湖仓底座配置。通过Hive Metastore Catalog实现与存量数仓共用元数据与权限体系,保障兼容性与运维统一;确立主键、分区、桶等核心参数(如bucket=6、primary-key=vin,collect_time,dt),确保流批一体更新能力与并行性能;明确changelog-producer选型及连接器jar加载位置,规避Catalog创建失败风险。所有配置均经生产验证,为后续流批作业奠定坚实基础。

大数据架构师,深耕车联网实时数仓。专注 Flink / Paimon / Doris 流批一体、CDC 同步与实时 AI 推理,把生产里的架构选型、作业实战和故障排查整理成 4 个连载系列,只写实测跑得通的方案,欢迎私信交流。 108

Apache Paimon 数据出仓源码导读(三):Paimon 出仓到 MySQL:UPSERT、DELETE 与幂等恢复

本文从源码拆解 Paimon 出仓到 MySQL 的完整写入链路,讲清 Flink JDBC Sink 是逐条接收、按子任务攒批,再通过 UPSERT 与 DELETE 批量执行;同时分析 Checkpoint 重放、主键幂等、跨批短暂空窗及无状态重跑的边界。

随便写写,记录一些生活、想法和偶尔冒出的念头。 469

Paimon changelog-producer 与 merge-engine

Paimon表的changelog-producer用于生成数据变更日志,支持四种模式:None、Input、Lookup和full-compaction。None模式不存储额外数据,适用于批处理场景;Input模式直接传递输入消息,适合数据库binlog场景;Lookup模式查找旧值生成完整变更日志,适合有计算逻辑的表;full-compaction模式在完全合并文件时生成变更日志,代价较高。不同模式根据业务需求选择,以平衡时效性和资源开销。

qq_15138049的博客 476

基于单片机直流电机调速控制系统设计

*单片机设计介绍,基于单片机直流电机调速控制系统设计。

2201_75940997的博客 2781

Paimon 表里明明是 80 元,下游为何算成 180?Checkpoint 成功不等于变更完整

Paimon 表里的最终值正确,只证明状态存对了;下游能不能算对,还取决于变化过程有没有被完整表达。

weixin_42426485的博客 309

Unity通用Buff系统,Buff编辑器(1,理论篇)(技能系统之Buff篇)

逻辑层根据游戏的规则和设计,控制Buff的生命周期、影响目标对象的属性或行为,以及处理Buff的交互和冲突。Buff堆叠和冲突:有些游戏中允许同类型的Buff叠加,以增加效果的强度,而有些游戏中可能不允许Buff叠加,只能由更强力的Buff来覆盖较弱的Buff。灵活个性化:每个游戏对象拥有自己的BuffManager,可以实现个体对象的独特Buff效果,增加游戏的多样性和个性化。自由控制:每个对象独立管理自己的Buff,可以自由地激活、更新和移除Buff效果,提供更精细的控制和逻辑实现。

u010082265的博客 4695

一文讲透 .claude/ 文件夹:Claude Code 团队配置指南和最佳实践

本文系统梳理了ClaudeCode配置框架,旨在解决实际落地中的常见困惑。文章从五层作用域体系(组织策略、命令行参数、本地覆盖、项目级、用户级)切入,详细解析了CLAUDE.md、rules、skills、agents等核心组件的定位与配合关系。重点强调了"确定性规则"与"概率性建议"的分层设计:权限控制和安全边界应通过settings.json和hooks实现,而工作约定和编码规范适合放在CLAUDE.md。文中提供了可直接套用的最小配置方案,并总结了10大常见踩坑

981

paimon merge into量大,update delete量多,导致compact太久

比如同一个主键 1 分钟内更新 20 次,直接写 Paimon 就是 20 条变更,compact 要处理 20 个版本。如果业务允许,先在 Flink 上游按主键做 mini-batch 合并,只保留最后一条。

yy的博客 238

OpenCLI入门:让任何网站变成你的命令行工具(超详细版)

最有用的工具,往往是最简单的。 opencli就是这样。 它不会帮你写代码,不会帮你做决策,但它能把200+个平台装进你的命令行。 让你用最简单的方式,获取最丰富的数据。

weixin_66295112的博客 2094

别再说 Paimon 只是表格式,真正值钱的是让更新进入数据湖

Paimon 不是普通 Parquet 目录加元数据。Primary Key Table 在 Bucket 内用 LSM 把随机更新转成有序追加,由 Merge Engine 得到当前状态,再通过原子 Snapshot 统一批读与流读边界。代价是 Compaction、Bucket、Changelog 和 Snapshot 生命周期必须治理,它也不替代 OLTP 与在线查询数据库。

weixin_42426485的博客 585

从零搭建VGGNet

在 forward 方法中实现了前向传播过程,包括卷积、激活、池化和平铺操作,最后通过全连接层得到分类结果。使用 torch.onnx.export 将模型导出为 ONNX 格式的文件 vgg.onnx。导出 ONNX:将模型导出为 ONNX 格式,便于在其他平台或框架中使用。定义 VGG 网络:构建了一个包含多个卷积层、池化层和全连接层的网络。使用 torch.save 将整个模型保存为 vgg.pth 文件。前向传播:对输入数据进行前向传播,得到输出结果。保存模型:将模型保存为 .pth 文件。

开源驱动,创造价值;坦诚清晰,快速失败;让复杂可计算。 522

模仿学习(Imitation Learning)概述

什么是模仿学习呢?简单来说,模仿学习(Imitation Learning),就是要训练机器能够复制人类的连续动作,进而达到模仿的目的。其实,Imitation Learning的实用性很高,假设今天有一个训练场景,你不知道该怎么定奖励值(reward),但是你可以收集到专家的示范数据(expert demonstration data),你就可以考虑用Imitation Learning这个方法。因此,模仿学习也被寄予很高的期待,成为下一代强人工智能的关键技术。......

qq_22749225的博客 2万+

Paimon之LSM-Tree及其分层策略

层级文件特征Key 范围特征合并触发条件L0MemTable Flush 结果文件间无序,文件内有序MemTable 满(默认 128MB)L1L0 合并产物文件间可能重叠L0 文件数达到阈值L2+深层合并产物文件间严格不重叠,且全局有序下层文件总大小达到阈值关键配置参数'num-sorted-run.stop-trigger' = '5', -- L0 文件数达到 5 触发 Minor Compaction。

weixin_43935207的博客 561

手把手教你学AI GPU的UMD驱动软件开发专栏简介

通过本专栏的学习,您将掌握UMD的核心概念、开发环境搭建、API实现、内存管理和同步技术,以及在实际AI场景中的应用。通过本专栏的学习,您将不仅掌握UMD驱动开发的核心技术,还将能够将这些技术应用到实际的AI应用场景中,为您的AI应用提供更高效的硬件加速支持。无论您是想开发自己的AI加速框架,还是希望深入理解现有AI加速库的工作原理,本专栏都将为您提供宝贵的知识和实践经验。:本专栏不仅讲解UMD驱动的核心概念,还通过精心设计的实战案例,引导您从零开始构建UMD驱动,真正掌握AI GPU驱动开发的技能。

MHD0815的博客 115

大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1)

理解 Paimon changelog producer,理解主键表的几种引擎

qq_44665283的博客 2688

PCL 八叉树的使用

八叉树(Octree)是一种空间划分的数据结构,广泛应用于三维点云的处理和分析。八叉树通过将空间递归地划分为八个子区域,可以有效地组织和索引三维点数据,提升点云的查询、降采样和配准等操作的效率。

纵马踏花向自由 1659

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

关于数据湖 Paimon,万字长文带你快速入门(上)

For fields.<field-name>.sequence-group, valid comparative data types include: DECIMAL, TINYINT, SMALLINT, INTEGER, BIGINT, FLOAT, DOUBLE, DATE, TIME, TIMESTAMP, and TIMESTAMP_LTZ. sequence-group支持以上这些类型。当 n=1 的时候,对生成 changelog 的延迟没有特别大的影响。

云祁QI 1159

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: paimon的四种changelog模式(3)-lookup模式
下一篇: LSM Tree 底层设计理念
JNWsong
博客等级 码龄9年 287粉丝 204原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值