在Java中几种常用数据压缩算法的实现及其优劣势
在Java中几种常用数据压缩算法的实现及其优劣势
背景:项目需要引入Redis作为缓存组件,需要考虑到Redis的内存占用(机器内存越大,成本越高),因此需要引入数据压缩。
1、介绍
数据压缩是计算机领域中一项重要的技术,它可以将数据在占用更小的存储空间或通过更低的传输带宽进行表示和传输。数据压缩的重要性源于以下几个方面:
-
节省存储空间:随着数据的不断增长,存储空间成为一项宝贵的资源。通过压缩数据,可以显著减少存储设备的使用量,从而降低存储成本并提高数据管理的效率。
-
提高数据传输效率:在数据通信领域,传输带宽是一个宝贵的资源。通过压缩数据,可以减少传输数据的大小,从而降低传输延迟和成本,并提高数据传输的效率。
-
数据备份和归档:压缩数据可以减少备份和归档操作所需的存储空间和传输时间。这对于保护和长期保存数据至关重要。
-
提高系统性能:压缩数据可以降低数据访问和处理的时间,提高系统的响应速度和性能。
此处主要介绍以下几种压缩算法:
- Gzip
- Snappy
- Bzip2
- LZ4
2、压缩算法及其实现
2.1、Gzip
介绍
Java 标准库 (java.util.zip
) 提供了对 Gzip 的原生支持,使用 GZIPOutputStream
和 GZIPInputStream
类可以轻松进行压缩和解压操作。
依赖引入
无需引入依赖
示例代码
// 压缩方法
public byte[] compressGzip(String value) {ByteArrayOutputStream bos = new ByteArrayOutputStream();GZIPOutputStream gos;try {gos = new GZIPOutputStream(bos);gos.write(value.getBytes(StandardCharsets.UTF_8));gos.close();return bos.toByteArray();} catch (IOException e) {// 可自定义异常处理e.printStackTrace();return null;}
}// 解压方法
public String uncompressGzip(byte[] value) {ByteArrayInputStream bis = new ByteArrayInputStream(value);ByteArrayOutputStream bos = new ByteArrayOutputStream();GZIPInputStream gis = null;try {gis = new GZIPInputStream(bis);byte[] buffer = new byte[1024];int len;while ((len = gis.read(buffer)) != -1) {bos.write(buffer, 0, len);}bos.close();gis.close();return bos.toString(StandardCharsets.UTF_8.name());} catch (IOException e) {// 可自定义异常处理e.printStackTrace();return null;}
}
优势
- 无损压缩
- 原生支持
- 可调节压缩级别
劣势
- 压缩速度较慢
- 内存占用较高(尤其在处理大文件时)
2.2、Snappy
介绍
Snappy 是由 Google 开发的一种快速压缩算法,Java 平台上有多个实现。该库提供了高效的压缩和解压功能,并且与 Hadoop、HBase 等大数据框架集成良好。
依赖引入
<dependency><groupId>org.xerial.snappy</groupId><artifactId>snappy-java</artifactId><version>1.1.10.7</version>
</dependency>
代码示例
// 使用Snappy自带解压缩
public byte[] compressSnappyC(String value) {try {return Snappy.compress(value);} catch (IOException e) {throw new RuntimeException(e.getMessage(), e);}
}public String uncompressSnappyC(byte[] value) {try {return Snappy.uncompressString(value);} catch (IOException e) {throw new RuntimeException(e.getMessage(), e);}
}// 使用SnappyOutputStream和SnappyInputStream进行解压缩
public byte[] compressSnappyO(String value) {ByteArrayOutputStream bos = new ByteArrayOutputStream();SnappyOutputStream sos;try {sos = new SnappyOutputStream(bos);sos.write(value.getBytes(StandardCharsets.UTF_8));sos.close();return bos.toByteArray();} catch (IOException e) {// 可自定义异常处理e.printStackTrace();return null;}
}public String uncompressSnappyO(byte[] value) {ByteArrayInputStream bis = new ByteArrayInputStream(value);ByteArrayOutputStream bos = new ByteArrayOutputStream();SnappyInputStream sis = null;try {sis = new SnappyInputStream(bis);byte[] buffer = new byte[1024];int len;while ((len = sis.read(buffer)) != -1) {bos.write(buffer, 0, len);}bos.close();sis.close();return bos.toString(StandardCharsets.UTF_8.name());} catch (IOException e) {e.printStackTrace();return null;}
}
优势
- 压缩和解压缩速度快
- 占用内存较低
- 与大数据框架集成好
劣势
- 压缩比较低
- 不支持多线程压缩
2.3、Bzip2
介绍
Java 标准库 (java.util.zip
) 提供了对 Bzip2 的支持,使用 BZip2CompressorOutputStream
和 BZip2CompressorInputStream
类可以轻松进行压缩和解压操作。不过,标准库中的 Bzip2 支持是从 Java 9 开始引入的。如果你使用的是 Java 8 或更早版本,可以使用第三方库如 Apache Commons Compress。
依赖引入
<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.4.1</version>
</dependency>
代码示例
public byte[] compressBzip2(String value) {ByteArrayOutputStream bos = new ByteArrayOutputStream();BZip2CompressorOutputStream bzip2os;try {bzip2os = new BZip2CompressorOutputStream(bos);bzip2os.write(value.getBytes(StandardCharsets.UTF_8));bzip2os.close();return bos.toByteArray();} catch (IOException e) {// 可自定义异常处理e.printStackTrace();return null;}
}public String uncompressBzip2(byte[] value) {ByteArrayInputStream bis = new ByteArrayInputStream(value);ByteArrayOutputStream bos = new ByteArrayOutputStream();BZip2CompressorInputStream sis = null;try {sis = new BZip2CompressorInputStream(bis);byte[] buffer = new byte[1024];int len;while ((len = sis.read(buffer)) != -1) {bos.write(buffer, 0, len);}bos.close();sis.close();return bos.toString(StandardCharsets.UTF_8.name());} catch (IOException e) {e.printStackTrace();return null;}
}
优势
- 无损压缩
- 压缩比非常高
- 支持多线程压缩
劣势
- 压缩和解压缩速度非常慢
- 内存占用高
2.4、LZ4
介绍
LZ4 在 Java 平台上可以通过 LZ4-Java 库来使用。该库提供了高效的压缩和解压功能,并且支持多种压缩模式(如高速压缩和高压缩比压缩)。
依赖引入
<dependency><groupId>org.lz4</groupId><artifactId>lz4-java</artifactId><version>1.6.0</version>
</dependency>
代码示例
public byte[] compressLZ4(String value) {ByteArrayOutputStream bos = new ByteArrayOutputStream();LZ4Compressor compressor = LZ4Factory.fastestInstance().fastCompressor();LZ4BlockOutputStream los = null;try {// blockSize请根据自己的实际情况调整los = new LZ4BlockOutputStream(bos, 4096, compressor);los.write(value.getBytes(StandardCharsets.UTF_8));los.close();return bos.toByteArray();} catch (IOException e) {e.printStackTrace();return null;}
}public String uncompressLZ4(byte[] value) {try {LZ4Factory factory = LZ4Factory.fastestInstance();LZ4FastDecompressor decompressor = factory.fastDecompressor();byte[] decompressed = new byte[4096];decompressor.decompress(value, 0, decompressed, 0, 4096);return new String(decompressed, StandardCharsets.UTF_8);} catch (Exception e) {e.printStackTrace();return null;}
}
优势
- 压缩和解压缩速度快
- 内存占用低
劣势
- 压缩比一般
3、总结
算法 | 压缩速度 | 解压速度 | 压缩比 | 内存占用 | 适用场景 |
---|---|---|---|---|---|
Gzip | 中等 | 中等 | 中等 | 较高 | Web 服务器、日志文件压缩 |
LZ4 | 极快 | 极快 | 较低 | 较低 | 实时数据处理、内存缓存 |
Snappy | 极快 | 极快 | 较低 | 较低 | 大数据处理、内存缓存 |
Bzip2 | 较慢 | 较慢 | 高 | 较高 | 长期存储、归档文件 |
应根据具体的应用需求来权衡压缩速度、压缩比和内存占用等因素。
相关文章:

在Java中几种常用数据压缩算法的实现及其优劣势
在Java中几种常用数据压缩算法的实现及其优劣势 背景:项目需要引入Redis作为缓存组件,需要考虑到Redis的内存占用(机器内存越大,成本越高),因此需要引入数据压缩。 1、介绍 数据压缩是计算机领域中一项重要…...

Word——如何打出 符号中的 1、2、3等带圆圈的序号
一、方式1 1.1:点击 插入-符号 1.2:字体 选择 Wingdings 或者 Wingdings 2 二、方式2 带1的圈:输入 2460,然后按 AItX 带2的圈:输入 2461,然后按 AItX 带3的圈:输入 2462,然后按 …...

操作系统之进程与线程
进程 定义: 进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。 组成: 包括程序代码、程序处理的数据、程序计数器、一组寄存器的值以及系统资源(如打开的文件)等。 …...

代码随想录算法训练营打卡第35天:背包问题
前言 zaccheo打卡代码随想录第35天 由于这段时间工作太忙了(加上我的懒病犯了)导致迟打卡了好几天555555.。。。 今天的主要是动态规划中的背包问题,这个真的是蛮难理解的,我把我自己强行按在椅子上半个小时一点一点的看卡哥文章…...

【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作
💯 欢迎光临清流君的博客小天地,这里是我分享技术与心得的温馨角落 💯 🔥 个人主页:【清流君】🔥 📚 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 📚 🌟始终保持好奇心&…...

vscode(一)安装(ubuntu20.04)
1、更新软件包列表 sudo apt update2、安装依赖包 sudo apt install software-properties-common apt-transport-https wget3、导入Microsoft GPG密钥 wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add -4、向系统添加VSCode存储库 sudo…...

利用永恒之蓝对win7进行键盘记录
打开kali中的msfconsole 找到永恒之蓝,设置靶机ip,后可以exploit,也可以run 连接成功 查看进程,选择监听靶机win7上的cmd.exe进程 当前进程不是1484,需要迁移到1484 cmd.exe,进程迁移 键盘监听,…...

万字长文解读深度学习——dVAE(DALL·E的核心部件)
🌺历史文章列表🌺 深度学习——优化算法、激活函数、归一化、正则化 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸 深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总 万字长…...

RL仿真库pybullet
1. 介绍 PyBullet是一个基于Bullet Physics引擎的物理仿真Python接口,主要用于机器人仿真模拟。 1.1 主要特点 提供大量预设的机器人模型,例如URDF(统一机器人描述格式)、SDF、MJCF 格式。适用于训练和评估强化学习算法,提供了大量的强化学…...

file_get_contents函数导致网站卡死响应超时
宝塔控制面板系统下运行包含file_get_contents函数的php文件时候,发生以下报错: PHP Warning: file_get_contents():php_network_getaddresses: getaddrinfo failed: 解决方法: 一:需要检查请求的远程主机是否在本机的/etc/host…...

如何使用C#与SQL Server数据库进行交互
一.创建数据库 用VS 创建数据库的步骤: 1.打开vs,创建一个新项目,分别在搜素框中选择C#、Windows、桌面,然后选择Windows窗体应用(.NET Framework) 2.打开“视图-服务器资源管理器”,右键单击“数据连接”࿰…...

#渗透测试#红蓝对抗#SRC漏洞挖掘# Yakit(5)进阶模式-MITM中间人代理与劫持(上)
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...

vue3 项目搭建-9-通过 router 在跳转页面时传参
第一步,在跳转链接处挂载方法,将要传输的数据传入: <a href"#" click.prevent"goToArticle(obj.id)" class"click"><h1>{{obj.title}}</h1><p>作者:{{obj.author}}</p&…...

Java、python标识符命名规范
Java 包名所有字母一律小写。例如cn.com.test类名和接口名每个单词的首字母都要大写。例如ArrayList、Iterator常量名所有字母都大写,单词之间用下划线连接,例如:DAY_OF_MONTH变量名和方法名的第一个单词首字母小写,从第二个单词…...

高效职场人
文章目录 1.时间效能 ABCD2.高效员工的习惯之 自我掌控的秘诀3.学会做主4.学会互赢5.学会沟通、学会聆听6.学会可持续发展:四个方面更新自我(1)更新身体(2)更新精神(3)更新智力(4)更新人际情感 1.时间效能 ABCD 时间四象限: A类任务:重要且紧…...

深入探索现代 IT 技术:从云计算到人工智能的全面解析
目录 1. 云计算:重塑 IT 基础设施 2. 大数据:挖掘信息的价值 3. 物联网(IoT):连接物理世界 4. 区块链:重塑信任机制 5. 人工智能(AI):智能未来的驱动力 结语 在当今…...

【AI学习】苹果技术报告《Apple Intelligence Foundation Language Models》
文章地址:https://machinelearning.apple.com/papers/apple_intelligence_foundation_language_models.pdf 这篇文章介绍了苹果公司开发的基础语言模型(Apple Foundation Language Models,简称AFM),这些模型旨在为苹果…...

深度相机获取实时图像总结
问题详情:之前一直把曝光调整到50000,画面一直很流畅,知道领导要求将曝光改成500000时整个程序卡死了 问题解决: 首先怀疑是帧率太低的原因,控制变量后发现不是帧率的问题,看着代码很迷茫,领导…...

Nginx限流实践-limit_req和limit_conn的使用说明
注意: 本文内容于 2024-12-07 19:38:40 创建,可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容,请访问原文地址:Nginx限流实践。感谢您的关注与支持! 一、限流 之前我有记录通过CentOS7定时任务实…...

Unity在运行状态下,当物体Mesh网格发生变化时,如何让MeshCollider碰撞体也随之实时同步变化?
旧版源代码地址:https://download.csdn.net/download/qq_41603955/90087225?spm1001.2014.3001.5501 旧版效果展示: 新版加上MeshCollider后的效果: 注意:在Unity中,当你动态地更改物体的Mesh时,通常期望…...

记一次由docker容器使得服务器cpu占满密码和密钥无法访问bug
Bug场景: 前几天在服务器上部署了一个免费影视网站,这个应用需要四个容器,同时之前的建站软件workpress也是使用docker部署的,也使用了三个容器。在使用workpress之前,我将影视软件的容器全部停止。 再使用workpress…...

前端TS基础
文章目录 一、类型1、定义类型2、any、unknown、never3、基础类型4、联合类型5、交叉类型6、type、typeof7、作用域 二、数据结构1、数组2、元组3、函数类型4、对象类型 三、接口四、泛型五、enum六、断言七、工具1、模块2、namespace3、装饰器4、declare5、运算符6、映射类型7…...

前端面经每日一题day06
Cookie有什么字段 Name:cookie的唯一标识符 Value:与Name对应,存储Cookie的信息 Domain:可以访问cookie的域名 Path:可以访问cookie的路径 Expires/Max-Age:超时时间 Size:cookie大小 Ht…...

SOC,SOH含义区别及计算公式
SOC,SOH含义区别及计算公式 两者结合使用,有助于实现更精确的电池管理,延长电池的使用寿命,并确保电池的高效、安全运行。 1. SOC(State of Charge,荷电状态)2. SOH(State of Health…...

阿里云轻量应用服务器开放端口,图文教程分享
阿里云轻量应用服务器如何开放端口?在轻量服务器管理控制台的防火墙中添加规则即可开通端口,开通80端口就填80,开通443就填443端口,开通3306端口就填3306。阿里云百科网aliyunbaike.com整理阿里云轻量应用服务器端口号开通图文教程…...

嵌入式里的“移植”概念
这里因为最近一年看到公司某项目很多代码上有直接硬件的操作,这里有感而发,介绍移植的概念。 一、硬件 先上一个图: 举个例子,大学里应该都买过开发板,例如st的,这里三个层次, 内核ÿ…...

深入探讨 AF_PACKET 套接字
AF_PACKET 套接字是一种用于直接访问网络接口(即网卡)的套接字类型,通常用于网络数据包捕获和分析。它允许应用程序直接与网络接口卡(NIC)交互,而不需要通过网络协议栈。从而可以发送和接收以太网帧。它提供了比普通TCP/UDP套接字…...

Redis的哨兵机制
目录 1. 文章前言2. 基本概念2.1 主从复制的问题2.2 人工恢复主节点故障2.3 哨兵机制自动恢复主节点故障 3. 安装部署哨兵(基于docker)3.1 安装docker3.2 编排redis主从节点3.3 编排redis-sentinel节点 4. 重新选举5. 选举原理6. 总结 1. 文章前言 &…...

CSS系列(1)-- 选择器体系详解
前端技术探索系列:CSS 选择器体系详解 🎯 致读者:探索 CSS 选择器的奥秘 👋 前端开发者们, 今天我们将深入探讨 CSS 选择器体系,这是构建优雅样式表的基础。让我们一起学习如何精确地选中并控制网页中的…...

用Python开发打字速度测试小游戏
本文将带你一步步开发一个简单的打字速度测试小游戏,通过随机生成词组并计算用户输入速度,帮助提升打字技能。 一、功能描述 随机生成一段句子,用户需要尽快输入。计时功能,统计用户输入的总时长。对比正确率和速度,给出评分反馈。二、开发环境 语言:Python依赖库:pygam…...