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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis简单动态字符串

發布時間:2025/3/21 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis简单动态字符串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡單動態字符串

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

上面兩個例子key和value都是由string構成那么他們底層就都是由SDS實現的
那么SDS底層在C語言是如何實現的呢
下面給出Redis3.2版本之前的實現

struct sdshdr{unsinged int len; // 已經使用的字節數量unsinged int less; // 未使用的字節數量char buf[]; // 保存字符串的數組 };

給出一個這樣的模型代表我用了5個字節, 還有5個字節空閑 , '\0’不算在內

這樣使用的好處有

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

Redis3.2之后就將這個問題改進了

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字節使用第一個, 1字節使用第二個,2字節使用第三個依次類推

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。