日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Redis简单动态字符串

發(fā)布時(shí)間:2025/3/21 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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è)命令
// 設(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語(yǔ)言是如何實(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.降低了獲取字符串長(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)題。

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