SpringBoot进阶教程(八十七)数据压缩

最近在使用Redis的时候,经常遇到一些不常用的大key,对存储有一些负担。就想着把大key压缩一下。压缩可以分很多种,比如拆分JSON字符串​, ​​压缩JSON字符串​,优化JSON体积​,流式处理大型JSON​和分段存储。

v拆分JSON字符串​

1.1按结构拆分​

数组拆分​​:若JSON包含大型数组,可将其拆分为多个小数组。

// 示例:将大数组拆分为多个子数组
JSONArray bigArray = new JSONArray(jsonString);
int chunkSize = 100;
for (int i = 0; i < bigArray.length(); i += chunkSize) {JSONArray chunk = new JSONArray();for (int j = i; j < Math.min(i + chunkSize, bigArray.length()); j++) {chunk.put(bigArray.get(j));}String chunkJson = chunk.toString();// 处理或保存chunkJson
}

​​对象拆分​​:若JSON是嵌套对象,可按层级拆分为子对象。

1.2按大小拆分(流式处理)​​

使用流式API(如Jackson的JsonParser)逐块读取JSON内容,避免一次性加载到内存:

JsonFactory factory = new JsonFactory();
try (JsonParser parser = factory.createParser(new File("large.json"))) {while (parser.nextToken() != null) {// 逐Token处理,如按特定条件拆分
    }
}

v压缩JSON字符串​

2.1使用GZIP压缩​
import java.util.zip.GZIPOutputStream;
import java.io.ByteArrayOutputStream;public static byte[] compress(String data) throws IOException {ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length());try (GZIPOutputStream gzip = new GZIPOutputStream(bos)) {gzip.write(data.getBytes());}return bos.toByteArray();
}// 压缩后的数据可用于传输或存储
byte[] compressed = compress(jsonString);
2.2使用Deflater压缩​
import java.util.zip.Deflater;public static byte[] deflateCompress(String data) {Deflater deflater = new Deflater();deflater.setInput(data.getBytes());deflater.finish();byte[] buffer = new byte[1024];ByteArrayOutputStream outputStream = new ByteArrayOutputStream();while (!deflater.finished()) {int count = deflater.deflate(buffer);outputStream.write(buffer, 0, count);}deflater.end();return outputStream.toByteArray();
}

v优化JSON体积​​

3.1移除无用空格​

使用紧凑格式(无缩进、换行):

new JSONObject(jsonString).toString(); // 默认紧凑格式
3.2​​缩短键名​

将长字段名替换为短名称:

{"n":"Alice","a":30} // 原始键名可能为"name"、"age"

v流式处理大型JSON​​

使用流式API逐步解析,避免内存溢出:

// Jackson流式API示例
JsonFactory factory = new JsonFactory();
try (JsonParser parser = factory.createParser(new File("large.json"))) {JsonToken token;while ((token = parser.nextToken()) != null) {if (token == JsonToken.START_ARRAY) {while (parser.nextToken() != JsonToken.END_ARRAY) {// 逐条处理数组元素JsonNode node = parser.readValueAsTree();// 处理node...
            }}}
}

v分页处理​

其实也是拆分,将数据拆成若干份

v实践方案

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.codec.binary.Base64;
import java.nio.charset.StandardCharsets;public class CompressHelper {private static final ObjectMapper objectMapper = new ObjectMapper();/*** 方式1:去除JSON中的空格/换行等冗余字符(文本压缩)* @param formattedJson 格式化的JSON字符串(含空格换行)* @return 紧凑格式的JSON字符串* @throws IOException JSON解析异常*/public static String compressJsonByRemovingSpaces(String formattedJson) throws IOException {JsonNode jsonNode = objectMapper.readTree(formattedJson);return objectMapper.writeValueAsString(jsonNode);}/*** 方式2:使用GZIP算法对JSON字符串进行二进制压缩(适合网络传输)* @param json 原始JSON字符串* @return Base64编码的压缩后字符串(可直接传输)* @throws IOException 压缩异常*/public static String compressJsonByGzip(String json) throws IOException {try (ByteArrayOutputStream byteOut = new ByteArrayOutputStream();GZIPOutputStream gzipOut = new GZIPOutputStream(byteOut)) {gzipOut.write(json.getBytes("UTF-8"));gzipOut.finish();return Base64.encodeBase64String(byteOut.toByteArray());}}public static String decompressJson(String source) throws IOException {byte[] compressedData = Base64.decodeBase64(source);try (ByteArrayInputStream byteIn = new ByteArrayInputStream(compressedData);GZIPInputStream gzipIn = new GZIPInputStream(byteIn);ByteArrayOutputStream byteOut = new ByteArrayOutputStream()) {// 读取压缩数据并解压缩byte[] buffer = new byte[1024];int len;while ((len = gzipIn.read(buffer)) != -1) {byteOut.write(buffer, 0, len);}return byteOut.toString(StandardCharsets.UTF_8.name());}}
}

v源码地址

https://github.com/toutouge/javademosecond/tree/master/hellolearn


作  者:请叫我头头哥
出  处:http://www.cnblogs.com/toutou/
关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/931866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做美图网站有哪些东西新开传奇网站大全

原文链接&#xff1a;http://www.cnblogs.com/MOBIN/p/5351900.html----------------------------------------------摘要&#xff1a;通过隐式转换&#xff0c;程序员可以在编写Scala程序时故意漏掉一些信息&#xff0c;让编译器去尝试在编译期间自动推导出这些信息来&#xf…

app开发 上传wordpressseo站外推广

日志系统的功能也就是将一条消息格式化后写入到指定位置&#xff0c;这个指定位置一般是文件&#xff0c;显示器&#xff0c;支持拓展到数据库和服务器&#xff0c;后面我们就知道如何实现拓展的了&#xff0c;支持不同的写入方式(同步异步)&#xff0c;同步:业务线程自己写到文…

网站开发后台指什么网站查询器

技术驱动下&#xff0c;现代企业快速发展&#xff0c;产生海量的数据。被称为基础软件三驾马车之一的数据库&#xff0c;一直处于 IT 系统的核心地位&#xff0c;并在技术发展中不断变化。基础数据是“十四五”的重点关注方向&#xff0c;中国数据库正在快速发展崛起&#xff0…

塑料回收技术创新与可持续发展

本文探讨了通过分子级塑料重构和新型化学回收技术实现塑料全生命周期净零碳排放的创新方法,重点介绍了可降解材料开发和混合塑料废物高效处理技术。某中心与能源部门合作推动塑料回收技术革新 某中心加入了美国能源部…

共享掩码:TFHE在打包消息上的自举技术

本文探讨了基于矩阵LWE假设的全同态加密方案,通过引入共享掩码密文格式显著降低密文扩展。研究展示了如何将TFHE类操作扩展到该格式,在布尔场景下打包8条消息可实现51%的性能提升,同时支持在单个密文中应用不同查找…

网站开发任务分解临沂seo公司稳健火星

1. 安装是成功的&#xff0c;但是安装位置&#xff0c;就是用来存放petalinux的文件夹里没有文件 我是照着正点的文档安装的&#xff0c;出现的一个问题就是最后执行文件这里&#xff1a; -d 后面这个文件夹的路径&#xff0c;我看网上的教程也都是跟文档一致的 /opt/pkg/peta…

详细介绍:[论文阅读] (38)基于大模型的威胁情报分析与知识图谱构建论文总结(读书笔记)

详细介绍:[论文阅读] (38)基于大模型的威胁情报分析与知识图谱构建论文总结(读书笔记)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importan…

手机搭建免费网站wordpress 模拟登陆

01背包 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数&#xff0c;N…

观澜网站制作做户外的网站

在上一节我们看到了&#xff0c;多人在同一个分支上协作时&#xff0c;很容易出现冲突。即使没有冲突&#xff0c;后push的童鞋不得不先pull&#xff0c;在本地合并&#xff0c;然后才能push成功。 每次合并再push后&#xff0c;分支变成了这样&#xff1a; $ git log --grap…

永康网站建设zjyuxunWordPress推荐版本

密封类和密封成员需要使用 sealed 修饰符&#xff0c;他可以防止当前类被继承或者防止派生类在继承的过程中重写某个方法。 与abstract抽象修饰符类似&#xff0c;sealed 修饰符不仅可用来修饰class&#xff0c;同样也可以修饰类成员。如果sealed关键词用在class上&#xff0c…

免费linux网站空间学做凉菜冷菜的网站

LLaVA&#xff1a;GPT-4V(ision) 的新开源替代品。 LLaVA &#xff08;https://llava-vl.github.io/&#xff0c;是 Large Language 和Visual A ssistant的缩写&#xff09;。它是一种很有前景的开源生成式 AI 模型&#xff0c;它复制了 OpenAI GPT-4 在与图像对话方面的一些功…

果女做拍的视频网站wordpress单页主题汉化

在人工智能的浩瀚宇宙中&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是一个充满挑战和机遇的领域。随着技术的发展&#xff0c;我们见证了从传统规则到统计机器学习&#xff0c;再到深度学习和预训练模型的演进。如今&#xff0c;我们站在了大型语言模型&#xff…

打印

View Post打印第一步:权限申请 在module.json5中进行如下配置; "requestPermissions": [{"name": "ohos.permission.PRINT","reason": "$string:permissionsReason&qu…

实用指南:Cursor 工具项目构建指南: Web Vue-Element UI 环境下的 Prompt Rules 约束(new Vue 方式)

实用指南:Cursor 工具项目构建指南: Web Vue-Element UI 环境下的 Prompt Rules 约束(new Vue 方式)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

完整教程:vue2 项目中 npm run dev 运行98% after emitting CopyPlugin 卡死

完整教程:vue2 项目中 npm run dev 运行98% after emitting CopyPlugin 卡死2025-10-08 19:08 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-…

利用虚拟主机建设企业网站上海si设计公司

最近做用Ajax.AjaxMethod方法的时候&#xff0c;在asp.net的服务器下一切正常&#xff0c;用iis的时候&#xff0c;js中总是cs类找不到&#xff0c;我就郁闷了&#xff0c;折腾了大半天&#xff0c;终于找到错误原因了。因为我发布网站用的是iis7&#xff0c;所以在web.config位…

网站开发的英文书有什么软件安卓应用市场免费下载安装

实体 实体是具有唯一标识的对象,且该标识和对象的属性值分离.即使两个实体的属性完全相同,这两个实体也相同,不能交换使用.由于实体通常对应于现实世界的概念. 是领域模型的中心,因此实体的标识非常重要. 值对象 值对象是主要由其属性值定义的对象.值对象通常不可变,即一旦创建…

广州黄埔区做网站培训机构建设官网公司地址

文章目录一、综述二、常见的回归分析三、对于相关性的理解四、一元线性回归模型五、对于回归系数的解释六、内生性七、四类线性模型回归系数的解释八、对于定性变量的处理——虚拟变量XXX九、下面来看一个实例十、扰动项需要满足的条件十一、异方差十二、多重共线性十三、逐步回…

VsCode 安装 Cline 插件并使用免费模型(例如 DeepSeek) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025球墨铸铁管厂家 TOP 企业品牌推荐排行榜,市政球墨铸铁管、球墨铸铁管件、防腐球墨铸铁管、给水球墨铸铁管推荐这十家公司!

在基础设施建设领域,球墨铸铁管凭借其优异的抗压性能、耐腐蚀特性以及较长的使用寿命,成为供水、排水、燃气输送等工程中的重要建材。然而,当前球墨铸铁管市场并非一片规范,行业内存在不少问题亟待解决。一方面,部…