关注
Q4:
我们都知道Redis对象可以实现一种类型不同底层实现,我们现在来看字符串对象。你可以简单地说一下它的几种底层实现方案?然后讲一下为什么embstr和raw两种实现方案里要以字符串39个字节为界限或者说3版本往后为什么要使用44个字节为界限?
A:
在Redis里,字符串是一个对象,对象是由一个RedisObject结构表示,这个结构中和保存数据有关的三个属性分别是`type`,`encoding`,`ptr`,encoding对应每种类型的不同底层实现方式。
字符串的三种底层实现方案分别对应不同的应用场景,当value的值是数字时,会将指向底层实现的ptr指针变换为long类型,然后将数字直接存放进去,同时将encoding改为int;当value是一个字符串,且大小低于44个字节时(3版本用的是39个字节),采用类似压缩列表的做法,将SDS直接跟在redisObject后面,而不是通过指针指向,同时将编码改为embstr;当这个字符串大于44个字节时(3版本以前用的是39字节),使用SDS实现,并且由指针指向SDS的地址,将编码改为raw。
而使用39个字节作为分类标准的原因是因为计算机分配内存时通常以8为界限,其中8,16,32,64为分配单位,而最开始的RedisObject的头已经占据16个字节,而SDS对象的头又会占据8个字节(两个unsigned int会占据8个字节),因此留给字符串的空间只有40个字节,又因为字符串的最后一个字符默认为`\0`,因此剩下39个字节。而新版本以44为界限的原因是,每个sds都有一个sdshdr,里面的len和free记录了这个sds的长度和空闲空间,但是这样的处理十分粗糙,使用的unsigned int可以表示很大的范围,但是对于很短的sds有很多的空间被浪费了(两个unsigned int 8个字节)。新版本将原来的sdshdr改成了sdshdr8,sdshdr16,sdshdr32,sdshdr64,里面的unsigned int 变成了uint8_t,uint16_t,这样更加优化小sds的内存使用;因此最小的字符串对象头仅仅占用3个字节(len,alloc都是1个字节,还有一个char字符flag占用一个字节),因此节约了5个字节的空间,留出来的就是44个字节。
查看原帖
点赞 评论
相关推荐
牛客热帖
更多
- 1... 28届实习拷打,一场面试,23个Agent问题9916
- 2... 我们为什么要做网申助手这个插件9195
- 3... 🔥牛客春招季🔥各公司春招&实习最新进展,这里实时更新!7346
- 4... 找实习两个月,工具用了一堆,最后只留下这些5497
- 5... 携程3.18Java开发一面面经4988
- 6... 字节ByteIntern剪映后端三面面经4567
- 7... 面试官视角聊聊:如何通过AI coding面试?附焚决3774
- 8... 小红书前端日常实习二面凉经3222
- 9... 小红书暑期一面3196
- 10... 命运换了个赛道给我发牌3187
正在热议
更多
# 跟HR说什么能被秒回? #
10449次浏览 183人参与
# 职能管理面试记录 #
9323次浏览 45人参与
# MiniMax求职进展汇总 #
16186次浏览 241人参与
# 春招/暑实第一面是哪家? #
21524次浏览 240人参与
# OPPO求职进展汇总 #
790302次浏览 5420人参与
# 你收到了哪些公司的笔试? #
19641次浏览 112人参与
# 巨人网络春招 #
10291次浏览 164人参与
# 正在春招的你,也参与了去年秋招吗? #
359433次浏览 2612人参与
# 一人说一个提前实习的好处 #
115306次浏览 704人参与
# 京东美团大战,你怎么看? #
174417次浏览 883人参与
# 京东开奖 #
673746次浏览 3238人参与
# 如何一边实习一边找下家? #
34034次浏览 247人参与
# 面试官最爱问的 AI 问题是...... #
18005次浏览 610人参与
# 你的嫡系AI是哪个? #
4817次浏览 119人参与
# 现在入门AI应该走哪些方向? #
4853次浏览 101人参与
# 把自己当AI,现在最消耗你token的问题是什么? #
3356次浏览 95人参与
# 想给25届机械人的秋招建议 #
46196次浏览 247人参与
# 26届秋招公司红黑榜 #
80424次浏览 280人参与
# 阿里巴巴工作体验 #
27029次浏览 61人参与
# 实习生如何通过转正 #
130107次浏览 1477人参与
# 巨人网络工作体验 #
74277次浏览 505人参与
# 巨人网络求职进展汇总 #
190803次浏览 1228人参与

