Redis之字串型別

2021-10-10 01:27:20 字數 3168 閱讀 3335

重新定義了c語言中的字串

字串的實現**在sds.**件中。

在redis3.2之前的版本中,是如下儲存字串的

/*

* 型別別名,用於指向 sdshdr 的 buf 屬性

*/typedef char *sds;

/* * 儲存字串物件的結構

*/struct sdshdr ;

示意圖:

而在新版本中redis是如下儲存的。

redis官網github位址

struct __attribute__ ((__packed__)) sdshdr5 ;

struct __attribute__ ((__packed__)) sdshdr8 ;

struct __attribute__ ((__packed__)) sdshdr16 ;

struct __attribute__ ((__packed__)) sdshdr32 ;

struct __attribute__ ((__packed__)) sdshdr64 ;

示意圖:

相對於舊版本,只是新增了幾種型別,更好的優化了儲存,節省空間。

其中 len 是字串長度。 alloc 是分配的記憶體。 flags 是當前結構體型別。  buf 用來儲存具體的資料

question1: 為什麼sdshdr5沒有len,alloc這兩個屬性?

答:由於sdshdr5儲存的資料量小,沒有必要有那兩個屬性,如果加上,那兩個屬性的占用空間比字串本身還要大,所以沒有必要。範圍大小為2^5-1    預設不使用,長度固定,無法動態擴容

question2:為什麼不直接採取c語言的字元陣列進行儲存,那樣不是占用記憶體更小嗎?(不用儲存長度,型別,占用記憶體..)

答:①為了二進位制安全。  所謂二進位制安全,是 c 語言中字串結束的標誌符為  '\0' , 而在實際的生產中,後端語言可能將物件或者其他型別序列化成乙個字串儲存在 redis 中, 中間可能會出現 '\0' ,如果採用c語言的方式直接儲存,會導致字串異常結束。

②len這個變數就很好的解決了這個問題。 '\0' 也會當做乙個字元進行儲存,len儲存整個字串的長度。而且在redis中檢視字串長度時,由於 len 直接儲存了字串長度,不用遍歷整個字元陣列,時間複雜度為o(1)

question3:flags存在的意義?

flags占用乙個位元組,前三位是用來 判斷當前字串的型別,分配不同型別的結構體,在當前結構體不再滿足字串儲存的需求時,向更大記憶體的結構體進行擴充套件,更好的節省記憶體

後五位則表示未使用的記憶體大小

alloc 屬性記錄了自己的總分配空間

總的來說,redis自創的字串結構體有如下優點:

1.二進位制安全

2.檢視字串的時間複雜度為o(1)

3.預分配記憶體,減少修改字串帶來的記憶體重分配次數,每次擴容都會額外預留一些空間方便下次擴容

4.不會造成緩衝區溢位,動態分配記憶體

5.相容部分c語言操作字串函式

1.set命令:設定鍵值

2.get命令:獲取某個鍵的值

3.incr: 對整型自增1

4.decr: 對整型自減1

5.incrby : 對整型做加法

6.decrby:對整型做減法

7.mget:批量獲取鍵

8.mset:批量設定鍵(能使用批量設定時,盡量使用批量設定,這樣只需傳送一次命令。減少傳輸)

10.strlen:檢視字串長度

11.incrbyfloat:浮點型自增

12.getrange :獲取字串某個區間的值

13.setrange:設定字串某個下標的值

1.使用後端語言將使用者id作為key,資料序列化儲存在redis中 。

優點:占用記憶體小

缺點:不方便修改

2.使用使用者id和屬性作為key,儲存值

優點:直觀,方便修改

缺點:占用記憶體大,使用者資料分散

redis型別之字串

字串string 127.0.0.1 6379 exists name 判斷key存在 integer 1 integer 10 字串長度10 127.0.0.1 6379 get name 獲取key luhanhello 127.0.0.1 6379 strlen name integer 10...

Redis之String 字串型別

字串型別是redis中最為基礎的資料儲存型別,它在redis中是二進位制安全的,這便意味著該型別可以接受任何格式的資料,如jpeg影象資料或json物件描述資訊等。在redis中字串型別的value最多可以容納的資料長度是512m。命令原型 時間複雜度 命令描述 返回值o 1 追加後value的長度...

Redis快速入門之字串型別

字串型別是redis中最基本的資料型別,他能儲存任何形式的字串,包括二進位制資料,你可以用它來儲存使用者的郵箱,json化的字串,設定是二進位制物件。乙個字串型別允許儲存的大小為512mset keyvalue getkey incr key當操作的鍵值不存在是預設的值為0,因此遞增之後的值為1 當...