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