Redis笔记之基本数据结构 动态字符串SDS
生活随笔
收集整理的這篇文章主要介紹了
Redis笔记之基本数据结构 动态字符串SDS
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
簡單動(dòng)態(tài)字符串
傳統(tǒng)上的C語言的字符串表示是以空字符結(jié)尾的字符數(shù)組(C字符串),redis自己實(shí)現(xiàn)一個(gè)動(dòng)態(tài)字符串(SDS),兩者之間的區(qū)別以及使用SDS的好處有:
- 結(jié)構(gòu)不同。C字符串以空字符結(jié)尾的字符數(shù)組,而SDS表現(xiàn)的更為復(fù)雜,使用一個(gè)結(jié)構(gòu)體來表示一個(gè)SDS,如圖所示。其中,free屬性表示buffer字符數(shù)組中剩余的空間,len表示已經(jīng)使用的空間。另外,SDS遵守C字符串的慣例,以空字符結(jié)尾,這樣就可以復(fù)用一些C字符串的API,例如打印函數(shù)等。
- 常數(shù)級(jí)別的讀取字符串長度。C字符串每次讀取length都需要遍歷一次buffer數(shù)組,而SDS通過返回len屬性直接得到長度。
- 防止數(shù)據(jù)溢出。C字符串在創(chuàng)建時(shí)需要分配一定的空間,如果兩個(gè)字符串s1,s2在內(nèi)存空間緊密相連,這時(shí)對(duì)字符串s1后面添加一個(gè)字符串,而又忘記為s1重新分配足夠的空間,那么s1數(shù)據(jù)將溢出到s2的空間上;而SDS通過判斷free屬性來判斷當(dāng)前空余空間是否充足來保證正確的字符串增加等。
- 采用預(yù)空間分配和惰性空間釋放減少修改字符串帶來的內(nèi)存重分配次數(shù)。預(yù)空間分配:當(dāng)對(duì)SDS修改并且free空間不足,需要進(jìn)行擴(kuò)展,在補(bǔ)充不足空間的同時(shí)也會(huì)增加free的值;如果buffer的長度小于1M,那么擴(kuò)展后的buffer長度等于len+free+1byte,free=len;如果buffer長度大于等于1M,那么擴(kuò)展后的buffer長度等于len+1M+1byte。惰性空間釋放:當(dāng)執(zhí)行字符串縮減時(shí),不用釋放空間,直接將需要釋放的空間納入到free中,減少內(nèi)存釋放以及重分配的次數(shù)。
- 二進(jìn)制安全。C字符串只能保存文本數(shù)據(jù),不能保存音頻,圖像,壓縮文件等二進(jìn)制文件(因?yàn)镃字符串以\0結(jié)束),而SDS可以,因?yàn)镾DS不是利用空字符來判斷字符串結(jié)束,而是通過len屬性來判斷。
另外,SDS也兼容了C字符串的一些API(因?yàn)樵赽uffer數(shù)組使用C字符串的慣例以空字符結(jié)尾),這樣的好處就是redis不用自己在重新實(shí)現(xiàn),可以復(fù)用一部分C字符串的API。
本文為《Redis設(shè)計(jì)與實(shí)現(xiàn)》閱讀筆記
總結(jié)
以上是生活随笔為你收集整理的Redis笔记之基本数据结构 动态字符串SDS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VB中KeyCode常数用法 VB 按键
- 下一篇: Oracle 练习P297 131026