elasticsearch入門系列">elasticsearch入門系列
739
2022-05-29
前言
1.SDS概念
Redis中字符串的實現,Simple Dynamic String簡單動態字符串,是一數據結構。
Redis是用C語言實現的,但C語言本身沒有字符串類型(只能用字符數組 char[]實現)。所以就會有以下問題:
使用字符數組必須先給目標變量分配足夠的空間,否則可能會溢出。
如果要獲取字符長度,必須遍歷字符數組,時間復雜度是 O(n)。
C 字符串長度的變更會對字符數組做內存重分配。
通過從字符串開始到結尾碰到的第一個’
通過從字符串開始到結尾碰到的第一個’\0’來標記字符串的結束,因此不能保 存圖片、音頻、視頻、壓縮文件等二進制(bytes)保存的內容,二進制不安全。
’來標記字符串的結束,因此不能保 存圖片、音頻、視頻、壓縮文件等二進制(bytes)保存的內容,二進制不安全。而SDS的特點:
不用擔心內存溢出問題,如果需要會對SDS進行擴容。
獲取字符串長度時間復雜度為 O(1),因為定義了len屬性。
通過“空間預分配”( sdsMakeRoomFor)和“惰性空間釋放”,防止多次重分配內存。
判斷是否結束的標志是 len 屬性(它同樣以’\0’結尾是因為這樣就可以使用 C語言中函數庫操作字符串的函數了),可以包含’\0’。
一、Redis存儲原理之string
1. string結構
redisObject 結構如下:
typedef struct redisObject { unsigned type:4; /* 對象的類型,包括:OBJ_STRING、OBJ_LIST、OBJ_HASH、OBJ_SET、OBJ_ZSET */ unsigned encoding:4; /* 具體的數據結構 */ unsigned lru:LRU_BITS; /* 24 位,對象最后一次被命令程序訪問的時間,與內存回收有關 */ int refcount; /* 引用計數。當 refcount 為 0 的時候,表示該對象已經不被任何對象引用,則可以進行垃圾回收了 */ void *ptr; /* 指向對象實際的數據結構 */ } robj;
SDS結構如下:
/* sds.h */ struct __attribute__ ((__packed__)) sdshdr8 { uint8_t len; /* 當前字符數組的長度 */ uint8_t alloc; /*當前字符數組總共分配的內存大小 */ unsigned char flags; /* 當前字符數組的屬性、用來標識到底是 sdshdr8 還是 sdshdr16 等 */ char buf[]; /* 字符串真正的值 */ };
2.string編碼類型
字符串的編碼有三種:
int:存儲 8 個字節的長整型(long,2^63-1)。大小超過了 long 的范圍 (2^63-1=9223372036854775807)時會自動轉成embstr。
embstr:代表 embstr 格式的 SDS(Simple Dynamic String 簡單動態字符串), 存儲小于 44 個字節的字符串。分配一次內存空間,而且是只讀的。
raw:存儲大于 44 個字節的字符串(3.2 版本之前是 39 字節)。分配二次內存空間。
3.應用場景
Redis 分布式
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。