1. sds的定義
在redis中的字串並不是使用c語言中的char陣列儲存,而是自定義了乙個結構體sds來儲存。
redis> set msg "hello world"
ok(integer) 3
在上述例子中,不管是key還是val都是使用sds型別儲存。
·free屬性的值為0,表示這個sds沒有分配任何未使用空間。
·len屬性的值為5,表示這個sds儲存了乙個五位元組長的字串。
·buf屬性是乙個char型別的陣列,陣列的前五個位元組分別儲存了』r』、『e』、『d』、『i』、『s』五個字元,而最後乙個位元組則儲存了空字元』\0』。
sds遵循c字串以空字元結尾的慣例,儲存空字元的1位元組空間不計算在sds的len屬性裡面,並且為空字元分配額外的1位元組空間,以及新增空字元到字串末尾等操作,都是由sds函式自動完成的,所以這個空字元對於sds的使用者來說是完全透明的。遵循空字元結尾這一慣例的好處是,sds可以直接重用一部分c字串函式庫裡面的函式。
2. sds與c字串的區別
1.空間預分配
空間預分配用於優化sds的字串增長操作:當sds的api對乙個sds進行修改,並且需要對sds進行空間擴充套件的時候,程式不僅會為sds分配修改所必須要的空間,還會為sds分配額外的未使用空間。
2.惰性空間釋放
惰性空間釋放用於優化sds的字串縮短操作:當sds的api需要縮短sds儲存的字串時,程式並不立即使用記憶體重分配來**縮短後多出來的位元組,而是使用free屬性將這些位元組的數量記錄起來,並等待將來使用。
3.二進位制安全
c字串中的字元必須符合某種編碼(比如ascii),並且除了字串的末尾之外,字串裡面不能包含空字元,否則最先被程式讀入的空字元將被誤認為是字串結尾,這些限制使得c字串只能儲存文字資料。
所有sds api都會以處理二進位制的方式來處理sds存放在buf陣列裡的資料,程式不會對其中的資料做任何限制、過濾、或者假設,資料在寫入時是什麼樣的,它被讀取時就是什麼樣。
這也是我們將sds的buf屬性稱為位元組陣列的原因——redis不是用這個陣列來儲存字元,而是用它來儲存一系列二進位制資料。
4.相容部分c字串函式
雖然sds的api都是二進位制安全的,但它們一樣遵循c字串以空字元結尾的慣例:這些api總會將sds儲存的資料的末尾設定為空字元,並且總會在為buf陣列分配空間時多分配乙個位元組來容納這個空字元,這是為了讓那些儲存文字資料的sds可以重用一部分庫定義的函式。
5.常用api
6.redis的啟動
啟動服務端:redis-server
啟動客戶端:redis-cli
第二章 簡單動態字串
在redis中,預設字串的表示型別是sds 簡單動態字串 c語言傳統的字串表示只在很少的情況下用到。sds結構 char buf 用於儲存字串,會在字串結尾自動新增乙個空字元,遵循c字串結尾的慣例,即用n 1字串陣列表示長度為n的字串 unsigned int len buf中已使用的長度,不包含自...
第二章 字元和字串處理
一 tchar c text a tchar szbuffer 100 text a string 無論使用ansi還是unicode字元,編譯器都能通過編譯。二 在使用winexec和openfile呼叫的地方,應該用createprocess和createfile呼叫來代替。三 應當遵循的基本準...
求職寶典 第二章 字串
1.字串與子串 子串行 字串是由零個或多個字元組成的有限序列,子串的定義是串中任意個連續的字元組成的子串行,並規定空串是任意串的子串,任意串是其自身的子串,2.c風格字串 c 語言通常通過 char const char 型別的指標來 c語言中的風格字串。一般來說,我們使用指標的算數操作符來遍歷 c...