当前位置:网站首页>面试官:Redis中字符串的内部实现方式是什么?
面试官:Redis中字符串的内部实现方式是什么?
2022-06-28 21:42:00 【51CTO】
在面试间里等候时,感觉这可真暖和呀,我那冰冷的出租屋还得盖两层被子才能睡着。正要把外套脱下来,我突然听到了门外的脚步声,随即门被打开,穿着干净满脸清秀的青年走了进来,一股男士香水的淡香扑面而来。
面试官:Redis中基本的数据类型有哪些?
我:Redis的基本数据类型有:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)。
面试官:字符串类型的内部实现方式是什么?
我还沉浸在上一个问题的沾沾自喜中,顿时表情凝固了,手心开始冒出冷汗。“这个。。没有太深入了解”,我支支吾吾的说到。
面试官:回去等消息吧。
这句话说的干净利落,然后就没有然后了。失败是成功的妈妈,我不气馁,决定马上恶补一下。
类型和编码
首先,整明白什么是类型?什么是编码?在Redis中使用对象来表示内存中的键和值。每个对象由一个叫做redisObject结构体表示,其中有三个属性:类型(type)、编码(encoding)、指向具体数据的指针(ptr)。
我们通常说的字符串、哈希、列表、集合、有序集合都是redisObject中的类型,实际上针对每一个数据结构在Redis内部都有自己底层的多种内部编码实现,这样是为了在合适的场景选择合适的内部编码,以达到内存空间和处理效率的平衡,这可能就是中庸之道吧。
在面试中,经常被问到的内部实现方式、内部构造、内部原理,一般指的就是redisObject中的编码。
字符串的编码
字符串类型的编码有如下三种:
- int:8个字节的长整型。
- embstr:小于等于44个字节的字符串。
- raw:大于44个字节的字符串。
在3.2版本之后,embstr和raw变为了44字节为分界,之前是以39字节为分界。这里以较新版本为准。
为了验证和理解,我们使用object encoding命令查看一下内部编码。
整数类型效果如下:
短字符串类型效果如下:
长字符串类型效果如下:
当然,了解以上细节还没能完全“征服”面试官,我们需要更深入一些:)
简单动态字符串
在C语言中,字符串是以空字符表示结尾的字符数组。在Redis中没有直接使用C语言的字符串,而是定义了一个叫做简单动态字符串(Simple Dynamic String,SDS)的结构,并把其作为Redis默认的字符串表示。
简单动态字符串有三个属性:
len:记录buf字符数组中已使用的字节数量free:记录buf字符数组中为使用的字节数量buf[]:字符数组,用于保存字符串
为了理解,我们举个例子:
那么,对应的简单动态字符串就是这样的:

其中,len为7,表示这个简单动态字符串中保存了一个7个字节的字符串;free为0,表示这个简单动态字符串没有分配未使用的空间;buf是一个字符数组,数组的前7个字节分别保存了O、n、e、M、o、r、e字符,最后一个字节是空字符\0。
相对于C语言的字符串,简单动态字符串有什么好处呢?
- 获取字符串长度的时间复杂度为O(1)。
- 可以保存字节数组,支持安全的二进制数据存储。
- 内部实现了内存空间的预分配机制,减少内存空间分配次数。
- 内部实现了惰性删除机制,字符串缩减后内存不释放,做为预分配空间。
- API是安全的,不会造成缓冲区溢出。
面试官你等着瞧吧,今天你对我爱答不理,明天我让你高攀不起,哈哈哈。。。
参考文献:
《Redis设计与实现》
《Redis开发与运维》
《Redis 深度历险:核心原理与应用实践》
竟然已经看到这里了,你我定是有缘人,留下你的点赞和关注,他日必成大器。
边栏推荐
- LeetCode121. The best time to buy and sell stocks
- Golang JSON serializing and deserializing strings deserializing to map[string]interface{}
- Manual backup and restore of DHCP server
- LeetCode121. 买卖股票的最佳时机
- [golang] leetcode intermediate subset & Word Search
- CORBA Architecture Guide (Common Object Request Broker Architecture)
- How to make up the PMP Exam? How much is the make-up exam?
- 在哪个软件上开户比较安全,开户流程是什么?
- LeetCode560. 和为K的子数组
- Progress in visual weakly supervised learning
猜你喜欢

An artifact extracted from a well-known software and paid by a group of people

10、标准I/O输入输出重定向及管道

In one sentence, I will tell you the meaning of select 1, 2 and 3 in SQL injection, and explain the meaning of each part of SQL injection in detail

ROS 2 Humble Hawksbill 之 f1tenth gym

Un voyage profond d'IA dans Huawei Cloud

AI deep dive of Huawei cloud

Recommend two high-quality Wallpaper software
![[webapi] return dynamic list dynamic](/img/83/b0b36ddab6d74ccd89811cbb58d051.jpg)
[webapi] return dynamic list dynamic

Usage example of qjsonobject

河狸生存记:90后女博士与AI开发者们
随机推荐
Activate function
AI deep dive of Huawei cloud
LeetCode560. 和为K的子数组
Openfire 3.8.2 cluster configuration
Leetcode56. consolidation interval
LeetCode117. Populate the next right node pointer for each node_ II
How do independent site sellers efficiently manage complex Facebook pages?
LeetCode123. 买卖股票的最佳时机III
QT how the coordinates of one control are relatively fixed and displayed on another control (coordinate system)
Interface use case design
LeetCode226. Flip binary tree
Comprehensive evaluation of easy-to-use and powerful PDF reading software: PDF expert, marginnote, liquidtext, notability, goodnotes, Zotero
城市大脑知识图谱构建及应用研究
LeetCode877. 石子游戏
Usage example of qjsonobject
在哪个软件上开户比较安全,开户流程是什么?
16 `bs对象.节点名div.属性contents` children descendants 获取子节点 子孙节点
IPv6 comprehensive experiment
零基础自学SQL课程 | SQL中的日期函数大全
LeetCode986. 区间列表的交集