如何将Redis内存使用量降低一半?

使用phpspreadsheet导出数据时内存溢出处理 使用phpspreadsheet进行导出excel的时候遇到了内存溢出的问题,官方提供了memory saving的解决方案,官方文档中提供了APCu、redis和memcache的缓存方案,但是在这些缓存方案都需要安装相应的扩展并且都为内存型缓存,数据量一大的话就会大大占用系统的内存,可能会影响项目的正常运行的,于是就自行实现了一种文件缓存的方式,实测可以减少导excel表时一半的内存使用量,在... 阅读详情

本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等

在本文中,我将尝试解释如何将数据占用的存储空间减少50%以上。

我们的2.5GB Redis ElastiCache几乎快满了,如果以某种方式达到其极限,我们的系统将开始出现故障。Redis可能会成为瓶颈。

基础设定:

使用最新版本的Spring Boot,有两个主要依赖项- Spring Boot Web和Spring Data Reactive Redis,Spring Data Reactive Redis将用于连接和使用Redis的内部应用程序。从本质上讲,Redis依赖项默认使用Lettuce Redis客户端,并且受最新版本的Spring Boot支持。

完整的代码可以在我的Github上找到redis-util。

降低内存使用量使用MessagePack,您需要一种“转换”机制。如果翻译是专家,并且将您的英语翻译成尽可能少的单词怎么办?MessagePack工作原理是一样的!将需要在pom.xml文件中添加两个以上的依赖项。

<dependency>
        <groupId>org.msgpack</groupId>
        <artifactId>msgpack-core</artifactId>
        <version>0.8.20</version>
    </dependency>
    <dependency>
        <groupId>org.msgpack</groupId>
        <artifactId>jackson-dataformat-msgpack</artifactId>
        <version>0.8.20</version>
    </dependency>
我们创建了一个名为控制器MsgPackController:

class MsgPackRedisSerializer<T> implements RedisSerializer<T> {
    public static final Charset DEFAULT_CHARSET;
    private final JavaType javaType;
    private ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory())
            .registerModules(new Jdk8Module(), new JavaTimeModule())
            .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true)
            .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
            .setSerializationInclusion(JsonInclude.Include.NON_NULL);

    public MsgPackRedisSerializer(Class<T> type) {
        this.javaType = JavaTypeHandler.getJavaType(type);
    }

    public T deserialize(@Nullable byte[] bytes) throws SerializationException {
        if (bytes == null || bytes.length == 0) {
            return null;
        } else {
            try {
                return this.objectMapper.readValue(bytes, 0, bytes.length, this.javaType);
            } catch (Exception ex) {
                throw new SerializationException("Could not read MsgPack JSON: " + ex.getMessage(), ex);
            }
        }
    }

    public byte[] serialize(@Nullable Object value) throws SerializationException {
        if (value == null) {
            return new byte[0];
        } else {
            try {
                return this.objectMapper.writeValueAsBytes(value);
            } catch (Exception ex) {
                throw new SerializationException("Could not write MsgPack JSON: " + ex.getMessage(), ex);
            }
        }
    }

    static {
        DEFAULT_CHARSET = StandardCharsets.UTF_8;
    }

}

实例MessagePackFactory被传递到中ObjectMapper。这将充当Redis和我们的Spring Boot应用程序之间数据的二进制格式和字符串格式之间的桥梁。

测试: 比较dataset.bytes当前内存与先前记录的内存。15976字节对32840字节,已经减少了近50%!

但是,等等,我们可以进一步减少它。压缩!Snappy!

之后的第一个问题是:压缩和解压缩需要时间。这对生产有害吗?Snappy也有答案。

它不旨在最大程度地压缩,也不旨在与任何其他压缩库兼容。相反,它的目标是非常高的速度和合理的压缩。

使用Snappy就像在中添加依赖项一样简单pom.xml,并且几行代码更改。只需Snappy.compress在序列化和Snappy.decompress反序列化时添加即可。

<dependency>
        <groupId>org.xerial.snappy</groupId>
        <artifactId>snappy-java</artifactId>
        <version>1.1.7.3</version>
    </dependency>

清理和重组数据,并利用上述技术,我们将内存使用量从2GB降低到了不到500MB。

最大化 Redis 效率:利用 Redis 哈希降低内存成本 - DEV Community Redis 等内存数据库以其速度和效率而闻名,但其以内存为中心的设计使得内存使用成为扩展应用程序时的关键因素。随着应用程序的增长,开发人员需要考虑内存优化策略,以保持低成本和高性能。当您有多个相关字段与单个实体关联时,Redis 哈希非常有用。您可以将它们作为具有多个字段的哈希值合并为单个键,而不是为每个字段创建多个单独的键。本博客探讨了当用例具有与单个实体关联的多个相关字段时,Redis 哈希如何节省内存、降低基础设施成本。 阅读详情

相关推荐

带宽和内存降低88%:GZIP在解决Redis大Key方面的应用

本文介绍GZIP压缩算法在优化Redis使用大JSON字段中的应用,通过简单压缩可以节省88%的内存空间和带宽资源

赵侠客 1581

Redis:性能优化之Redis使用的规范

根据业务的时长,设置合理的过期时间,因为如果不设置过期时间,redis实例内存满了会触发数据淘汰,这个时候会释放内存的操作会阻塞主进程,并且设置过期时间时候尽量避免批量过期的情况。Redis针对读写命令的处理是单线程的,因此bigkey的操作会阻塞线程,尤其是针对时间复杂度为O(n)的数据结构进行并交集、全量查询等耗时的操作。这样做的好处是,这两种格式的可读性好,便于调试,不同的开发语言都支持这两种格式的解析。这样一来,既可以避免单实例的内存使用量过大,也可以避免不同业务的操作相互干扰。

张豫湘的博客 433

DeepSeek 使用PostgreSQL降低Redis中key数量的完整方案

print(f"迁移模式: {pattern} (平均访问: {row['avg_access']}/天)")auto_migrate_threshold INTEGER, -- 访问次数低于此值迁移到PostgreSQL。_logger.LogError(ex, "迁移key {Key} 失败", key);WHERE rkm.access_count_last_day < 10 -- 每天访问少于10次。AND rkm.current_size_bytes > 1024 -- 大于1KB。

m0_37843156的博客 961

【入门篇】1.8 Redis使用规范详解

Redis,作为一个开源的、内存中的数据结构存储系统,以其卓越的性能和灵活的数据结构而受到广泛的欢迎和使用。然而,尽管Redis的使用相对直观,但要充分利用其潜力并优化其性能,就需要深入理解其工作原理和最佳实践。本博客搜集网上的内容提供一份详尽的Redis使用规范,无论你是刚接触Redis的新手,还是希望进一步提升Redis使用技巧的老手,都能在这里找到有价值的信息。帮助你避免在实际使用中遇到的陷阱。

日拱一卒无有尽,功不唐捐终入海 1679

DeepSeek 在Ubuntu系统中降低Redis中key的数量,可以通过多种方式实现

logging.info(f"内存减少: {int(before_stats['memory_info']['used_memory']) - int(after_stats['memory_info']['used_memory'])} 字节")parser.add_argument('--pattern', default='temp:*', help='要清理的key模式')then # 7天未访问。parser.add_argument('--password', help='Redis密码')

m0_37843156的博客 747

保姆级教程:在RK3588平台上为IMX415 Sensor配置HDR2曝光(附完整代码与避坑点)

本文提供RK3588平台上为IMX415 Sensor配置HDR2曝光的详细教程,涵盖基础概念、限制条件、实战配置步骤及常见问题解决方案。通过完整代码示例和关键参数解析,帮助开发者高效实现HDR2曝光模式,提升图像质量并避开常见陷阱。

weixin_28685287的博客 283

Redis配置Kryo序列化和Snappy压缩

前言 redis自带的StringSerializer性能相对较差,redis官方推荐kryo来提高序列化和反序列化速度,推荐snappy来节约redis内存和网络带宽,在springboot中可以通过配置快速实现这个功能 maven配置 <dependency> <groupId>com.esotericsoftware</groupId&g...

后厂村老司机 815

【2021最新版】Dubbo面试题总结(40道题含答案解析)

文章目录1、为什么要用Dubbo?2、Dubbo的整体架构设计有哪些分层?3、默认使用的是什么通信框架,还有别的选择吗?4、服务调用是阻塞的吗?5、一般使用什么注册中心?还有别的选择吗?6、默认使用什么序列化框架,你知道的还有哪些?7、服务提供者能实现失效踢出是什么原理?8、服务上线怎么不影响旧版本?9、如何解决服务调用链过长的问题?10、说说核心的配置有哪些?11、Dubbo推荐用什么协议?12、同一个服务多个注册的情况下可以直连某一个服务吗?13、画一画服务注册与发现的流程图?14、Dubbo集群容错有

程序媛小琬的博客 1万+

redis探秘:选择合适的数据结构,减少80%的内存占用,这些点你get到了吗?

本文首发于京东零售平台公众号,https://mp.weixin.qq.com/s/uzuz7rqctQ-bjdRcf1tO9g redis作为目前最流行的nosql缓存数据库,凭借其优异的性能、丰富的数据结构已成为大部分场景下首选的缓存工具。 由于redis是一个纯内存的数据库,在存放大量数据时,内存的占用将会非常可观。那么在一些场景下,通过选用合适的数据结构来存储,可以大幅减少内存的占用,...

tianyaleixiaowu的专栏 2430

杰理AC696N系列芯片,烧录的时候烧录器连接上芯片之后电脑显示无法识别该设备,该怎么解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1713

Altium Designer (AD) 设计软件高频面试题及参考答案(3万字长文)

在Altium Designer(AD)中,设计复用是一种关键的策略,它允许设计师在多个项目中重复使用经过验证的设计元素,如原理图符号、PCB布局、元器件封装和设计规则集。在Altium Designer (AD) 中,手动布线和交互式布线是PCB设计中常见的两种布线模式,它们提供了设计师对布线路径的直接控制,特别是在处理复杂或关键信号路径时尤为有用。在Altium Designer (AD) 中进行电路级仿真是一项重要的设计验证步骤,它允许设计师在实际制造之前对电路的行为进行预测和分析。

大模型大数据攻城狮的专栏 4782

Sprintboot redis 采用gzip和Snappy compress压缩数据

1 前言 怎么使用和结合Sprintboot + redis ,可以参照我前面的文章:https://blog.youkuaiyun.com/zzhongcy/article/details/102584028 这里主要讲述当生产环境中,单个redis数据很大时,我们可能就要考虑压缩数据后再存入redis了。 压缩数据优缺点: 优点1:压缩会减少redis存储数据量,增加redis的吞吐量 优点2:压缩会较少网络带宽 缺点就是会增加CPU消耗 2 Sprintboot redis配置 有两种配置方式,如下

zzhongcy的专栏 5234

电子元器件选型与实战应用—01 电阻选型

大家好, 我是记得诚。这是《电子元器件选型与实战应用》专栏的第一篇文章,今天的主角是电阻,在每一个电子产品中,都少不了电阻的身影,其重要性不言而喻。

记得诚 3537

redis — 如何将redis内存使用量压缩一半(四)

1.背景说明 redis存储有固定内存,如果以某种方式达到其内存极限,我们的系统将开始出现故障,Redis内存使用量可能会成为瓶颈。 使用最新版本的Spring Boot,有两个主要依赖项- Spring Boot Web和Spring Data Reactive Redis,Spring Data Reactive Redis将用于连接和使用Redis的内部应用程序。从本质上讲,Redis依赖项默认使用Lettuce Redis客户端,并且受最新版本的Spring Boot支持。 2.Mess...

u011250186的博客 1050

UG\NX二次开发 判断对象是虚线还是实线

网友提问“怎么区分虚线实线”,这个可以通过函数判断。

王牌飞行员_里海的博客 357

微信小程序爬虫终极指南:以电商小程序抓包与逆向分析为例(最新版)

在2026年的移动互联网生态中,微信小程序已经成为电商交易的核心载体之一。据统计,超过78%的头部电商平台都推出了微信小程序版本,其用户活跃度甚至超过原生App。对于数据从业者而言,小程序端往往藏着比Web端更丰富的接口数据——包括但不限于商品详情、价格波动、用户评价、库存变化、秒杀活动信息等。与传统的Web爬虫不同,微信小程序爬虫面临着三大核心挑战无URL地址栏:无法通过浏览器直接查看网络请求wx.request封装:所有请求均通过微信原生API发起,难以直接拦截然而,

2201_76125261的博客 536

Redis实战-降低内存使用

如有侵权,请联系~如有错误,也欢迎批评指正~本篇文章大部分是来自学习《Redis实战》的笔记本章介绍三种降低能够降低redis内存占用的方法:短结构【高效的表示数据】、分片结构【将一个体积大的结构转换为一系列小体积结构】、打包存储二进制和字节。

m0_50149847的博客 909

微信小程序 - 详细实现打开跳转第三方 H5 网页链接,在微信小程序内直接跳转打开第三方网站链接详细教程(支持跳转公众号文章等,直接复制代码即可)

小程序跳转h5,小程序-Taro小程序中打开h5页面链接,...小程序跳转h5链接(web-view)_微信小程序,小程序如何跳转h5页面,小程序跳转到第三方H5网页,微信小程序跳转第三方H5的方法,小程序-实现怎么跳转打开H5网页链接(或跳转至公众号文章,打开第三方网站,放校验文件,怎么配置业务域名,校验文件验证域名,把校验文件放到对面网站,别人的服务器也打不开没权限怎么放呢,勾选不校验合法域名,txt,打不开别人的网页怎么办,真机调试打不开,无法跳转,有什么其他办法不放校验文件吗,后台配置,怎么

🏆 前端领域优质创作者 3万+

《Redis实战》note-9 降低Redis的内存占用

1. 内存优化技术 3种; 2. 压缩列表的结构和配置; 3. 整数集合的限制和配置; 4. 分片结构的原理; 5. 列表和有序集合分片的问题; 6. 实现散列分片; 7. 实现集合分片; 8. 利用分片集合统计唯一访客数; 9. 字符串打包存储的条件和原理;

qq_42783188的博客 1577

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Redis降低内存占用(一)短结构

一、步骤: 1、pom加上: &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-data-redis&lt;/artifactId&gt; &lt;/dependency&gt; 2、配置文件: ...

w_t_y_y的博客 2614

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

有哪些办法可以降低 Redis 的内存使用情况

有哪些办法可以降低 Redis 的内存使用情况

7small7 656

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

降低一半Redis内存与带宽成本:StackExchange.Redis.Extensions透明压缩完全指南(LZ4/Zstd/Brotli/Snappy/GZip)

**StackExchange.Redis.Extensions** 是一款 .NET 应用的 Redis 缓存扩展库,其**透明压缩**功能可以在你无感的情况下,对写入 Redis 的所有数据自动压缩、读取时自动解压,直接降低一半以上的 Redis 内存占用与网络带宽消耗。本文带你快速上手 LZ4、Zstd、Brotli、Snappy、GZip 五种压缩算法的配置与选型 🚀 ## 为什么需要

gitblog_00818的博客 198

Redis是什么? 日常运维 Redis 需要注意什么 ? 怎么降低Redis 内存使用 节省内存?

但如果你的 Redis OPS 比较高,那么在执行 MONITOR 会导致 Redis 输出缓冲区的内存持续增长,这会严重消耗 Redis 的内存资源,甚至会导致实例内存超过 maxmemory,引发数据淘汰,这种情况你需要格外注意。但随着业务的发展,你的业务存储在 Redis 中的数据就会越来越多。而且,有时我们需要对 Redis 做日常维护,例如数据定时备份等操作,这时你就可以只在从库上进行,这只会消耗从库机器的资源,也避免了对主库的影响。

星卯教育-信奥教练tony 1277

Redis 内存碎片整理:配置优化与碎片率降低

监控优先:碎片率 $ r $ 是核心指标,目标控制在 $ 1.0 \leq r \leq 1.1 $。渐进优化:先启用,再调整数据结构参数,避免一次修改过多配置。资源平衡:碎片整理增加 CPU 负载,确保服务器资源充足(CPU 使用率不超过 $80%$)。测试验证:在生产环境前,在测试集群模拟负载(使用),验证碎片率变化。通过上述步骤,碎片率可显著降低(经验值:优化后碎片率下降 $30%$ 以上)。Redis 官方文档提供了更多细节,建议参考最新版本指南。

qwjxgsjxbksdh的博客 821

降低Redis内存占用

1、降低redis内存占用的优点   1、有助于减少创建快照和加载快照所用的时间   2、提升载入AOF文件和重写AOF文件时的效率   3、缩短从服务器进行同步所需的时间   4、无需添加额外的硬件就可以让redis存贮更多的数据 2、短结构   Redis为列表、集合、散列、有序集合提供了一组配置选项,这些选项可以让redis以更节约的方式存储较短的结构。   2.1、zipli...

weixin_30421809的博客 181
上一篇: 纯干货丨18个软件开发常见问题及解决策略,你有遇到吗?
下一篇: 如何做好容器化管理?腾讯架构师一篇文章带你吃透 Docker 原理
Java_Cappuccino
博客等级 码龄7年 17粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值