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

Redis簡(jiǎn)單動(dòng)態(tài)字符串SDS的實(shí)現(xiàn)示例

 更新時(shí)間:2023年08月17日 10:40:41   作者:秋天code  
Redis沒(méi)有直接復(fù)用C語(yǔ)言的字符串,而是新建了SDS,本文主要介紹了Redis簡(jiǎn)單動(dòng)態(tài)字符串SDS的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下

定義

眾所周知,Redis是由C語(yǔ)言寫的。對(duì)于字符串類型的數(shù)據(jù)存儲(chǔ),Redis并沒(méi)有直接使用C語(yǔ)言中的字符串。而是自己構(gòu)建了一個(gè)結(jié)構(gòu)體,叫做“簡(jiǎn)單動(dòng)態(tài)字符串”,簡(jiǎn)稱SDS,比C語(yǔ)言中的字符串更加靈活。

SDS的結(jié)構(gòu)體是這樣的:

struct{
	int len; // 數(shù)組中已使用的字節(jié)的數(shù)量,即真實(shí)的內(nèi)容長(zhǎng)度 
	int free; // 數(shù)組中未使用的字節(jié)的數(shù)量,即還可以繼續(xù)存儲(chǔ)的內(nèi)容的長(zhǎng)度 
	char buff[]; // 字節(jié)數(shù)組,用來(lái)保存字符串 
};

在C語(yǔ)言中,總是使用長(zhǎng)度是N+1的字符數(shù)組來(lái)保存長(zhǎng)度為N的字符串,并且字符數(shù)組的最后一個(gè)是’\0’結(jié)束符,在SDS中,一次申請(qǐng)的字符串的長(zhǎng)度比真實(shí)的長(zhǎng),所以才會(huì)有free這個(gè)屬性

SDS與C語(yǔ)言字符串相比,優(yōu)點(diǎn)是:

  • O(1)復(fù)雜度獲取字符串長(zhǎng)度
  • 防止了內(nèi)存溢出
  • 減少內(nèi)存分配的次數(shù)
  • 二進(jìn)制安全

獲取字符串長(zhǎng)度

對(duì)于C字符串來(lái)說(shuō),獲取一個(gè)字符串的真實(shí)長(zhǎng)度,需要遍歷字符串,這就是O(N)的時(shí)間復(fù)雜度。而在SDS中,用一個(gè)len屬性保存字符串的真實(shí)長(zhǎng)度,每次對(duì)字符串的修改,都會(huì)維護(hù)這個(gè)len屬性因此對(duì)于SDS來(lái)說(shuō),獲取字符串的真實(shí)長(zhǎng)度的時(shí)間復(fù)雜度是O(1),這確保了獲取字符串長(zhǎng)度的操作不會(huì)成為Redis字符串的性能瓶頸

內(nèi)存溢出問(wèn)題

在C字符串中,如果要對(duì)字符串進(jìn)行修改操作,如果忘記了給字符串重新分配足夠的空間,就會(huì)導(dǎo)致內(nèi)存溢出問(wèn)題。在C語(yǔ)言中,并沒(méi)有內(nèi)存溢出相關(guān)的檢查機(jī)制,因此可能會(huì)導(dǎo)致不可預(yù)測(cè)的問(wèn)題產(chǎn)生。

通過(guò)SDS的API來(lái)操作字符串時(shí),會(huì)先檢查SDS的空間是否滿足修改的要求,如果不滿足的話,會(huì)自動(dòng)將SDS的空間擴(kuò)展至要求的大小,然后執(zhí)行字符串操作,所以使用SDS來(lái)操作字符串,不用擔(dān)心內(nèi)存溢出問(wèn)題。

減少內(nèi)存分配的次數(shù)

對(duì)于C語(yǔ)言字符串,因?yàn)榭偸怯幸粋€(gè)長(zhǎng)度為N+1的字符數(shù)組來(lái)保存一個(gè)長(zhǎng)度為N的字符串。所以,如果對(duì)C字符串進(jìn)行操作:

  • 如果進(jìn)行字符串的長(zhǎng)度增長(zhǎng)的操作,比如追加字符append,那么在執(zhí)行這個(gè)操作前,需要先為字符串分配新的內(nèi)存空間,然后才能執(zhí)行操作。
  • 如果忘記了重新分配內(nèi)存,會(huì)導(dǎo)致內(nèi)存溢出問(wèn)題。如果進(jìn)行字符串長(zhǎng)度的減少操作,比如刪除某個(gè)字符,那么在執(zhí)行這個(gè)操作之后,需要釋放掉不再使用的內(nèi)存空間。如果忘記了釋放內(nèi)存,會(huì)導(dǎo)致內(nèi)存泄漏問(wèn)題。

而對(duì)于SDS來(lái)說(shuō),不存在這些問(wèn)題,通過(guò)兩個(gè)機(jī)制來(lái)解決以上問(wèn)題

  • 空間預(yù)分配
  • 惰性空間釋放

1. 空間預(yù)分配

空間預(yù)分配機(jī)制,用來(lái)優(yōu)化SDS字符串的增長(zhǎng)操作。我們認(rèn)為初始化賦值和拼接操作都是對(duì)于SDS的擴(kuò)容操作。當(dāng)SDS來(lái)擴(kuò)容一個(gè)字符串時(shí),系統(tǒng)不僅會(huì)為SDS分配所需的內(nèi)存空間大小,還會(huì)分配額外的未使用空間,即系統(tǒng)分配給SDS的空間大小比真實(shí)的字符串長(zhǎng)度要大。至于,額外的空間有多大,有以下規(guī)則:

  • 當(dāng)擴(kuò)容后的SDS的長(zhǎng)度小于1MB,那么程序分配的額外空間就是len的大小,即與真實(shí)的字符串的空間大小相同。例如,擴(kuò)容后,SDS的len的長(zhǎng)度是20,那么額外的空間也是20,總共的SDS的空間是40字節(jié)。
  • 如果擴(kuò)容后的SDS的長(zhǎng)度大于等于1MB,那么程序會(huì)分配1MB的額外空間。

通過(guò)空間預(yù)分配策略,可以減少字符串增長(zhǎng)操作的內(nèi)存分配次數(shù)。當(dāng)進(jìn)行字符串增長(zhǎng)操作時(shí),會(huì)先檢查free的空間大小是否夠增加的長(zhǎng)度,如果夠,那么直接在真實(shí)的數(shù)組上操作,無(wú)需再進(jìn)行內(nèi)存分配操作,并維護(hù)free和len的值。如果不夠,那么就會(huì)進(jìn)行擴(kuò)容操作,擴(kuò)容機(jī)制上面說(shuō)過(guò)了。

2. 惰性空間釋放

惰性空間釋放用來(lái)優(yōu)化字符串的縮短操作。當(dāng)SDS縮短一個(gè)字符串時(shí),還是直接在原始的數(shù)組上操作,并維護(hù)len和free的值??s短完成后,程序并不會(huì)立即回收釋放后的內(nèi)存,而是使用free屬性記錄下來(lái),方便下次的字符串長(zhǎng)度增加時(shí)使用。

二進(jìn)制安全

C字符串中的字符必須符號(hào)某種編碼,例如,當(dāng)編碼格式是ASCII時(shí),除了末尾的空字符’\0’外,字符串內(nèi)容中不可以出現(xiàn)空字符,否則程序在讀取字符串時(shí),會(huì)誤以為這是字符串的結(jié)尾。這樣的限制使得,C字符串只能保存文本數(shù)據(jù),而不能保存圖片、音頻等二進(jìn)制數(shù)據(jù)。而SDS會(huì)以二進(jìn)制的方式來(lái)處理存放到buff數(shù)組中的數(shù)據(jù),程序不會(huì)對(duì)其中的數(shù)據(jù)進(jìn)行限制、過(guò)濾等額外操作這就是我們稱SDS是字節(jié)數(shù)組的原因——Redis不是用buff數(shù)組來(lái)保存字符,而是保存一系列的二進(jìn)制數(shù)據(jù)

SDS不是使用空字符’\0’來(lái)判斷字符串的結(jié)尾,而是使用len屬性來(lái)判斷字符串是否結(jié)尾如"Redis\0String",C字符串的函數(shù)會(huì)把’\0’當(dāng)做結(jié)束符來(lái)處理,而忽略到后面的"String"。而SDS的buf字節(jié)數(shù)組不是在保存字符,而是一系列二進(jìn)制數(shù)組,SDS API都會(huì)以二進(jìn)制的方式來(lái)處理buf數(shù)組里的數(shù)據(jù),使用len屬性的值而不是空字符來(lái)判斷字符串是否結(jié)束。

參考文章

Redis數(shù)據(jù)結(jié)構(gòu)——簡(jiǎn)單動(dòng)態(tài)字符串SDS - 隨心所于 - 博客園

Redis設(shè)計(jì)與實(shí)現(xiàn)

到此這篇關(guān)于Redis簡(jiǎn)單動(dòng)態(tài)字符串SDS的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Redis 動(dòng)態(tài)字符串SDS內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis線程模型的原理分析

    Redis線程模型的原理分析

    Redis是一個(gè)高性能的數(shù)據(jù)存儲(chǔ)框架,在高并發(fā)的系統(tǒng)設(shè)計(jì)中,Redis也是一個(gè)比較關(guān)鍵的組件,是我們提升系統(tǒng)性能的一大利器,本文詳細(xì)的介紹了Redis線程模型,感興趣的可以了解一
    2021-11-11
  • Redis實(shí)現(xiàn)多人多聊天室功能

    Redis實(shí)現(xiàn)多人多聊天室功能

    這篇文章主要為大家詳細(xì)介紹了Redis實(shí)現(xiàn)多人多聊天室功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Redis中漸進(jìn)式遍歷Scan命令的使用

    Redis中漸進(jìn)式遍歷Scan命令的使用

    在Redis中,一般都會(huì)禁用keys 這種命令,因?yàn)樗鼤?huì)遍歷整個(gè)數(shù)據(jù)庫(kù),會(huì)嚴(yán)重影響redis的性能,本文就來(lái)介紹一下Redis中漸進(jìn)式遍歷Scan命令的使用,感興趣的可以了解一下
    2023-11-11
  • redis中bind配置的詳細(xì)步驟

    redis中bind配置的詳細(xì)步驟

    本文主要介紹了redis中bind配置的詳細(xì)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Redis基礎(chǔ)學(xué)習(xí)之管道機(jī)制詳析

    Redis基礎(chǔ)學(xué)習(xí)之管道機(jī)制詳析

    這篇文章主要給大家介紹了關(guān)于Redis基礎(chǔ)學(xué)習(xí)之管道機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 解決Redis報(bào)錯(cuò)MISCONF?Redis?is?configured?to?save?RDB?snapshots

    解決Redis報(bào)錯(cuò)MISCONF?Redis?is?configured?to?save?RDB?snap

    這篇文章主要給大家介紹了關(guān)于如何解決Redis報(bào)錯(cuò)MISCONF?Redis?is?configured?to?save?RDB?snapshots的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 使用Redis實(shí)現(xiàn)模糊匹配查詢方案

    使用Redis實(shí)現(xiàn)模糊匹配查詢方案

    本文探討了使用Redis進(jìn)行高效模糊查詢的設(shè)計(jì)與實(shí)現(xiàn),包括利用Hash表存儲(chǔ)數(shù)據(jù)、通過(guò)hscan命令進(jìn)行安全無(wú)公害的模糊搜索,以及特殊字符處理策略,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-09-09
  • redis刪除key下所有value步驟詳解

    redis刪除key下所有value步驟詳解

    在使用Redis時(shí),經(jīng)常需要?jiǎng)h除某個(gè)key下的所有value,本文就來(lái)詳細(xì)的介紹一下redis刪除key下所有value步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Redis Template使用詳解示例教程

    Redis Template使用詳解示例教程

    RedisTemplate的底層通過(guò)RedisConnectionFactory對(duì)多種Redis驅(qū)動(dòng)進(jìn)行集成,上層通過(guò)RedisOperations提供豐富的API,并結(jié)合Spring基于泛型的bean注入,為開發(fā)提供了極大的便利,這篇文章主要介紹了Redis Template使用詳解示例教程,需要的朋友可以參考下
    2023-11-11
  • Redis初識(shí)、Redis的安裝與啟動(dòng)、Redis命令及Java客戶端詳解

    Redis初識(shí)、Redis的安裝與啟動(dòng)、Redis命令及Java客戶端詳解

    Redis作為當(dāng)前最流行的內(nèi)存數(shù)據(jù)庫(kù)之一,以其高性能、豐富的數(shù)據(jù)結(jié)構(gòu)和靈活的持久化機(jī)制,廣泛應(yīng)用于緩存、消息隊(duì)列、分布式鎖等場(chǎng)景,這篇文章主要介紹了Redis初識(shí)、Redis的安裝與啟動(dòng)、Redis命令及Java客戶端的相關(guān)資料,需要的朋友可以參考下
    2026-05-05

最新評(píng)論

桐乡市| 黄浦区| 邵东县| 新昌县| 陇南市| 松江区| 偏关县| 荥阳市| 荣成市| 陆河县| 渭源县| 宜川县| 基隆市| 平泉县| 静乐县| 青龙| 泗水县| 鲁山县| 安化县| 佛山市| 屏山县| 威远县| 双桥区| 平乡县| 手游| 怀来县| 云龙县| 阳城县| 准格尔旗| 仙游县| 花莲县| 会东县| 南充市| 漳浦县| 象山县| 新和县| 遂昌县| 阳江市| 香格里拉县| 隆昌县| 曲靖市|