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

Redis字符串原理的深入理解

 更新時(shí)間:2019年06月03日 10:16:31   作者:YangSir  
這篇文章主要給大家介紹了關(guān)于Redis字符串原理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

來(lái)掘進(jìn)都有兩年多了一直當(dāng)個(gè)小透明,今天終于發(fā)一次文章了.

最近在看 Redis,感覺(jué)收獲很多,寫(xiě)篇博客記錄一下.

Redis 有五種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu):string,list,set,zset,hash.其中 string是最最最簡(jiǎn)單的也是最常用的.這個(gè)數(shù)據(jù)類(lèi)型雖然簡(jiǎn)單但是內(nèi)部的結(jié)構(gòu)設(shè)計(jì)卻很是精致.

基本介紹

相比于 Java,在 Redis 中 string 是可以修改的,是動(dòng)態(tài)字符串(Simple Dynamic String 簡(jiǎn)稱(chēng) SDS)他的內(nèi)部結(jié)構(gòu)更像是一個(gè) ArrayList,維護(hù)一個(gè)字節(jié)數(shù)組并預(yù)分配冗余空間以減少內(nèi)存的頻繁分配.當(dāng)字符串的長(zhǎng)度小于 1MB時(shí),每次擴(kuò)容都是加倍現(xiàn)有的空間,如果字符串長(zhǎng)度超過(guò) 1MB 時(shí),每次擴(kuò)容時(shí)只會(huì)擴(kuò)展 1MB 的空間.

ps:字符串長(zhǎng)度為最大長(zhǎng)度 512MB.

> set name test
OK
> get name
"test"
> mset name1 test1 name2 test2
OK
> mget name1 name2
1) "test1"
2) "test2"
> del name
(integer) 1

上面是字符串的基本操作 命令mset 和 mget 可以對(duì)多個(gè)字符串讀寫(xiě) 節(jié)省網(wǎng)絡(luò)開(kāi)銷(xiāo)

不僅如此redis 的字符串還可以用來(lái)儲(chǔ)存整數(shù)(更不像Java 的字符串了),并且可以自增操作.字符串保存整數(shù)類(lèi)型的的范圍在 至
如果保存的數(shù)大于這個(gè)取值范圍就會(huì)變成普通字符類(lèi)型 無(wú)法自增操作.這將由字符串編碼格式?jīng)Q定.

字符串由多個(gè)字節(jié)組成,每個(gè)字節(jié)有 8bit.這樣的數(shù)據(jù)結(jié)構(gòu)還可以當(dāng)做 bitmap 去使用.

> set foo 1
OK
> get foo 
"1"
> incr foo
(integer) 2
> get foo
"2"

內(nèi)部原理

基本實(shí)現(xiàn)

上圖所示為字符串的基本結(jié)構(gòu),其中 content 里面保存的是字符串內(nèi)容,和 c 一樣用 0x\0作為結(jié)束字符.這個(gè)結(jié)束字符不會(huì)被計(jì)算len 中.代碼如下:

struct SDS{
  T capacity;		//數(shù)組容量
  T len;			//實(shí)際長(zhǎng)度
  byte flages;	//標(biāo)志位,低三位表示類(lèi)型
  byte[] content;	//數(shù)組內(nèi)容
}

可以看到 capacity和len 都是泛型,為什么不直接使用 int 呢?因?yàn)?Redis 內(nèi)部做了很多優(yōu)化,為了減少內(nèi)存的使用不同長(zhǎng)度的字符串會(huì)使用不同的數(shù)據(jù)類(lèi)型去表示.并且在創(chuàng)建字符串的時(shí)候 len 會(huì)和 capacity 一樣大,沒(méi)有冗余的空間,因?yàn)樾薷淖址膱?chǎng)景很少.(Redis 真的將內(nèi)存優(yōu)化到了極致)

編碼格式

Redis 字符串編碼格式有這么幾種:int 編碼、embstr編碼和raw 編碼 下面就詳細(xì)介紹下這幾種編碼的區(qū)別.

在這之前先要說(shuō)說(shuō)RedisObject. Redis 的對(duì)象頭,所有的 Redis 對(duì)象都有下面這個(gè)頭部結(jié)構(gòu).

struct RedisObject{
  int4 type;		//數(shù)據(jù)類(lèi)型 5 種
  int4 encoding;	//鍵值內(nèi)部編碼格式 int 或 embstr 等等
  int24 lru;		// 當(dāng)內(nèi)存超限時(shí)采用LRU算法清除內(nèi)存中的對(duì)象
  
  int32 refcount;	//改鍵值被引用的數(shù)量
  void *ptr;		//對(duì)象內(nèi)容
}

int 編碼

當(dāng)儲(chǔ)存的值是64 位有符號(hào)整數(shù)類(lèi)型的時(shí)候?qū)?huì)采用 int  編碼,這時(shí)可以使用鍵值自增操作.Redis 在啟動(dòng)時(shí)會(huì)建立1w 個(gè)redisObject共享對(duì)象下文會(huì)講到,值在[0,1000)之間.如果存入整數(shù)的值在[0,1000)中Redis將不會(huì)創(chuàng)建新的對(duì)象,而是直接指向共享對(duì)象,鍵值不額外占用空間.

使用 object encoding命令可以查看編碼格式 使用 debug object命令可以查看更多信息

> set foo 1
OK
> object encoding foo
"int"
> set foo2 1
OK
> debug object foo
Value at:0x7f44b020aca0 refcount:2147483647 encoding:int serializedlength:2 lru:14691591 lru_seconds_idle:72588
> debug object foo2
Value at:0x7f44b020aca0 refcount:2147483647 encoding:int serializedlength:2 lru:14691591 lru_seconds_idle:72594

可以看到 foo 和 foo2  都在0x7f44b020aca0這里指向的是同一個(gè)對(duì)象

embstr 編碼

當(dāng)存儲(chǔ)的字符串長(zhǎng)度較短時(shí)(len<=44 字節(jié)),Redis將會(huì)采用 embstr 編碼.embstr 即embedded string 嵌入式的字符串.將SDS結(jié)構(gòu)體嵌入RedisObject對(duì)象中, 使用 malloc 方法一次分配內(nèi)存地址是連續(xù)的.

如圖所示:

raw 編碼

當(dāng)存儲(chǔ)的字符串長(zhǎng)度較長(zhǎng)時(shí)(len>44 字節(jié)),Redis 將會(huì)采用 raw 編碼,和 embstr 最大的區(qū)別就是 RedisObject 和 SDS 不在一起了,內(nèi)存地址不再連續(xù)了.

如圖所示:

思考

為什么字符串會(huì)有兩種格式 embstr 和格式和 raw分界線是 44 個(gè)字節(jié)?

Redis 默認(rèn)的內(nèi)存分配器jemalloc分配內(nèi)存大小的單位是次方,為了容納一個(gè)完整的 embstr 對(duì)象,最少會(huì)分配 32 字節(jié)的空間,再長(zhǎng)些就是 64 字節(jié),再之后就認(rèn)為這是一個(gè)大字符串不適合用 embstr 存儲(chǔ),而改用 raw 編碼了.

那么問(wèn)題來(lái)了,64 字節(jié)的空間字符串長(zhǎng)度是多少呢?答案就是 44 字節(jié).

下圖中 content 的長(zhǎng)度為 45 字節(jié)減去結(jié)尾的 0x\0,就剩下 44 字節(jié)了.


總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 淺談Redis位圖(Bitmap)及Redis二進(jìn)制中的問(wèn)題

    淺談Redis位圖(Bitmap)及Redis二進(jìn)制中的問(wèn)題

    這篇文章主要介紹了Redis位圖(Bitmap)及Redis二進(jìn)制中的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • redis刪除hash的實(shí)現(xiàn)方式

    redis刪除hash的實(shí)現(xiàn)方式

    這篇文章主要介紹了redis刪除hash的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Redis中ServiceStack.Redis和StackExchange.Redis區(qū)別詳解

    Redis中ServiceStack.Redis和StackExchange.Redis區(qū)別詳解

    本文主要介紹了Redis中ServiceStack.Redis和StackExchange.Redis區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 淺談Redis的事件驅(qū)動(dòng)模型

    淺談Redis的事件驅(qū)動(dòng)模型

    本文主要介紹了淺談Redis的事件驅(qū)動(dòng)模型,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Redis key命令key的儲(chǔ)存方式

    Redis key命令key的儲(chǔ)存方式

    這篇文章主要介紹了Redis key命令key的儲(chǔ)存方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • CentOS 6.6下Redis安裝配置記錄

    CentOS 6.6下Redis安裝配置記錄

    這篇文章主要介紹了CentOS 6.6下Redis安裝配置記錄,本文給出了安裝需要的支持環(huán)境、安裝redis、測(cè)試Redis、配置redis等步驟,需要的朋友可以參考下
    2015-03-03
  • 聊聊使用RedisTemplat實(shí)現(xiàn)簡(jiǎn)單的分布式鎖的問(wèn)題

    聊聊使用RedisTemplat實(shí)現(xiàn)簡(jiǎn)單的分布式鎖的問(wèn)題

    這篇文章主要介紹了使用RedisTemplat實(shí)現(xiàn)簡(jiǎn)單的分布式鎖問(wèn)題,文中給大家介紹在SpringBootTest中編寫(xiě)測(cè)試模塊的詳細(xì)代碼,需要的朋友可以參考下
    2021-11-11
  • 詳解redis在微服務(wù)領(lǐng)域的貢獻(xiàn)

    詳解redis在微服務(wù)領(lǐng)域的貢獻(xiàn)

    本文以dubbo為例看下redis是如何利用自身特性來(lái)完成注冊(cè)中心的功能,對(duì)redis微服務(wù)相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-10-10
  • Redis消息隊(duì)列實(shí)現(xiàn)異步秒殺功能

    Redis消息隊(duì)列實(shí)現(xiàn)異步秒殺功能

    在高并發(fā)場(chǎng)景下,為了提高秒殺業(yè)務(wù)的性能,可將部分工作交給 Redis 處理,并通過(guò)異步方式執(zhí)行,Redis 提供了多種數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)消息隊(duì)列,總結(jié)三種,本文詳細(xì)介紹Redis消息隊(duì)列實(shí)現(xiàn)異步秒殺功能,感興趣的朋友一起看看吧
    2025-04-04
  • 詳解Redis復(fù)制原理

    詳解Redis復(fù)制原理

    與大多數(shù)db一樣,Redis也提供了復(fù)制機(jī)制,以滿足故障恢復(fù)和負(fù)載均衡等需求。復(fù)制也是Redis高可用的基礎(chǔ),哨兵和集群都是建立在復(fù)制基礎(chǔ)上實(shí)現(xiàn)高可用的。復(fù)制不僅提高了整個(gè)系統(tǒng)的容錯(cuò)能力,還可以水平擴(kuò)展,通過(guò)增加多個(gè)Redis只讀從實(shí)例來(lái)減輕主實(shí)例的壓力。
    2021-06-06

最新評(píng)論

嘉义市| 岳阳市| 那曲县| 萨迦县| 苗栗县| 岳阳市| 陆良县| 承德县| 西峡县| 岫岩| 夏邑县| 喜德县| 临西县| 武川县| 昆山市| 台州市| 商丘市| 临武县| 南江县| 博罗县| 确山县| 西丰县| 策勒县| 洱源县| 永州市| 体育| 荣昌县| 衢州市| 和静县| 尼木县| 汤阴县| 巴青县| 西乌珠穆沁旗| 全州县| 新营市| 江永县| 申扎县| 长春市| 法库县| 舒兰市| 桓台县|