二進制安全
二進制安全是一種主要用于字元串操作函數相關的計算機程式設計術語。一個二進制安全函數,其本質是将操作輸入作為原始的、無任何特殊字元意義的資料流。其在操作上應包含一個字元所能有的256種可能的值(假設為8比特字元)
-
那什麼是特殊字元?
标記字元,如轉義碼,\0結尾的字元串(如C語言中的字元串),不是二進制安全的。
-
場景
在處理未知格式的資料,例如随意的檔案、加密資料及類似情況時,二進制安全功能是必須的。函數必須知道資料長度,以便函數操作整體資料。
Redis二進制安全原理
- Redis3.0源碼
-
什麼,你還不懂Redis二進制安全嗎?二進制安全Redis二進制安全原理 - redis通過定義上述結構體的方式,擴充了C語言底層字元串的缺點,字元串長度的擷取時間複雜度從原來的O(N)變成了O(1),另一方面也可以通過free的動态改變來減少記憶體的配置設定。需要強調一點的是buf數組不是存儲的字元,而是二進制數組,因為C語言字元串中間是不能出現空字元的,而二進制資料中間很有可能會有空字元,是以C語言是二進制不安全的,而redis又是二進制安全。為了存儲多種類型的資料,redis就直接把所有資料當作二進制來存儲,這樣就可以存儲媒體檔案和字元串,是以SDS雖然叫簡單動态字元串,但是它可不隻是用來儲存字元串。SDS在Redis中是實作字元串對象的工具。當你對該字元串取值時是通過len屬性判斷實際内容的長度,然後取的值。拼接字元串時是追加到free空間中的。
簡單說二進制安全就是,隻關心二進制化的字元串,不關心具體格式,隻會嚴格的按照二進制的資料存取,不會妄圖以某種特殊格式解析資料。
SDS通過判斷目前字元串空餘的長度與需要追加的字元串長度,如果空餘長度大于等于需要追加的字元串長度,那麼直接追加即可,這樣就減少了重新配置設定記憶體操作;否則,先用sdsMakeRoomFor函數對SDS進行擴充,按照一定的機制來決定擴充的記憶體大小,然後再執行追加操作,擴充後多餘的空間不釋放,友善下次再次追加字元串,這樣做的代價就是浪費了一些記憶體,但是在Redis字元串追加操作很頻繁的情況下,這種機制能很高效的完成追加字元串的操作。