Redis简单动态字符串
生活随笔
收集整理的這篇文章主要介紹了
Redis简单动态字符串
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
簡(jiǎn)單動(dòng)態(tài)字符串
- Simple Dynamic String是Redis內(nèi)部自己定義的一種數(shù)據(jù)類(lèi)型
- 在Redis內(nèi)部, 任何包含字符串的鍵值對(duì)都是由SDS實(shí)現(xiàn)的
- SDS還被用于緩沖區(qū), 比如AOF緩沖區(qū).
比如以下幾個(gè)命令
上面兩個(gè)例子key和value都是由string構(gòu)成那么他們底層就都是由SDS實(shí)現(xiàn)的
那么SDS底層在C語(yǔ)言是如何實(shí)現(xiàn)的呢
下面給出Redis3.2版本之前的實(shí)現(xiàn)
給出一個(gè)這樣的模型代表我用了5個(gè)字節(jié), 還有5個(gè)字節(jié)空閑 , '\0’不算在內(nèi)
這樣使用的好處有
- 1.降低了獲取字符串長(zhǎng)度的復(fù)雜度, 復(fù)雜度直接看len就行為O(1)
- 2.通過(guò)空間預(yù)分配, 減少了修改帶來(lái)的內(nèi)存分配
- 3.SDS以’\0’結(jié)尾,依然遵守C語(yǔ)言規(guī)則, 可以方便的使用C庫(kù)函數(shù)
但還是有一些不好之處 :
len,和free字段占用了4個(gè)字節(jié), 對(duì)于較短的字符串, 浪費(fèi)了存儲(chǔ)空間
可能有些字符串只占1個(gè)字節(jié),甚至更小, 但這兩個(gè)屬性就占了8個(gè)字節(jié),浪費(fèi)比較大.
Redis是把數(shù)據(jù)存放在內(nèi)存中, 內(nèi)存空間小于硬盤(pán)空間, 所以?xún)?nèi)存空間是非常寶貴的并且SDS在Redis中是比較常見(jiàn)的, 一般如果存上千個(gè),上萬(wàn)個(gè)數(shù)據(jù), 那么浪費(fèi)的空間就比較大了
Redis3.2之后就將這個(gè)問(wèn)題改進(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è)依次類(lèi)推
總結(jié)
以上是生活随笔為你收集整理的Redis简单动态字符串的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 排序算法(上)
- 下一篇: Redis之intset(整数集合)