一:什么是Zstandard
Zstandard (Zstd) 是一种由 Facebook 开发并开源 的新一代无损压缩算法。
它于 2015 年首次亮相 ,其核心价值在于成功地在高压缩比 与极速解压 之间找到了出色的平衡点 ,因此在技术社区中广受欢迎 。 相较于传统的 gzip 等工具,Zstd 实现了压缩效率上的突破 。它在保证数据高度压缩 的同时,还能提供远超同类算法的解压性能 ,完美契合了对吞吐量要求高 的现代化应用场景,例如大规模数据仓库的 ETL 流程、实时系统日志管理 和高性能数据流的网络传输。
二:Zstandard 有什么特点
1:极致的性能平衡
|-----------|-------------------------------------------------|--------------------------------------------|
| 特性 | 描述 | 应用价值 |
| 高压缩比 | 在标准测试中,Zstd 通常能提供优于 gzip 的压缩效果。 | 有效减少存储空间和数据传输带宽需求。 |
| 快速解压 | 具备极快的解压缩速度 ,甚至可以远超许多 SSD 的顺序读取速度。 | 极大提高数据读取效率 和应用程序的响应速度,尤其适合读取密集型场景。 |
| 多线程支持 | 内建多线程压缩功能 ,能充分利用现代多核 CPU 的性能,大幅提升压缩吞吐量。 | 在处理大数据集 时,显著缩短等待时间,提高工作效率。 |
2:灵活的定制能力
丰富的压缩级别选择
Zstd 提供了从 1 到 22 级 的广泛压缩级别范围,允许用户根据具体需求进行灵活的权衡 (Trade-off):
-
低级别 (1-3): 追求极快压缩速度 ,但压缩比较低。适用于需要实时压缩、对延迟敏感的场景(如网络传输)。
-
中等级别 (4-15): 提供良好的平衡点,是大多数通用场景的推荐设置。
-
高级别 (16-22): 追求最高压缩比 ,但压缩速度最慢。适用于归档存储,一旦压缩后很少解压的场景。
字典压缩模式 (Dictionary Mode)
这是一个关键特性,专门用于优化小数据块或大量小文件的压缩:
-
工作原理: 用户提供相似的样本数据进行训练 ,生成一个字典。该字典包含了这些样本中最常见的数据模式和重复序列。
-
效果: 在压缩和解压时加载该字典,可以帮助压缩器在数据量很小 (传统算法难以有效压缩)的情况下,识别出重复模式,从而实现更高的压缩率。
-
适用场景: HTTP/HTTPS 请求头、小型数据库记录、日志事件等。
3:完善的工具与生态
多样化的使用模式
Zstandard 提供了成熟的命令行工具,支持多种操作模式,使其不仅是一个库,也是一个实用的工具:
-
基本操作: 压缩 (
zstd)、解压 (unzstd)。 -
实用功能: 查看压缩文件信息 (
zstd -l)、测试文件完整性 (zstd -t) 等。
三:Zstandard 的安装
Debian/Ubuntu 系统的安装命令如下:
sudo apt install zstd
也可以从源码编译安装「这里以 1.5.7 版本为例」命令如下:
wget https://github.com/facebook/zstd/releases/download/v1.5.7/zstd-1.5.7.tar.gz
tar -zxvf zstd-1.5.7.tar.gz
cd zstd-1.5.7/
make
sudo make install
四:Zstandard (Zstd) 命令行使用指南
文件压缩 (Compression)
Zstd 的基本设计使其使用起来与传统的 gzip 或 xz 非常相似。
|-----------|-------------------------------------------|-----------------------------------|------------------------------------|
| 功能 | 命令行格式 | 示例 | 备注 |
| 基础压缩 | zstd <file_name> | zstd data.log | 生成 <file_name>.zst 文件,并默认删除原始文件。 |
| 指定级别 | zstd -<level> <file_name> | zstd -10 report.pdf | 级别范围为 1 (最快) 到 22 (最高压缩比)。 |
| 保留原文件 | zstd -k <file_name> | zstd -k big_data.csv | 使用 -k (keep) 选项,压缩完成后保留原始文件。 |
| 指定输出名 | zstd -c <file_name> > <output_name>.zst | zstd -c source.txt > target.zst | 使用标准输出 (-c),常用于管道操作或指定输出文件名。 |
文件解压 (Decompression)
Zstd 提供了多种解压命令形式,但核心是使用 -d 选项或直接调用 unzstd 命令。
|-----------|--------------------------------------------|---------------------------------------|---------------------------------------|
| 功能 | 命令行格式 | 示例 | 备注 |
| 基础解压 | zstd -d <archive_name>.zst | zstd -d backup.zst | 解压后默认删除 .zst 文件。 |
| 解压并保留 | zstd -d -k <archive_name>.zst | zstd -d -k archive.zst | 使用 -k (keep) 选项,保留 .zst 压缩文件。 |
| 指定输出名 | zstd -d -o <new_file> <archive_name>.zst | zstd -d -o final.txt compressed.zst | 使用 -o (output) 选项来指定解压后的文件名。 |
| 等效命令 | unzstd <archive_name>.zst | unzstd backup.zst | unzstd 命令与 zstd -d 是等效的。 |
目录和递归操作
Zstd 本身是针对文件的压缩工具 。为了处理目录,它引入了 递归 ( -r) 选项。
|----------|-------------------------------|--------------------------|----------------------------------------------------|
| 功能 | 命令行格式 | 示例 | 备注 |
| 压缩目录 | zstd -r <directory_name> | zstd -r logs_2023 | 递归 处理目录中的所有文件 ,为每个文件生成一个 .zst 文件。 |
| 解压目录 | zstd -dr <archive_name>.zst | zstd -dr logs_2023.zst | 错误! Zstd 的递归模式不会 将整个目录打包成单个 .zst 文件。 |
| 正确解压 | zstd -r -d <directory_name> | zstd -r -d logs_2023 | 当目录内有多个 .zst 文件时,使用 -r -d 批量解压。 |
最佳实践:
由于 zstd -r 只是对目录内的每个文件进行单独压缩,如果需要将整个目录打包成单个压缩文件,应首先使用 tar 工具进行打包,再用 Zstd 压缩:
# 打包并压缩:将整个 /my_dir 目录打包并用 Zstd 压缩 tar -I zstd -cf my_dir.tar.zst /my_dir
解压:
tar -I zstd -xf my_dir.tar.zst
信息查看与校验
|-----------|------------------------------|-----------------------|-----------------------------------------------|
| 功能 | 命令行格式 | 示例 | 作用 |
| 查看信息 | zstd -l <archive_name>.zst | zstd -l data.zst | 列出压缩文件的相关信息,包括压缩级别、原始大小、压缩大小 和压缩比。 |
| 测试完整性 | zstd -t <archive_name>.zst | zstd -t archive.zst | 测试 压缩文件是否完整且可解压,但不进行实际解压。常用于校验传输后的文件。 |
总结
上面就是博主今天分享的全部内容了,这些都是博主通过自己所找的资料和日常使用中总结出来的,肯定是有些方面是不太全面的。
本文原发于我的博客:landonVPS