在面试室等候的时候,感觉真的很暖和。我冷冷的出租屋要盖上两层被子才能入睡。正准备脱掉外套,突然听到门外传来脚步声,紧接着门被打开,一个衣着干净,面容英俊的青年走了进来,一股淡淡的男士香水味扑面而来。.面试官:Redis有哪些基本数据类型?我:Redis的基本数据类型有:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)。面试官:string类型的内部实现是怎样的?我还沉浸在最后一题的得意中,脸色顿时一僵,手心开始渗出冷汗。“这个……我了解不深。”我吞吞吐吐的说道。采访者:回去等消息吧。这句话干干净净,然后就没有了。失败是成功之母,我没有气馁,决定马上弥补。类型和编码首先,什么是类型?什么是编码?Redis中使用对象来表示内存中的键和值。每个对象都由一个名为redisObject的结构体表示,它具有三个属性:类型(type)、编码(encoding)和指向特定数据的指针(ptr)。我们通常说的字符串、哈希、列表、集合、有序集合都是redisObject中的类型。实际上,对于每一种数据结构,Redis都有自己底层的多种内部编码实现。为场景选择合适的内部编码,以达到内存空间和处理效率的平衡。这可能是中庸之道。面试中经常被问到的内部实现、内部结构、内部原理,一般都是指redisObject中的编码。字符串编码字符串类型有三种编码方式:int:8字节长整型。embstr:小于等于44字节的字符串。raw:大于44字节的字符串。3.2版本后,embstr和raw以44字节为界,以前是39字节。较新的版本在这里盛行。为了验证和理解,我们使用objectencoding命令查看内部编码。整数类型效果如下:127.0.0.1:6379>setone-more-num1OK127.0.0.1:6379>objectencodingone-more-num"int"shortstring类型效果如下:127.0.0.1:6379>setone-more-str万猫学社OK127.0.0.1:6379>objectencodingone-more-str"embstr"长串类型效果如下:127.0.0.1:6379>setone-more-str万猫学社|万猫学院|万猫学院|万猫学院|万猫学院|万猫学院|万猫学院|万猫学院OK127.0.0.1:6379>objectencodingone-more-str"raw"当然,了解了以上细节还没有完全“征服”"面试官,我们需要深入一点:)简单的动态字符串在C语言中,字符串是一个以空字符结尾的字符数组。在Redis中,并没有直接使用C语言的字符串,而是定义了一个称为简单动态字符串(SimpleDynamicString,简称SDS)的结构,并作为Redis默认的字符串表示。一个简单的动态字符串有3个属性:len:记录buf字符数组使用的字节数free:记录buf字符数组使用的字节数buf[]:字符数组,用来保存字符串为了明白了,我们比如:127.0.0.1:6379>setone-more-strOneMoreOK那么对应的简单动态字符串是这样的:其中len为7,表示这个简单的里面存放了一个7字节的字符串动态字符串字符串;free为0,说明这个简单的动态字符串还没有分配未使用的空间;buf是一个字符数组,数组的前7个字节分别存放O、n、e、M、o、r、e字符,最后一个字节为空字符\0。简单的动态字符串相对于C语言中的字符串有什么优势?获取字符串长度的时间复杂度为O(1)。可以保存字节数组,支持安全的二进制数据存储。实现内部内存空间预分配机制,减少内存空间分配次数。内部实现了惰性删除机制,减少字符串后不释放内存,作为预分配空间使用。API不会发生缓冲区溢出。等着瞧吧,面试官,今天你不理我,明天我就让你失望了,哈哈哈。..参考资料:《Redis设计与实现》《Redis开发与运维》《Redis 深度历险:核心原理与应用实践》已经看到了,你我一定是有缘人,留下你的点赞和关注,你日后必成大器。
