自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

原來Redis的五種數(shù)據(jù)類型數(shù)底層結(jié)構(gòu)是這樣的

存儲 存儲軟件 Redis
在Redis中會涉及很多數(shù)據(jù)結(jié)構(gòu),比如SDS,雙向鏈表、字典、壓縮列表、整數(shù)集合等等。Redis會基于這些數(shù)據(jù)結(jié)構(gòu)自定義一個對象系統(tǒng),而且自定義的對象系統(tǒng)有很多好處。

 在Redis中會涉及很多數(shù)據(jù)結(jié)構(gòu),比如SDS,雙向鏈表、字典、壓縮列表、整數(shù)集合等等。Redis會基于這些數(shù)據(jù)結(jié)構(gòu)自定義一個對象系統(tǒng),而且自定義的對象系統(tǒng)有很多好處。

[[285933]]

通過對以下的Redis對象系統(tǒng)的學(xué)習(xí),可以了解Redis設(shè)計原理以及初衷,為了我們在使用Redis的時候,更加能夠理解到其原理和定位問題。

Redis 對象

Redis基于上述的數(shù)據(jù)結(jié)構(gòu)自定義一個Object 系統(tǒng),Object結(jié)構(gòu):

  1. redisObject結(jié)構(gòu): 
  2.      typedef struct redisObject{ 
  3.     //類型 
  4.     unsigned type:4; 
  5.     //編碼 
  6.     unsigned encoding:4; 
  7.     //指向底層實現(xiàn)數(shù)據(jù)結(jié)構(gòu)的指針 
  8.     void *ptr; 
  9.     …..  

Object 系統(tǒng)包含五種Object:

  • String:字符串對象
  • List:列表對象
  • Hash:哈希對象
  • Set:集合對象
  • ZSet:有序集合

Redis使用對象來表示數(shù)據(jù)庫中的鍵和值,即每新建一個鍵值對,至少創(chuàng)建有兩個對象,而且使用對象的具有以下好處:

1. redis可以在執(zhí)行命令前會根據(jù)對象的類型判斷一個對象是否可以執(zhí)行給定的命令

2. 針對不同的使用場景,為對象設(shè)置不同的數(shù)據(jù)結(jié)構(gòu)實現(xiàn),從而優(yōu)化對象的不同場景夏的使用效率

3. 對象系統(tǒng)還可以基于引用計數(shù)計數(shù)的內(nèi)存回收機制,自動釋放對象所占用的內(nèi)存,或者還可以讓多個數(shù)據(jù)庫鍵共享同一個對象來節(jié)約內(nèi)存。

4. redis對象帶有訪問時間記錄信息,使用該信息可以進行優(yōu)化空轉(zhuǎn)時長較大的key,進行刪除!

對象的ptr指針指向?qū)ο蟮牡讓蝇F(xiàn)實數(shù)據(jù)結(jié)構(gòu),而這些數(shù)據(jù)結(jié)構(gòu)由對象的encoding屬性決定,對應(yīng)關(guān)系:

每種Object對象至少有兩種不同的編碼,對應(yīng)關(guān)系:

String對象

字符串對象編碼可以int 、raw或者embstr,如果保存的值為整數(shù)值且這個值可以用long類型表示,使用int編碼,其他編碼類似。

比如:int編碼的String Object

  1. redis> set number 520 
  2.  ok 
  3.  redis> OBJECT ENCODING number 
  4. "int" 

String Object結(jié)構(gòu):

String 對象之間的編碼轉(zhuǎn)換

int編碼的字符串對象和embstr編碼的字符串對象在條件滿足的情況下,會被轉(zhuǎn)換為raw編碼的字符串對象。

比如:對int編碼的字符串對象進行append命令時,就會使得原來是int變?yōu)閞aw編碼字符串

List對象

list對象可以為ziplist或者為linkedlist,對應(yīng)底層實現(xiàn)ziplist為壓縮列表,linkedlist為雙向列表。

  1. Redis>RPUSH numbers “Ccww” 520 1 

用ziplist編碼的List對象結(jié)構(gòu):


用linkedlist編碼的List對象結(jié)構(gòu):

List對象的編碼轉(zhuǎn)換:

當list對象可以同時滿足以下兩個條件時,list對象使用的是ziplist編碼:

1. list對象保存的所有字符串元素的長度都小于64字節(jié)

2. list對象保存的元素數(shù)量小于512個,

不能滿足這兩個條件的list對象需要使用linkedlist編碼。

Hash對象

Hash對象的編碼可以是ziplist或者hashtable

其中,ziplist底層使用壓縮列表實現(xiàn):

  • 保存同一鍵值對的兩個節(jié)點緊靠相鄰,鍵key在前,值vaule在后
  • 先保存的鍵值對在壓縮列表的表頭方向,后來在表尾方向

hashtable底層使用字典實現(xiàn),Hash對象種的每個鍵值對都使用一個字典鍵值對保存:

  • 字典的鍵為字符串對象,保存鍵key
  • 字典的值也為字符串對象,保存鍵值對的值

比如:HSET命令

  1. redis>HSET author name  "Ccww" 
  2. (integer
  3.  
  4. redis>HSET author age  18 
  5. (integer
  6.  
  7. redis>HSET author sex  "male" 
  8. (integer

ziplist的底層結(jié)構(gòu):

 


hashtable底層結(jié)構(gòu):

 


 

Hash對象的編碼轉(zhuǎn)換:

當list對象可以同時滿足以下兩個條件時,list對象使用的是ziplist編碼:

1. list對象保存的所有字符串元素的長度都小于64字節(jié)

2. list對象保存的元素數(shù)量小于512個,

不能滿足這兩個條件的hash對象需要使用hashtable編碼

Note:這兩個條件的上限值是可以修改的,可查看配置文件hash-max-zaiplist-value和hash-max-ziplist-entries

Set對象:

Set對象的編碼可以為intset或者hashtable

  • intset編碼:使用整數(shù)集合作為底層實現(xiàn),set對象包含的所有元素都被保存在intset整數(shù)集合里面
  • hashtable編碼:使用字典作為底層實現(xiàn),字典鍵key包含一個set元素,而字典的值則都為null

inset編碼Set對象結(jié)構(gòu):

  1. redis> SAD number  1 3 5 

 

hashtable編碼Set對象結(jié)構(gòu):

  1. redis> SAD Dfruits  “apple”  "banana" " cherry" 

 


 

Set對象的編碼轉(zhuǎn)換:

使用intset編碼:

1. set對象保存的所有元素都是整數(shù)值

2. set對象保存的元素數(shù)量不超過512個

不能滿足這兩個條件的Set對象使用hashtable編碼

ZSet對象

ZSet對象的編碼 可以為ziplist或者skiplist

ziplist編碼,每個集合元素使用相鄰的兩個壓縮列表節(jié)點保存,一個保存元素成員,一個保存元素的分值,然后根據(jù)分數(shù)進行從小到大排序。

ziplist編碼的ZSet對象結(jié)構(gòu):

  1. Redis>ZADD price 8.5 apple 5.0 banana 6.0 cherry 

skiplist編碼的ZSet對象使用了zset結(jié)構(gòu),包含一個字典和一個跳躍表

 

  1. Type struct zset{ 
  2.  
  3.     Zskiplist *zsl; 
  4.     dict *dict; 
  5.     ... 

skiplist編碼的ZSet對象結(jié)構(gòu)

ZSet對象的編碼轉(zhuǎn)換

當ZSet對象同時滿足以下兩個條件時,對象使用ziplist編碼

1. 有序集合保存的元素數(shù)量小于128個

2. 有序集合保存的所有元素的長度都小于64字節(jié)

不能滿足以上兩個條件的有序集合對象將使用skiplist編碼。

 

Note:可以通過配置文件中zset-max-ziplist-entries和zset-max-ziplist-vaule

 

責任編輯:武曉燕 來源: Ccww筆記
相關(guān)推薦

2019-10-29 08:59:16

Redis底層數(shù)據(jù)

2024-08-02 13:10:25

2022-05-23 08:19:19

Redis數(shù)據(jù)結(jié)構(gòu)內(nèi)存

2023-03-06 08:40:43

RedisListJava

2021-03-12 08:02:34

Redis數(shù)據(jù)類型.

2025-01-13 06:10:00

2020-06-08 17:35:27

Redis集群互聯(lián)網(wǎng)

2010-05-26 17:05:48

MySQL數(shù)據(jù)類型

2024-11-04 06:20:00

Redis單線程

2019-08-12 15:40:26

Redis數(shù)據(jù)庫數(shù)據(jù)類型

2021-03-03 00:01:30

Redis數(shù)據(jù)結(jié)雙向鏈表

2011-03-31 15:53:39

設(shè)計視圖Access

2023-07-04 08:41:08

Redis數(shù)據(jù)類型

2016-08-01 10:42:58

數(shù)據(jù)類型WebWordPress

2014-04-25 09:38:08

大數(shù)據(jù)

2020-08-31 14:30:47

Redis數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)庫

2023-04-28 15:05:25

React軟件項目可維護性

2021-11-08 09:33:07

JS 字符串數(shù)據(jù)類型

2020-03-20 10:47:51

Redis數(shù)據(jù)庫字符串

2023-05-26 00:02:31

SDS數(shù)據(jù)編碼
點贊
收藏

51CTO技術(shù)棧公眾號