当前位置: 首页 > news >正文

在Java中几种常用数据压缩算法的实现及其优劣势

在Java中几种常用数据压缩算法的实现及其优劣势

背景:项目需要引入Redis作为缓存组件,需要考虑到Redis的内存占用(机器内存越大,成本越高),因此需要引入数据压缩。

1、介绍

数据压缩是计算机领域中一项重要的技术,它可以将数据在占用更小的存储空间或通过更低的传输带宽进行表示和传输。数据压缩的重要性源于以下几个方面:

  • 节省存储空间:随着数据的不断增长,存储空间成为一项宝贵的资源。通过压缩数据,可以显著减少存储设备的使用量,从而降低存储成本并提高数据管理的效率。

  • 提高数据传输效率:在数据通信领域,传输带宽是一个宝贵的资源。通过压缩数据,可以减少传输数据的大小,从而降低传输延迟和成本,并提高数据传输的效率。

  • 数据备份和归档:压缩数据可以减少备份和归档操作所需的存储空间和传输时间。这对于保护和长期保存数据至关重要。

  • 提高系统性能:压缩数据可以降低数据访问和处理的时间,提高系统的响应速度和性能。

此处主要介绍以下几种压缩算法:

  • Gzip
  • Snappy
  • Bzip2
  • LZ4

2、压缩算法及其实现

2.1、Gzip

介绍

Java 标准库 (java.util.zip) 提供了对 Gzip 的原生支持,使用 GZIPOutputStreamGZIPInputStream 类可以轻松进行压缩和解压操作。

依赖引入

无需引入依赖

示例代码

// 压缩方法
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 的支持,使用 BZip2CompressorOutputStreamBZip2CompressorInputStream 类可以轻松进行压缩和解压操作。不过,标准库中的 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中几种常用数据压缩算法的实现及其优劣势 背景&#xff1a;项目需要引入Redis作为缓存组件&#xff0c;需要考虑到Redis的内存占用&#xff08;机器内存越大&#xff0c;成本越高&#xff09;&#xff0c;因此需要引入数据压缩。 1、介绍 数据压缩是计算机领域中一项重要…...

Word——如何打出 符号中的 1、2、3等带圆圈的序号

一、方式1 1.1&#xff1a;点击 插入-符号 1.2&#xff1a;字体 选择 Wingdings 或者 Wingdings 2 二、方式2 带1的圈&#xff1a;输入 2460&#xff0c;然后按 AItX 带2的圈&#xff1a;输入 2461&#xff0c;然后按 AItX 带3的圈&#xff1a;输入 2462&#xff0c;然后按 …...

操作系统之进程与线程

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

代码随想录算法训练营打卡第35天:背包问题

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

【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…...

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 找到永恒之蓝&#xff0c;设置靶机ip&#xff0c;后可以exploit&#xff0c;也可以run 连接成功 查看进程&#xff0c;选择监听靶机win7上的cmd.exe进程 当前进程不是1484&#xff0c;需要迁移到1484 cmd.exe&#xff0c;进程迁移 键盘监听&#xff0c;…...

万字长文解读深度学习——dVAE(DALL·E的核心部件)

&#x1f33a;历史文章列表&#x1f33a; 深度学习——优化算法、激活函数、归一化、正则化 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸 深度学习——前向传播与反向传播、神经网络&#xff08;前馈神经网络与反馈神经网络&#xff09;、常见算法概要汇总 万字长…...

RL仿真库pybullet

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

file_get_contents函数导致网站卡死响应超时

宝塔控制面板系统下运行包含file_get_contents函数的php文件时候&#xff0c;发生以下报错&#xff1a; PHP Warning: file_get_contents():php_network_getaddresses: getaddrinfo failed: 解决方法&#xff1a; 一&#xff1a;需要检查请求的远程主机是否在本机的/etc/host…...

如何使用C#与SQL Server数据库进行交互

一.创建数据库 用VS 创建数据库的步骤&#xff1a; 1.打开vs&#xff0c;创建一个新项目&#xff0c;分别在搜素框中选择C#、Windows、桌面&#xff0c;然后选择Windows窗体应用(.NET Framework) 2.打开“视图-服务器资源管理器”&#xff0c;右键单击“数据连接”&#xff0…...

#渗透测试#红蓝对抗#SRC漏洞挖掘# Yakit(5)进阶模式-MITM中间人代理与劫持(上)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

vue3 项目搭建-9-通过 router 在跳转页面时传参

第一步&#xff0c;在跳转链接处挂载方法&#xff0c;将要传输的数据传入&#xff1a; <a href"#" click.prevent"goToArticle(obj.id)" class"click"><h1>{{obj.title}}</h1><p>作者&#xff1a;{{obj.author}}</p&…...

Java、python标识符命名规范

Java 包名所有字母一律小写。例如cn.com.test类名和接口名每个单词的首字母都要大写。例如ArrayList、Iterator常量名所有字母都大写&#xff0c;单词之间用下划线连接&#xff0c;例如&#xff1a;DAY_OF_MONTH变量名和方法名的第一个单词首字母小写&#xff0c;从第二个单词…...

高效职场人

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

深入探索现代 IT 技术:从云计算到人工智能的全面解析

目录 1. 云计算&#xff1a;重塑 IT 基础设施 2. 大数据&#xff1a;挖掘信息的价值 3. 物联网&#xff08;IoT&#xff09;&#xff1a;连接物理世界 4. 区块链&#xff1a;重塑信任机制 5. 人工智能&#xff08;AI&#xff09;&#xff1a;智能未来的驱动力 结语 在当今…...

【AI学习】苹果技术报告《Apple Intelligence Foundation Language Models》

文章地址&#xff1a;https://machinelearning.apple.com/papers/apple_intelligence_foundation_language_models.pdf 这篇文章介绍了苹果公司开发的基础语言模型&#xff08;Apple Foundation Language Models&#xff0c;简称AFM&#xff09;&#xff0c;这些模型旨在为苹果…...

深度相机获取实时图像总结

问题详情&#xff1a;之前一直把曝光调整到50000&#xff0c;画面一直很流畅&#xff0c;知道领导要求将曝光改成500000时整个程序卡死了 问题解决&#xff1a; 首先怀疑是帧率太低的原因&#xff0c;控制变量后发现不是帧率的问题&#xff0c;看着代码很迷茫&#xff0c;领导…...

Nginx限流实践-limit_req和limit_conn的使用说明

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

Unity在运行状态下,当物体Mesh网格发生变化时,如何让MeshCollider碰撞体也随之实时同步变化?

旧版源代码地址&#xff1a;https://download.csdn.net/download/qq_41603955/90087225?spm1001.2014.3001.5501 旧版效果展示&#xff1a; 新版加上MeshCollider后的效果&#xff1a; 注意&#xff1a;在Unity中&#xff0c;当你动态地更改物体的Mesh时&#xff0c;通常期望…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...