亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Redis字符串原理的深入理解

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

前言

來掘進都有兩年多了一直當個小透明,今天終于發(fā)一次文章了.

最近在看 Redis,感覺收獲很多,寫篇博客記錄一下.

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

基本介紹

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

ps:字符串長度為最大長度 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 可以對多個字符串讀寫 節(jié)省網(wǎng)絡(luò)開銷

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

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

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

內(nèi)部原理

基本實現(xiàn)

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

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

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

編碼格式

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

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

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

int 編碼

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

使用 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這里指向的是同一個對象

embstr 編碼

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

如圖所示:

raw 編碼

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

如圖所示:

思考

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

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

那么問題來了,64 字節(jié)的空間字符串長度是多少呢?答案就是 44 字節(jié).

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


總結(jié)

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

相關(guān)文章

  • Redis Template使用詳解示例教程

    Redis Template使用詳解示例教程

    RedisTemplate的底層通過RedisConnectionFactory對多種Redis驅(qū)動進行集成,上層通過RedisOperations提供豐富的API,并結(jié)合Spring基于泛型的bean注入,為開發(fā)提供了極大的便利,這篇文章主要介紹了Redis Template使用詳解示例教程,需要的朋友可以參考下
    2023-11-11
  • Redisson實現(xiàn)分布式鎖、鎖續(xù)約的案例

    Redisson實現(xiàn)分布式鎖、鎖續(xù)約的案例

    這篇文章主要介紹了Redisson如何實現(xiàn)分布式鎖、鎖續(xù)約,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Redis批量刪除KEY的方法

    Redis批量刪除KEY的方法

    這篇文章主要介紹了Redis批量刪除KEY的方法,本文借助了Linux xargs命令實現(xiàn),需要的朋友可以參考下
    2014-11-11
  • Redis性能監(jiān)控的實現(xiàn)

    Redis性能監(jiān)控的實現(xiàn)

    本文使用 redis_exporter + prometheus +grafana 實現(xiàn)對Redis服務(wù)進行監(jiān)控,原因:成本低,人工干預少,感興趣的可以了解一下
    2021-07-07
  • Redis 操作多個數(shù)據(jù)庫的配置的方法實現(xiàn)

    Redis 操作多個數(shù)據(jù)庫的配置的方法實現(xiàn)

    本文主要介紹了Redis 操作多個數(shù)據(jù)庫的配置的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Windows下Redis的安裝使用教程

    Windows下Redis的安裝使用教程

    這篇文章主要以圖文結(jié)合的方式為大家詳細介紹了Windows下Redis的安裝使用,Redis的出現(xiàn),很大程度補償了memcached這類key/value存儲的不足,在部分場合可以對關(guān)系數(shù)據(jù)庫起到很好的補充作用,對Redis感興趣的小伙伴們可以參考一下
    2016-05-05
  • Redis 刪除策略的三種實現(xiàn)

    Redis 刪除策略的三種實現(xiàn)

    本文主要介紹了Redis 刪除策略的三種實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • redis發(fā)布訂閱_動力節(jié)點Java學院整理

    redis發(fā)布訂閱_動力節(jié)點Java學院整理

    這篇文章主要介紹了redis發(fā)布訂閱,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Redis使用Lua腳本命令詳解

    Redis使用Lua腳本命令詳解

    這篇文章主要為大家介紹了Redis使用Lua腳本命令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Redis高可用之持久化

    Redis高可用之持久化

    在web服務(wù)器中,高可用是指服務(wù)器可以正常訪問的時間,衡量的標準是在多長時間內(nèi)可以提供正常服務(wù)(99.9%、99.99%、99.999%等等),Redis中,實現(xiàn)高可用的技術(shù)主要包括持久化、主從復制、哨兵和cluster集群,感興趣的同學可以閱讀本文
    2023-04-04

最新評論