发布日期:2023-10-30 06:39 点击次数:85
小牛之前出了八股文背诵版系列,不少一又友问我,能不成搞个八股文精讲,把口试问题讲讲透,于是系列就这样出身了。我们第一期先聊聊Redis。
字符串Redis底层是C讲话已毕的。于是不少一又友想虽然的认为,Redis的字符串和C讲话字符串已毕相貌一致。
但事实上,Redis我方界说了一套字符串的已毕,名曰SDS(simple dynamic string)。
不少同学在口试时,口试官轻描淡学来一句,来讲一讲Redis的SDS吧。人人一脸懵逼,半天答不上来。临了搞半天,其实口试官即是问的Redis字符串呀。
最初复兴一个问题:为什么Redis不聘请C讲话的字符串平直作念具体已毕?
这虽然是因为这种数据结构有固有颓势啦。主要有如下几个
弱点1:O(n)复杂度获取长度我们知谈,C讲话如何判断一个字符串仍是贬抑,虽然是通过记号位'\0'。
C讲话Str
是以,关于我们想获取字符串长度,我们需要重新启动遍历,直至遍历到\0,时代复杂度造成了O(n)。
弱点2:莫得较好的扩容机制关于C讲话,想要搞个字符串数组,笃信需要事前笃信好字符串长度。淌若这个字符串时时需要修改,修改前后长度一致还好说,淌若不一致,那要领层面就需要再行肯求一段新内存,并把字符一个个拷贝到新的场地。
弱点3:荒芜字符无法处理援用《Redis源码理会与实战》的例子 淌若我们想存储字符串"redis\0"
皇冠博彩官方char 澳门骰宝*a = "redis\0";
到原始C讲话,它编译器看到\0,认为照旧字符贬抑的记号呢,淌若把它打印下来,它只打出redis。是以格外是关于二进制数据,这种奇奇怪怪的case格外多,因此C讲话的字符数组就处理不了这块存储二进制字符的需求了。
为了搞定C讲话字符数组的不及,redis建议了新的门径。我们先来望望3.0及之前版块的已毕。
博彩平台用户体验评价struct sdshdr { unsigned int len; unsigned int free; char buf[]; }
来讲授一下这些字段吧。
欧博在线平台len:数组字符串已使用长度
贝博炸金花一位名叫XXX体操选手最近曝光参加一场私人赌局,欧博真人平台并因此受到处罚。这位选手曾国家队一员,由于行为不当,被迫退出队伍。不过,并就此放弃,而是通过努力坚持,重新获得一线赛事资格,成为备受瞩目新星。free: 数组未使用的字符串长度
球迷文化buf:存储字符串
在之后的版块,Redis对SDS进行了翻新,但大体念念想不变
struct sdshdr { unsigned int len; unsigned int alloc; unsigned char flags; char buf[]; }
来讲授一下这些字段吧。
len:数组字符串已使用长度
alloc: 数组分拨的长度
flags: 示意SDS类型
buf:存储字符串
关于SDS类型,我也稍稍多啰嗦两句。在新版块redis中,有4种SDS类型(sdshrd5 never used)。其中 sdshrd8 sdshrd16 sdshrd32 sdshrd64 的区分只是就在len和alloc上有所区分。
关于sdshrd8 该界说为
皇冠有usb接口吗struct sdshdr8 { uint8_t len; uint8_t alloc; unsigned char flags; char buf[]; }
依此类推,sdshrd16即是
皇冠客服飞机:@seo3687struct sdshdr16 { uint16_t len; uint16_t alloc; unsigned char flags; char buf[]; }
那为啥新版Redis搞这样多结构体?一个结构体不是一法通万法就够了嘛。
虽然,事实如实如斯,按已毕角度看。淌若只聘请sdshrd64,笃信也够了。
但按悭吝角度看呢?淌若我们机子很菜,内存很小,想抠抠索索能省小数,是小数,这样作念就有公道辣。
公道在那处?虽然是uint8_t、uint16_t、uint32_t、uint64_t占的空间不相似,关于小字符串,用小头sdshdr8,这样len 和alloc占用字段也能省小数,即是这样回事。
皇冠博彩是以不错看到,SDS本体上是C讲话的字符数组,加上了小数别的符号属性的结构体辛勤。小伙伴们下次遇见口试官问SDS,就不必慌啦!
临了多啰嗦两句SDS扩容:
关于字符串增多了,淌若原始的剩余空间实足,平直复返 淌若空间不及够,再行肯求两倍最小需要长度的空间,再进行挨个赋值。临了归来一下:Redis建议动态字符串这一数据结构,翻新了C讲话字符数组的不及。该动态字符串有如下公道:
字符串长度获取时代复杂度从O(n)->O(1) 减少字符串扩容引起的数据搬运次数。 不错存储愈加复杂的二进制数据参考
《Redis源码理会与实战》
https://blog.csdn.net/weixin_39744512/article/details/111170924
https://blog.csdn.net/wolf2s/article/details/107945242
《Redis的规划与已毕》