1. 压缩基础概念:数据压缩的定义、压缩比与吞吐量、无损与有损压缩的区别

各位同学好,我是老张。今天开始咱们聊压缩策略选型。第一节课,先把地基打牢。

数据压缩,说白了就是用更少的空间存同样的信息。你想想看,一个 1GB 的文件,压缩完变成 200MB,省下来的 800MB 就是压缩的功劳。我在项目中遇到过不少新人,上来就追求极致压缩比,结果发现系统吞吐量掉得没法看。嗯,这里要记住:压缩不是单纯比谁压得小,而是要在空间和时间之间找到平衡。

1.1 数据压缩的定义

数据压缩的本质是去除冗余信息。冗余分两种:一种是统计冗余,比如一段文本里字母 'e' 出现频率特别高;另一种是感知冗余,比如一张图片里人眼分辨不出的细节。

压缩过程分两步:

  • 编码:把原始数据转换成更紧凑的表示形式
  • 解码:把紧凑形式还原成原始数据(或近似原始数据)

举个例子,假设你有一串数据:AAAAABBBBB。用游程编码(RLE)可以写成 5A5B。原来 10 个字符,现在 4 个字符。这就是压缩。

核心观点:压缩的本质是用算法复杂度换取存储空间。没有免费的午餐——压缩率越高,通常计算开销越大。

1.2 压缩比与吞吐量

这两个指标是压缩选型的命门。我习惯把它们放在一起看,因为单独看任何一个都会踩坑。

压缩比(Compression Ratio)

压缩比的定义很简单:

压缩比 = 原始数据大小 / 压缩后数据大小

比如原始 100MB,压缩后 25MB,压缩比就是 4:1。数值越大,压缩效果越好。

但注意,不同数据类型的压缩潜力天差地别:

数据类型 典型压缩比 说明
文本(英文) 2:1 ~ 5:1 英文冗余度高,压缩效果好
文本(中文) 1.5:1 ~ 3:1 中文字符编码更密集,压缩空间小
已压缩文件(ZIP/JPEG) 1:1 ~ 1.1:1 再压缩几乎无效,甚至变大
日志文件 5:1 ~ 20:1 重复模式多,压缩潜力巨大
数据库备份 3:1 ~ 10:1 取决于数据分布

避坑指南:我曾经在项目中遇到一个同事,拿 gzip 去压缩 JPEG 图片,结果压缩比只有 1.01:1,还多花了 CPU 时间。记住:不要对已压缩数据再压缩,那是白费力气。

吞吐量(Throughput)

吞吐量衡量的是压缩/解压的速度,单位通常是 MB/s 或 GB/s。公式:

吞吐量 = 处理的数据量 / 耗时

吞吐量分为压缩吞吐量和解压吞吐量。很多算法解压比压缩快得多,比如 LZ4 解压速度能达到压缩速度的 2-3 倍。这在读多写少的场景下非常有利。

压缩比和吞吐量通常是互斥的:

  • 追求高压缩比 → 算法复杂 → 吞吐量下降
  • 追求高吞吐量 → 算法简单 → 压缩比降低

我个人的经验是:先确定业务对延迟的容忍度,再选压缩比。比如实时日志采集,吞吐量是第一优先级;冷数据归档,压缩比才是王道。

1.3 无损压缩与有损压缩的区别

这是压缩领域最基础的分水岭。说白了就是:解压后能不能完美还原原始数据。

无损压缩(Lossless Compression)

解压后的数据与原始数据完全一致,一个比特都不差。适用于:

  • 文本文件、代码、配置文件
  • 数据库备份、交易日志
  • 可执行程序、压缩包

常见算法:

  • Huffman 编码:基于字符频率的变长编码
  • LZ77/LZ78:基于字典的滑动窗口算法
  • Deflate:Huffman + LZ77 组合,ZIP/Gzip 的核心
  • LZ4:追求极致速度的 LZ77 变体
  • Zstandard (zstd):Facebook 出品,压缩比和速度均衡

有损压缩(Lossy Compression)

解压后的数据与原始数据近似但不完全一致。它丢弃了人眼或人耳不敏感的信息,换取更高的压缩比。适用于:

  • 图片(JPEG、WebP)
  • 音频(MP3、AAC)
  • 视频(H.264、H.265)

常见算法:

  • JPEG:基于离散余弦变换(DCT),丢弃高频细节
  • MP3:基于心理声学模型,丢弃人耳不敏感的频率
  • H.264:帧间预测 + 变换编码,丢弃空间和时间冗余

重要提醒:有损压缩不可逆。一旦压缩,丢失的信息就永远找不回来了。我曾经见过有人把公司的重要合同扫描件用 JPEG 压缩,结果文字边缘模糊,OCR 识别率暴跌。关键文档一定要用无损格式(PNG、TIFF)。

对比总结

维度 无损压缩 有损压缩
还原度 100% 精确 近似,有信息损失
压缩比 通常 2:1 ~ 5:1 可达 10:1 ~ 100:1
适用场景 文本、代码、数据 图片、音频、视频
算法复杂度 中等 高(需要感知模型)
典型算法 Gzip、LZ4、zstd JPEG、MP3、H.264

1.4 知识体系总览

下面这张图把本章的核心概念串起来了。我建议你保存下来,后续章节都会围绕这些维度展开。

压缩基础概念知识体系 数据压缩 定义:去除冗余 压缩比 vs 吞吐量 无损 vs 有损 统计冗余 感知冗余 压缩比 = 原始/压缩后 吞吐量 = 数据量/时间 无损:100%还原 有损:近似还原 无损算法:Gzip、LZ4、zstd、Huffman 有损算法:JPEG、MP3、H.264 核心权衡:压缩比 ↑ → 吞吐量 ↓ 选型关键:先定业务容忍度,再选算法

这张图把本章的三个核心概念——定义、压缩比与吞吐量、无损与有损——串成了一个整体。你注意看底部的说明框,那是我最想强调的:选型永远是在压缩比和吞吐量之间做权衡,没有银弹。

个人经验:我刚开始做存储系统时,总想找一个"最好"的压缩算法。后来发现,最好的算法取决于你的场景。日志系统用 LZ4,冷数据归档用 zstd 或 Gzip,图片服务用 WebP。没有万能药,只有最合适的组合。

好了,这一章的基础概念就讲到这里。记住三个关键词:冗余去除、压缩比与吞吐量的权衡、无损与有损的适用边界。后面章节我们会深入具体算法的实现细节和性能调优,到时候这些基础概念会反复用到。