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 知识体系总览
下面这张图把本章的核心概念串起来了。我建议你保存下来,后续章节都会围绕这些维度展开。
这张图把本章的三个核心概念——定义、压缩比与吞吐量、无损与有损——串成了一个整体。你注意看底部的说明框,那是我最想强调的:选型永远是在压缩比和吞吐量之间做权衡,没有银弹。
个人经验:我刚开始做存储系统时,总想找一个"最好"的压缩算法。后来发现,最好的算法取决于你的场景。日志系统用 LZ4,冷数据归档用 zstd 或 Gzip,图片服务用 WebP。没有万能药,只有最合适的组合。
好了,这一章的基础概念就讲到这里。记住三个关键词:冗余去除、压缩比与吞吐量的权衡、无损与有损的适用边界。后面章节我们会深入具体算法的实现细节和性能调优,到时候这些基础概念会反复用到。