Redis中String类型的内存空间开销问题

文章探讨了Redis中String类型保存数据时的内存开销问题,解释了元数据和不同编码方式(int, embstr, raw)的内存占用。在图片ID与存储ID场景下,String类型导致了内存浪费。通过二级编码方法利用Hash类型实现单值键值对的存储,降低了内存消耗。文章还讨论了压缩列表和Hash类型转换阈值,以优化内存使用。" 125346359,11486467,生产者消费者问题解析与实现,"['分布式', '开发语言', '服务器', '操作系统', '并发编程']
摘要由CSDN通过智能技术生成

案例:现需要开发一个图片存储系统,要求这个系统能快速记录图片ID和图片在存储系统中保存的ID,同时,还要能够更具图片ID快速查找到图片存储对象ID。因图片数量巨大,所以选用10位数来表示图片ID和土拍你存储对象ID。例如:

photo_id: 1101000051
photo_obj_id: 3301000051

图片ID和图片存储对象ID正好一一对应,是典型的“键 - 单值”模式。所谓单值,就是指键值对中的值就是一个值,而不是一个集合,这和String类型提供的“一个键对应一个值的数据”的保存形式刚好契合。而且,String类型可以保存二进制字节流,只要把数据转换成二进制字节数组,就可以保存了。

所以,第一个方案就是用String保存数据,把图片ID和图片存储对象ID分别作为键值对的key和value来保存,其中图片存储对象ID用了String类型。

保存了1亿张照片后,大约用了6.4GB的内存。但是,随着图片数据量的增加,Redis内存使用量也在增加,结果就遇到了大内存Redis实例因生成RDB而响应慢的问题。很显然,String类型并不是一种好的选择。

String类型是适用于所有场合的,它有一个明显的短板,就是它保存数据时所消耗的内存空间较多。而集合类型有非常节省空间的底层实现结构,但是,集合类型保存的数据模式,是一个键值对应一系列值,并不适合直接保存单值的键值对。

使用二级编码的方法,可以实现用集合类型保存单值键值对,Redis实例的内存空间消耗明显下降了。

为什么String类型内存开销大?

除了记录实际数据,String类型还需

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无绪听雨眠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值