关注
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个字节。
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
2025-12-09 23:27
商丘学院 嵌入式软件工程师
程序员花海:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 在大厂上班是一种什么样的体验 #
3294次浏览 42人参与
# 找工作的破防时刻 #
251239次浏览 1947人参与
# 程序员找工作至少要刷多少题? #
6784次浏览 110人参与
# 程序员能干到多少岁? #
4957次浏览 76人参与
# 论秋招对个人心气的改变 #
4825次浏览 86人参与
# OPPO求职进展汇总 #
770589次浏览 5395人参与
# 为了减少AI幻觉,你注入过哪些设定? #
1380次浏览 42人参与
# 刚入职的你踩过哪些坑 #
3233次浏览 68人参与
# 一张图晒一下你的AI员工 #
2299次浏览 55人参与
# 牛客AI体验站 #
2472次浏览 72人参与
# 我现在比当时_,你想录用我吗 #
3082次浏览 48人参与
# 关于春招/暑期实习,你想知道哪些信息? #
3278次浏览 70人参与
# AI Coding的使用心得 #
1902次浏览 46人参与
# 晒晒你司的新年福利 #
3141次浏览 55人参与
# 实习,不懂就问 #
164189次浏览 1461人参与
# 软开人,秋招你打算投哪些公司呢 #
180343次浏览 1386人参与
# 非技术岗是怎么找实习的 #
288536次浏览 2586人参与
# 帆软软件工作体验 #
12635次浏览 68人参与
# 牛客租房专区 #
146536次浏览 1462人参与
# 从哪些方向判断这个offer值不值得去? #
51093次浏览 348人参与