关注
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... 都在找Agent开发,我整理了80道相关的Agent开发面试题。8307
- 2... 学院本春招逆袭年包25w5250
- 3... 腾讯后端复试面经3984
- 4... #美团笔试#不知道为什么算法题第一题只能通过15%的测试用例. 另外, 大模型的基础知识太差了, 很多知识点都不知道3165
- 5... AI时代,技术er的三大“职业单选题”3129
- 6... 3.26 美团后端暑期一面3079
- 7... 27后端暑期实习-字节-中国广告与交易(已OC3030
- 8... AI应用开发求职心得分享,怎么走才可以轻松上岸?3005
- 9... 快手后端-Java开发二面面经2877
- 10... 携程后端二面2848
正在热议
更多
# 一张图晒出你司的标语 #
4481次浏览 78人参与
# 找AI工作可以去哪些公司? #
10248次浏览 328人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15803次浏览 230人参与
# 你的实习产出是真实的还是包装的? #
20992次浏览 346人参与
# 从事AI岗需要掌握哪些技术栈? #
9936次浏览 403人参与
# 春招至今,你的战绩如何? #
68315次浏览 605人参与
# 厦门银行科技岗值不值得投 #
8278次浏览 188人参与
# AI面会问哪些问题? #
29294次浏览 644人参与
# 你做过最难的笔试是哪家公司 #
36331次浏览 325人参与
# 中国电信笔试 #
32423次浏览 302人参与
# 金三银四,你的春招进行到哪个阶段了? #
22619次浏览 284人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
341277次浏览 2176人参与
# 同bg的你秋招战况如何? #
212269次浏览 1121人参与
# 哪些公司真双非友好? #
69855次浏览 289人参与
# 如何准备秋招 #
78327次浏览 868人参与
# 阿里笔试 #
179551次浏览 1324人参与
# 应届生被毁约被毁意向了怎么办 #
63368次浏览 305人参与
# 机械人避雷的岗位/公司 #
62728次浏览 393人参与
# 小马智行求职进展汇总 #
25151次浏览 80人参与
# 第一份工作一定要去大厂吗 #
15352次浏览 129人参与
# 担心入职之后被发现很菜怎么办 #
291444次浏览 1210人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26336次浏览 310人参与