日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Redis简单动态字符串

發(fā)布時(shí)間:2025/3/21 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis简单动态字符串 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡單動(dòng)態(tài)字符串

  • Simple Dynamic String是Redis內(nèi)部自己定義的一種數(shù)據(jù)類型
  • 在Redis內(nèi)部, 任何包含字符串的鍵值對都是由SDS實(shí)現(xiàn)的
  • SDS還被用于緩沖區(qū), 比如AOF緩沖區(qū).
    比如以下幾個(gè)命令
// 設(shè)置text為key, "hello world"為value, 兩者都為字符串所以都是由SDS實(shí)現(xiàn) set text "hello world" // 建立一個(gè)列表從右端插入, names為key, value即為"john" "lucy" rpush names "john" "lucy"

上面兩個(gè)例子key和value都是由string構(gòu)成那么他們底層就都是由SDS實(shí)現(xiàn)的
那么SDS底層在C語言是如何實(shí)現(xiàn)的呢
下面給出Redis3.2版本之前的實(shí)現(xiàn)

struct sdshdr{unsinged int len; // 已經(jīng)使用的字節(jié)數(shù)量unsinged int less; // 未使用的字節(jié)數(shù)量char buf[]; // 保存字符串的數(shù)組 };

給出一個(gè)這樣的模型代表我用了5個(gè)字節(jié), 還有5個(gè)字節(jié)空閑 , '\0’不算在內(nèi)

這樣使用的好處有

  • 1.降低了獲取字符串長度的復(fù)雜度, 復(fù)雜度直接看len就行為O(1)
  • 2.通過空間預(yù)分配, 減少了修改帶來的內(nèi)存分配
  • 3.SDS以’\0’結(jié)尾,依然遵守C語言規(guī)則, 可以方便的使用C庫函數(shù)
    但還是有一些不好之處 :
    len,和free字段占用了4個(gè)字節(jié), 對于較短的字符串, 浪費(fèi)了存儲(chǔ)空間
    可能有些字符串只占1個(gè)字節(jié),甚至更小, 但這兩個(gè)屬性就占了8個(gè)字節(jié),浪費(fèi)比較大.
    Redis是把數(shù)據(jù)存放在內(nèi)存中, 內(nèi)存空間小于硬盤空間, 所以內(nèi)存空間是非常寶貴的并且SDS在Redis中是比較常見的, 一般如果存上千個(gè),上萬個(gè)數(shù)據(jù), 那么浪費(fèi)的空間就比較大了

Redis3.2之后就將這個(gè)問題改進(jìn)了

struct __attribute__ ((__packed__)) sdshdr5 {unsigned char flags; /* 3 lsb of type, and 5 msb of string length */char buf[]; }; struct __attribute__ ((__packed__)) sdshdr8 {uint8_t len; /* used */uint8_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[]; }; struct __attribute__ ((__packed__)) sdshdr16 {uint16_t len; /* used */uint16_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[]; }; struct __attribute__ ((__packed__)) sdshdr32 {uint32_t len; /* used */uint32_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[]; }; struct __attribute__ ((__packed__)) sdshdr64 {uint64_t len; /* used */uint64_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[]; };

分為5種情況, 小于1字節(jié)使用第一個(gè), 1字節(jié)使用第二個(gè),2字節(jié)使用第三個(gè)依次類推

總結(jié)

以上是生活随笔為你收集整理的Redis简单动态字符串的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。