面試場景
面試官: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,我想就是這樣些細節決定的吧,背誰不會呢?數組
我是敖丙,一個在互聯網苟且偷生的程序員。
你知道的越多,你不知道的越多,人才們的 【三連】 就是丙丙創做的最大動力,咱們下期見!
注:若是本篇博客有任何錯誤和建議,歡迎人才們留言!緩存