Redis:应用实践之内存占用

【关于作者】

关于作者,目前在蚂蚁金服搬砖任职,在支付宝营销投放领域工作了多年,目前在专注于内存数据库相关的应用学习,如果你有任何技术交流或大厂内推及面试咨询,都可以从我的个人博客(https://0522-isniceday.top/)联系我

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tdQsG7hF-1680957190945)(https://zhangyuxiangplus.oss-cn-hangzhou.aliyuncs.com/boke/内存开销.png)]

1.String结构的内存开销

1.1.原始数据:

除了记录原数据,String结构还需要额外记录数据长度、空间使用等额外的元数据,因此开销比较大

其中String使用的底层数据结构是动态字符串(Simple Dynamic String,SDS )结构体保存数据

img

其中:

len: 4个字节,表示buf的长度

alloc: 4个字节,表示buf实际分配的长度,一般大于len

buf: 字节数组,保存实际数据,\0表示数组的结束,\0会额外占用一个字节的开销。

除了删除len、alloc等元数据的额外开销,SDS还有一个redisObject结构体的开销,所以Redis的键值对越多导致的元数据带来的空间开销就越大,但是好处是可以针对每个key设置过期策略等

1.2RedisObject:

Redis不同的数据类型包含一些相同的原数据,这些原数据就统一放在RedisObject结构体中,RedisObject包含一个指针指向具体的结构体,为了节省内存空间,Redis还对Long和字符串类型做了特殊的处理

Long类型: 针对该类型,RedisObjecj中的指针就直接存储整数类型,无需额外的指针开销

字符串

(1)embstr编码方式:小于等于44字节,则直接在RedisObject后面追加,就是说指针和SDS结构是一块连续的区域,避免了内存碎片

(2)raw编码模式:大于44字节时,则为SDS额外分配一块空间,RedisObject中指针再存储该空间的地址

img

1.3.全局哈希表数据:

全局哈希表中的哈希桶(dictEntry)包含key和value的指针,还有下一个哈希桶的执指针(拉链法),因此一个哈希桶也占用了32字节的空间

哈希桶实际只占用24个字节,但是redis的空间分配使用的是jemalloc,jemalloc在分配N个字节的数据时,会开辟大于N的2的次幂的大小,所以24个字节的数据实际开辟了32个字节的空间

img

所以一个String类型的数据,一个键值占用了原始数据(SDS)+RedisObject(16)+dictEntry(32)=64个字节的空间,所以我们节省空间的方式可以采取减少键值队,采取集合结构(List、Hash、Set、Zset)的方式

1.4.三者之间的关系:

哈希槽(dictEntry)的value或key指针指向->RedisObject(long和字符串会特殊处理)中的value指针指向->具体的value结构的地址

2.什么数据结构可以节省空间

压缩列表非常节省空间

压缩列表(List、Hast、Zset都有使用到)

表头有三个字段zlbytes、zltail和zllen,分别表示列表长度、列表尾的偏移量,以及列表中的entry个数。压缩列表尾还有一个zlend,表示列表结束

压缩列表用一系列的entry保存数据,entry结构如下:

prev_len:前一个元素entry的长度,一般为1字节或5字节。1字节能表示数字0255,但是压缩列表中255代表列表zlend结束,因此255不能取,因此只能去0244,如果entry长度大于255,则该元素分配5字节

encoding:编码方式,1字节

len:表示自身长度,5字节

content(key):保存实际的数据

所以压缩列表一个entry最多只分配5+1+5+实际数据字节的空间,并且只有一个redis键值对,避免了全局哈希表dictEntry和RedisObject的元数据开销

img

2.1.Hash表所使用的压缩列表

Hash类型设置了两个阈值,一旦超过则会使用Hash表来存储数据了

  • hash-max-ziplist-entries:表示用压缩列表保存时哈希集合中的最大元素个数。
  • hash-max-ziplist-value:表示用压缩列表保存时哈希集合中单个元素的最大长度。

只要往hash类型中插入的元素个数或单次写入的元素大小超过了上述限制,则会转向使用hash表,一旦变为hash表则不会再转为使用压缩列表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哈哈哈张大侠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值