面试场景
面试官:Redis有哪些数据类型?
我:String,List,set,zset,hash
面试官:没了?
我:哦哦哦,还有HyperLogLog,bitMap,GeoHash,BloomFilter
面试官:就这?回家等通知吧。程序员
我敢确定,第一个回答,100%的人都能说上来,可是第二个回答能回答上来的人可能就很少了,可是这也不是我今天探讨的话题。
我就从我本身的去面试的回答思路,以及做为一个面试官他想听到的标准答案来给你们出一期,Redis基础类型的文章(系列文章),写这个的时候我仍是颇有心得的,不知道你们有多少人跟我最开始同样,面试官问有哪些类型,就回答出那五种就结束了,若是你是这样的能够在评论区留言,让我看看有多少人是这样的。
可是,一场面试少说都是半小时起步上不封顶,你这样一句话就回答了这么重要的五个知识点,这个结果是你想要的么?是面试官想要的么?
我再问你一个问题,你可能就懵逼了:String在Redis底层是怎么存储的?这些数据类型在Redis中是怎么存放的?Redis快的缘由就只有单线程和基于内存么?
宝贝,触及知识盲区没?不慌,我之前也是这样的,我觉得我背出那五种就完事了,结果被面试官安排了一波,后面我苦心修炼,总算是好了一点,如今对缓存也是很是熟悉了,你不会没事,有我嘛,乖。面试
Redis是C语言开发的,C语言本身就有字符类型,可是Redis却没直接采用C语言的字符串类型,而是本身构建了动态字符串(SDS)的抽象类型。
就比如这样的一个命令,其实我是在Redis建立了两个SDS,一个是名为aobing的Key SDS,另外一个是名为cool的Value SDS,就算是字符类型的List,也是由不少的SDS构成的Key和Value罢了。
SDS在Redis中除了用做字符串,还用做缓冲区(buffer),那到这里你们都仍是有点疑惑的,C语言的字符串很差么为啥用SDS?SDS长啥样?有什么优势呢?
为此我去找到了Redis的源码,能够看到SDS值的结果大概是这样的,源码的在GitHub上是开源的你们一搜就有了。redis
struct sdshdr{ int len; int free; char buf[]; }
回到最初的问题,为何Redis用了本身新开发的SDS,而不用C语言的字符串?那好咱们去看看他们的区别。算法
计数方式不一样
C语言对字符串长度的统计,就彻底来自遍历,从头遍历到末尾,直到发现空字符就中止,以此统计出字符串的长度,这样获取长度的时间复杂度来讲是0(n),大概就像下面这样:
可是这样的计数方式会留下隐患,因此Redis没有采用C的字符串,我后面会提到。
而Redis我在上面已经给你们看过结构了,他本身自己就保存了长度的信息,因此咱们获取长度的时间复杂度为0(1),是否是发现了Redis快的一点小细节了?还没完,不止这些。数据库
你们是否是发现,一个小小的SDS竟然有这么多道理在这?
之前就知道Redis快,最多说个Redis是单线程的,说个多路IO复用,说个基于内存的操做就完了,如今是否是还能够展开说说了?
本文是系列文的第一章,后续会陆续更新的,不知道这样的类型你们是否喜欢,能够留言给我反馈。
你们一同去面试,同样的问题,就是有人能过,有人不能过,你们常常归咎于本身学历,本身过往经历的缘由,可是你能够问一下本身,底层的细节字节是否有深究呢?细节每每才是最重要的,也是最少人知道的,如何和别的仔拉开差距拿到offer,我想就是这样些细节决定的吧,背谁不会呢?数组
我是敖丙,一个在互联网苟且偷生的程序员。
你知道的越多,你不知道的越多,人才们的 【三连】 就是丙丙创做的最大动力,咱们下期见!
注:若是本篇博客有任何错误和建议,欢迎人才们留言!缓存