国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

淺析 Redis 中 String 數據類型及其底層編碼

數據庫 Redis
如果存儲在 SDS 中的數據小于等于 44 字節,則會采用 EMBSTR 編碼,此時 **RedisObject 與 SDS 是一段連續空間。而不是像 RAW 的編碼方式一樣,由 ptr 指向另外一片空間,**申請內存時只需要調用一次內存分配函數,效率更高。

從 RedisObject 說起

在 Redis 中,任意數據類型的鍵和值都會被封裝為一個 RedisObject ,也叫做Redis對象,源碼如下

我們來看一下這個結構體中的成員變量分別代表什么:

  • unsigned type:4 :對象類型,分別是 string hash list set zset ,占 4 個 bit 位,如下所示
  • #define OBJ_STRING 0 /* String object. */ #define OBJ_LIST 1 /* List object. */ #define OBJ_SET 2 /* Set object. */ #define OBJ_ZSET 3 /* Sorted set object. */ #define OBJ_HASH 4 /* Hash object. */
  • unsigned encoding:4: 底層編碼方式,共有 11 種,4 個 bit 位
  • unsigned lru:LRU_BITS :該對象最后一次被訪問的時間,占 24 個 bit ,在 Redis 內存回收中起到關鍵作用
  • int refcount :對象引用計數器,計數器為 0 則說明對象無人引用,可以被回收
  • void *ptr:指針,指向存放實際數據的空間

我們注意到,在 Redis 中有 5 中數據結構(用戶使用的),但在底層卻有 11 種編碼方式,Redis 會根據存儲的數據類型、存儲數據的大小,選擇不同的編碼方式,以獲得最優的性能。一種數據結構會對應多種數據結構,如下表所示。

數據類型

編碼方式

OBJ_STRING

int、embstr、raw

OBJ_LIST

LinkedList和ZipList(3.2以前)、QuickList(3.2以后)

OBJ_SET

intset、HT

OBJ_ZSET

ZipList、HT、SkipList

OBJ_HASH

ZipList、HT

下面,我們現在介紹以下 String 數據類型,及其底層的編碼方式。

Redis 數據結構 -- String

String 類型的基本介紹和命令

String 類型,也就是字符串類型,是Redis中最簡單的存儲類型。它可以存儲字符串、整數或浮點數。下面是一些 String 類型常用的命令

1.SET key value:設置指定 key 的值為指定的字符串或數字。

2.GET key:獲取指定 key 的值。

3.本地虛擬機redis:0>set key01 value01 "OK" 本地虛擬機redis:0>get key01 "value01"

4.INCR key:將指定 key 的值加 1,如果該 key 不存在,則先將其設置為 0,再進行加 1 操作。

5.DECR key:將指定 key 的值減 1,如果該 key 不存在,則先將其設置為 0,再進行減 1 操作。

6.INCRBY key increment:將指定 key 的值增加指定的增量。

7.DECRBY key decrement:將指定 key 的值減少指定的減量。

8.APPEND key value:將指定的值追加到指定 key 的值的末尾。

9.STRLEN key:返回指定 key 的值的長度。

10.GETRANGE key start end:返回指定 key 的值的子字符串,根據起始位置和結束位置指定。

11.SETRANGE key offset value:將指定 key 的值從指定偏移位置開始,替換為指定的字符串。

12.MSET key1 value1 [key2 value2 ...]:同時設置多個 key 的值。(”[ ]” 中括號內表示可選)

13.MGET key1 [key2 ...]:獲取多個 key 的值。

這里僅給出 SET、GET 命令,其他的請自行測試。這些命令只是 Redis String 類型命令的一小部分,Redis 還提供了其他更多的命令來處理 String 類型的數據。你可以參考 Redis 官方文檔以獲取完整的命令列表和詳細的命令說明。

String 類型的底層實現

在 Redis 中,String 類型的數據結構并不是采用 C 語言中自帶的字符串類型,C 語言中的數據結構存在很多問題,比如:

  • 獲取字符串長度的需要通過運算
  • 非二進制安全
  • 不可修改

因此,String 在 Redis 中有其他三種編碼方式: int、embstr、raw 。其中, raw 和 embstr 類型,都是基于動態字符串(SDS)實現的,下面我們先來看看動態字符串的結構是怎樣的。

動態字符串(SDS)

動態字符串的結構體如下

這里解釋一下結構體中各個成員變量的作用:

  • len:已經保存的字符串字節數,不包含結束標示
  • alloc:申請的總的字節數,不包含結束標示
  • flags:不同的 SDS 的頭類型,用來控制 SDS 的頭大小
  • buf[]:真正存儲數據

我們先來聊一下 flags 這個成員變量。在 redis 中其實定義了 5 個 SDS結構體(其中 hisdshdr5 已經棄用)如圖所示。他們之間的主要區別在于 len 和 alloc 的長度不同。

在 redis 中,為了盡可能地節省內存空間,當字符串長度在不同的區間時,會選擇不同的結構體,例如:

  • 當字符串長度在 0~255 個字節之間時,會選擇 hisdshdr8 ,這樣一來,用于表示字符串字節數和申請的總字節數的空間就會被大大節省,以此類推。

例如,一個包含字符串“name”的 sds 結構如下:

SDS之所以叫做動態字符串,是因為它具備動態擴容的能力,例如一個內容為 “hello” 的 SDS,假如我們要給這個 SDS 追加一段字符串 ”world” ,這里首先會申請新內存空間:

  • 如果新字符串小于1M,則新空間為擴展后字符串長度的兩倍+1
  • 如果新字符串大于1M,則新空間為擴展后字符串長度+1M+1。

這種機制稱為內存預分配。內存預分配可以減少進行內存重新分配的開銷,減少內存碎片,使得 redis 的性能得到提高,空間利用率也得到提高。

String 的三種編碼方式

RAW

  • raw 是 string 的基本編碼方式,基于簡單動態字符串(SDS)實現,存儲上限為512mb。當一個字符串采用 raw 的編碼方式的時候,它的結構如圖所示。

EMBSTR

  • 如果存儲在 SDS 中的數據小于等于 44 字節,則會采用 EMBSTR 編碼,此時 **RedisObject 與 SDS 是一段連續空間。而不是像 RAW 的編碼方式一樣,由 ptr 指向另外一片空間,**申請內存時只需要調用一次內存分配函數,效率更高。結構如下,

為什么是 44 字節?Redis 默認的內存分配器 jemalloc 分配內存大小的單位是 $2^n$ ,因此,如果分配的空間大小為 2、4 、8 … 字節等 $2^n$ 字節,就不會產生內存碎片。

而 redisObject 和 hisdshdr8 中 len alloc flags三個成員變量加起來剛剛好是 16 + 4 = 20 字節,如果 char[] (數據大小)的大小為 44 字節時,加起來剛剛好是 64 字節,也即 26 不會產生內存碎片。

  • RAW 和 EMBSTR 的編碼演示

INT

  • 如果存儲的字符串是整數值,并且大小在 LONG MAX 范圍內,則會采用 INT 編碼
  • 直接將數據保存在 RedisObject 的 ptr 指針位置(剛好8字節),不再需要SDS了。

  • INT 編碼演示

寫在最后:在使用 string 類型時,盡可能讓其長度小于 44 字節,或者使用整數表示,使其使用 EMBSTR 和 INT 編碼

責任編輯:武曉燕 來源: 今日頭條
點贊
收藏

51CTO技術棧公眾號

91麻豆福利精品推荐| 黄色网址在线免费看| 三级不卡在线观看| 好吊色欧美一区二区三区| 蜜桃一区二区三区四区| 欧美国产在线电影| 国产激情视频在线观看| 秋霞成人午夜伦在线观看| 日韩av观看网址| 另类专区亚洲| 色噜噜偷拍精品综合在线| 国产最新在线| 午夜欧美在线一二页| 久久久久久久久久网| 国产精品污www在线观看| 日韩区一区二| 痴汉一区二区三区| 成人深夜福利app| 青草热久免费精品视频| 国产图片一区| 亚洲精品福利视频网站| 三级网站视频在在线播放| 亚洲精品视频网上网址在线观看| 黄瓜视频免费观看在线观看www| 国产免费不卡| 欧美一区二区视频在线| 91精品国产综合久久久久久漫画| 男人天堂2020| 国产精品久久久久久久久妇女| 爽爽淫人综合网网站| 宅男噜噜噜66国产免费观看| 亚洲精品日韩一| 日本欧美电影在线观看| 欧美裸体男粗大视频在线观看| 欧美日本国产| 免费一级特黄毛片| 天堂av最新在线| 中文日韩在线观看| 懂色av中文一区二区三区| 日本欧美日韩| 中文字幕巨乱亚洲| www.豆豆成人网.com| 在线免费观看h| 一区二区三区免费看| 国产一区二区三区四区二区| 欧美一区二区三区的| 超碰成人免费| 欧美高清中文字幕| 国产精品资源站在线| 日韩精品福利| 久久久久在线观看| 国产一区二区三区在线观看免费视频| 在线免费观看黄| 欧洲一区二区av| 女人高潮特级毛片| 欧美成人免费va影院高清| 蜜桃av一区二区| 欧美性videos| 91系列在线播放| 亚洲最新视频在线观看| yy6080久久伦理一区二区| 中文精品99久久国产香蕉| 日韩不卡一二三区| 亚洲免费av一区二区| 91久久嫩草影院一区二区| 亚洲精选视频在线| 国产精品zjzjzj在线观看| 日韩在线综合网| 在线成人午夜影院| 午夜日韩电影| 国模精品一区二区| 日韩电影中文 亚洲精品乱码| 人人草在线视频| 欧美日韩另类综合| 精品国产乱码久久久久久浪潮| 在线国产日韩| 97在线国产视频| 亚洲欧美日韩第一区| 国产午夜精品视频一区二区三区| 国产精品迅雷| 在线国产伦理一区| 制服丝袜亚洲色图| 蜜桃视频m3u8在线观看| 日本高清久久一区二区三区| 色999日韩国产欧美一区二区| 日韩毛片视频| 在线看黄的网站| 国产精品最新在线观看| 国产精品av一区二区| 色播色播色播色播色播在线| 国产精品一二三视频| 亚洲欧洲精品成人久久奇米网| 久久97久久97精品免视看秋霞| 先锋影音资源999| 国产精品都在这里| 色综合天天综合给合国产| av亚洲免费| 在线不卡日本| 亚洲美女自拍视频| 波多野结衣中文字幕一区 | 国产精品对白久久久久粗| a级黄色一级片| 国产视频在线观看一区二区| www.色精品| 美国十次av导航亚洲入口| 色一情一乱一伦一区二区三区| 亚洲欧洲一二三| 久久午夜电影网| 激情综合激情| 日韩高清中文字幕一区二区| 中文字幕亚洲一区二区三区| 国产精品一区在线观看你懂的| 筱崎爱全乳无删减在线观看| www.激情网| 欧美激情久久久久久| 亚洲精品中文在线| 一区二区三区四区电影| 在线看一级片| 日本视频精品一区| 欧美激情videos| 一本色道久久综合狠狠躁的推荐| 成人免费av资源| 精品国产123区| 美女100%一区| 成人国产视频在线| 国产在线视频一区| 欧美成人伊人久久综合网| 视频精品导航| xxxx69视频| 欧美精品欧美精品| www.日韩欧美| 亚洲18色成人| 可以免费看不卡的av网站| 4438五月综合| 白虎精品一区| 亚洲午夜激情| 7777精品视频| 欧美一区二区私人影院日本| 91小视频免费观看| 中文字幕一区二区av| 国产羞羞视频在线播放| 无码人妻丰满熟妇区毛片| 91亚洲va在线va天堂va国| 欧美电影免费提供在线观看| 91久色porny| 日韩香蕉视频| 日韩亚洲一区在线| 88xx成人网| 国产人成网在线播放va免费| 午夜免费一区二区| 亚洲欧洲三级| 国产精品免费小视频| 久久人体大胆视频| 蜜桃视频免费观看一区| 亚洲专区**| 天天干天天操天天玩| 亚洲女在线观看| 色视频成人在线观看免| 91视频免费看| 免费网站黄在线观看| xxav视频| www.av91| 亚洲国产综合自拍| 成人免费淫片aa视频免费| 一本久久a久久免费精品不卡| 国产91精品入口| 色无极亚洲影院| 久久在线观看| 一区二区三区免费播放| 97久久精品国产| 亚洲国产高清自拍| 国内精品久久久久久久久电影网| 欧洲美女精品免费观看视频| 日本在线观看| 九色视频在线播放| 四虎精品一区二区永久在线观看| 青青草原av在线播放| 色姑娘综合网| 日韩jizzz| 99re国产| 91免费看网站| 国产精品美女在线观看| 国产精品老女人视频| 久久国产精品久久精品| 精品1区2区在线观看| 欧美美女一区二区| 91久久午夜| 综合久久婷婷| 成人影院在线| 久久密一区二区三区| 日韩最新在线| 一区二区三区四区在线看| 日本成在线观看| 99国产精品国产精品毛片| 日韩国产在线观看| 亚洲精品自拍动漫在线| 一区二区亚洲精品国产| 草草草视频在线观看| 毛片在线网站| 国产精品一色哟哟|