最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis系列之底層數(shù)據(jù)結(jié)構(gòu)SDS詳解

 更新時間:2024年11月07日 09:02:32   作者:smileNicky  
SDS(簡單動態(tài)字符串)是Redis使用的核心數(shù)據(jù)結(jié)構(gòu),用于替代C語言的字符串,以解決長度獲取慢、內(nèi)存溢出等問題,SDS通過預(yù)分配與惰性釋放策略優(yōu)化內(nèi)存使用,增強安全性,且能存儲文本與二進制數(shù)據(jù),可查看源碼src/sds.h和src/sds.c了解更多

實驗的環(huán)境

  • Redis 6.0
  • VSCode 1.88.1

什么是SDS?

SDS:Simple Dynamic String,翻譯為簡單動態(tài)字符串。

SDS是一種用于存儲二進制數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),具有動態(tài)擴容的特點,代碼位于src/sds.hsrc/sds.c

SDS的總體數(shù)據(jù)結(jié)構(gòu)大致如圖:在源碼里sds包括幾個部分,lenalloc、flags、buf,其中 sdshdr是頭部,buf是真實存儲數(shù)據(jù)的地方,在存儲的數(shù)據(jù)后面會跟一個\0,所以數(shù)據(jù)加上\0就是所謂的buf

  • len:保存了SDS字符串的長度
  • buf[]:保存數(shù)據(jù)的地方
  • alloc:分別以uint8, uint16, uint32, uint64表示整個SDS
  • flags:始終為一字節(jié), 以低三位標示著頭部的類型, 高5位未使用

查看源碼sds.h,可以看到SDS里面有幾種不同的頭部,其中sdshdr5實際并未使用到,所以實際上有四種不同的頭部

/* Note: sdshdr5 is never used, we just access the flags byte directly.
 * However is here to document the layout of type 5 SDS strings. */
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[];
};

為什么要使用SDS?

Redis是用C語言寫的,為什么不直接就用C語言里的char來定義字符串?

獲取字符串長度

由于有len屬性,所以獲取SDS字符串的長度只需要讀取len屬性,所以時間復(fù)雜度為O(1)

如果直接使用C語言中的字符串來實現(xiàn),獲取字符串的長度需要遍歷計數(shù),時間復(fù)雜度為O(n)。

避免緩存區(qū)溢出

C語言中,如果使用strcat函數(shù)來進行兩個字符串的拼接,如果沒有分配足夠長度的內(nèi)存空間,就會造成緩存區(qū)溢出。

而對于SDS數(shù)據(jù)類型,在進行字符串修改的時候,會根據(jù)記錄的len屬性檢查內(nèi)存空間是否滿足需求,如果不滿足,會進行相應(yīng)空間的擴展,所以不會出現(xiàn)緩存區(qū)溢出

減少字符串內(nèi)存重新分配次數(shù)

C語言中字符串,是不會記錄字符串的長度的,所以一旦修改了字符串,就需要重新分配內(nèi)存,因為如果沒有重新分配,字符串長度增大時會造成內(nèi)存溢出區(qū)溢出,長度減小時會造成內(nèi)存泄漏。

而對于SDS來說,因為有長度熟悉lenalloc屬性的存在,SDS實現(xiàn)了空間預(yù)分配惰性空間釋放兩種策略來減少重新分配內(nèi)存

  1. 空間預(yù)分配:SDS對空間進行擴展的時候,擴展的內(nèi)存比實際需要的多,這樣可以減少字符串增長操作所需的內(nèi)存重新分配次數(shù)
  2. 惰性空間釋放:SDS對字符串進行縮短操作時,不會立即進行內(nèi)存重新分配,來回收縮短后多余的內(nèi)存空間,而是使用alloc將這些字節(jié)數(shù)量記錄下來,等待后續(xù)使用

二進制安全

C語言中,是以空字符串作為字符串結(jié)束的標識,但是一些特殊的字符串,可能就包括空字符串的,所以容易丟失數(shù)據(jù),不能正確存取。

而SDS是根據(jù)len屬性,以處理二進制的方式來處理buf里的數(shù)據(jù),所以保存數(shù)據(jù)更加安全

兼容部分C字符串函數(shù)

SDS可以重用C語言庫<string.h>中的一部分函數(shù)

C字符串和SDS對比

C字符串SDS
獲取字符串長度時間復(fù)雜度為O(n)獲取字符串的長度時間復(fù)雜度為O(1)
不安全,可能會造成緩沖區(qū)溢出安全,不會造成緩沖區(qū)溢出
修改字符串n次就需要進行n次內(nèi)存分配修改字符串長度n次,最多需要n次內(nèi)存分配
只能保存文本數(shù)據(jù)可以保存文本數(shù)據(jù)或者二進制數(shù)據(jù)
可以使用所有<string.h>庫中的函數(shù)可以使用一部分<string.h>庫中的函數(shù)

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Windows操作系統(tǒng)下Redis服務(wù)安裝圖文教程

    Windows操作系統(tǒng)下Redis服務(wù)安裝圖文教程

    這篇文章主要介紹了Windows操作系統(tǒng)下Redis服務(wù)安裝圖文教程,文中給大家提供了redis的下載地址,安裝程序步驟,需要的朋友可以參考下
    2018-03-03
  • Redis異常測試盤點分析

    Redis異常測試盤點分析

    這篇文章主要為大家介紹了Redis異常測試盤點分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • SpringBoot集成Redis的思路詳解

    SpringBoot集成Redis的思路詳解

    Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。接下來通過本文給大家分享SpringBoot集成Redis的詳細過程,感興趣的朋友一起看看吧
    2021-10-10
  • 壓縮Redis里的字符串大對象操作

    壓縮Redis里的字符串大對象操作

    這篇文章主要介紹了壓縮Redis里的字符串大對象操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Redis框架在項目中的實戰(zhàn)

    Redis框架在項目中的實戰(zhàn)

    Lettuce是一款高性能、異步非阻塞的 Redis 客戶端,基于Netty框架開發(fā),也是Spring Boot 2.x 及以上版本默認的 Redis 客戶端客戶端(Lettuce)只需配置哨兵節(jié)點地址和主節(jié)點名稱,本文介紹Redis框架在項目中的實戰(zhàn),感興趣的朋友一起看看吧
    2026-02-02
  • redis客戶端實現(xiàn)高可用讀寫分離的方式詳解

    redis客戶端實現(xiàn)高可用讀寫分離的方式詳解

    基于sentienl 獲取和動態(tài)感知 master、slaves節(jié)點信息的變化,我們的讀寫分離客戶端就能具備高可用+動態(tài)擴容感知能力了,接下來通過本文給大家分享redis客戶端實現(xiàn)高可用讀寫分離的方式,感興趣的朋友一起看看吧
    2021-07-07
  • Ubuntu系統(tǒng)中Redis的安裝步驟及服務(wù)配置詳解

    Ubuntu系統(tǒng)中Redis的安裝步驟及服務(wù)配置詳解

    本文主要記錄了Ubuntu服務(wù)器中Redis服務(wù)的安裝使用,包括apt安裝和解壓縮編譯安裝兩種方式,并對安裝過程中可能出現(xiàn)的問題、解決方案進行說明,以及在手動安裝時,服務(wù)器如何添加自定義服務(wù)的問題,需要的朋友可以參考下
    2024-12-12
  • Redis實現(xiàn)分布式鎖的五種方法詳解

    Redis實現(xiàn)分布式鎖的五種方法詳解

    在分布式架構(gòu)中,我們同樣會遇到數(shù)據(jù)共享操作問題,本文章使用Redis來解決分布式架構(gòu)中的數(shù)據(jù)一致性問題,需要的小伙伴可以參考一下
    2022-06-06
  • 詳解使用Redis SETNX 命令實現(xiàn)分布式鎖

    詳解使用Redis SETNX 命令實現(xiàn)分布式鎖

    本篇文章主要介紹了詳解使用Redis SETNX 命令實現(xiàn)分布式鎖,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 使用Redis實現(xiàn)API網(wǎng)關(guān)或單個服務(wù)的請求限流的具體代碼

    使用Redis實現(xiàn)API網(wǎng)關(guān)或單個服務(wù)的請求限流的具體代碼

    在微服務(wù)架構(gòu)中,對 API 網(wǎng)關(guān)或單個服務(wù)的請求進行速率限制至關(guān)重要,以防止惡意攻擊、資源濫用并確保系統(tǒng)的穩(wěn)定性和可用性,本文將詳細探討如何利用 Redis 實現(xiàn) API 網(wǎng)關(guān)或單個服務(wù)的請求限流,深入分析各種主流算法,需要的朋友可以參考下
    2025-07-07

最新評論

左云县| 漳平市| 宝山区| 沂源县| 潢川县| 鹤庆县| 武隆县| 个旧市| 绥德县| 仁布县| 若羌县| 壤塘县| 荔浦县| 百色市| 文成县| 长子县| 炉霍县| 南昌县| 乾安县| 桑日县| 文登市| 绥滨县| 神木县| 武穴市| 丰台区| 于田县| 宜昌市| 左云县| 衡阳县| 张北县| 桐柏县| 新巴尔虎左旗| 伊川县| 乌兰察布市| 伊金霍洛旗| 杂多县| 六枝特区| 承德市| 余江县| 华亭县| 日照市|