国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Redis核心數(shù)據(jù)結(jié)構(gòu)之壓縮列表(一)

這篇具有很好參考價(jià)值的文章主要介紹了Redis核心數(shù)據(jù)結(jié)構(gòu)之壓縮列表(一)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

壓縮列表

概述

壓縮列表(ziplist)是列表鍵和哈希鍵的底層實(shí)現(xiàn)之一。當(dāng)一個(gè)列表鍵只包含少量列表項(xiàng),并且每個(gè)列表項(xiàng)要么就是小整數(shù)值,要么就是長(zhǎng)度比較短的字符串,那么Redis就會(huì)使用壓縮列表來(lái)做列表鍵的底層實(shí)現(xiàn)。

例子

  • 例如,執(zhí)行以下命令將創(chuàng)建一個(gè)壓縮列表實(shí)現(xiàn)的列表鍵,列表鍵里面包含的都是1、3、5、10086這樣的小整數(shù)值,以及"hello"、"world"這樣的短字符串。另外,當(dāng)一個(gè)哈希鍵只包含少量鍵值對(duì),并且每個(gè)鍵值對(duì)的鍵和值要么就是小整數(shù)值,要么就是長(zhǎng)度比較短的字符串,那么Redis就會(huì)使用壓縮列表來(lái)做哈希鍵的底層實(shí)現(xiàn)。
127.0.0.1:6379> RPUSH lst 1 3 5 10086 "hello" "world"
(integer) 6
127.0.0.1:6379> OBJECT ENCODING lst
"ziplist"
127.0.0.1:6379>
  • 舉個(gè)例子,執(zhí)行以下命令將創(chuàng)建一個(gè)壓縮列表實(shí)現(xiàn)的哈希鍵:
    哈希鍵里面包含的所有鍵和值都是小整數(shù)值或者短字符串。
127.0.0.1:6379> HMSET profile  "name" "VinPink" "age" 28 "job" "Programmer"
OK
127.0.0.1:6379> OBJECT ENCODING profile
"ziplist"
127.0.0.1:6379>

壓縮列表的構(gòu)成

壓縮列表是Redis為了節(jié)約內(nèi)存而開(kāi)發(fā)的,是由一系列特殊編碼的連續(xù)內(nèi)存塊組成的順序型(sequential)數(shù)據(jù)結(jié)構(gòu)。一個(gè)壓縮列表可以包含任意多個(gè)節(jié)點(diǎn)(entry),每個(gè)節(jié)點(diǎn)可以保存一個(gè)字節(jié)數(shù)組或者一個(gè)整數(shù)值。
Redis核心數(shù)據(jù)結(jié)構(gòu)之壓縮列表(一),Redis,redis,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù)
Redis核心數(shù)據(jù)結(jié)構(gòu)之壓縮列表(一),Redis,redis,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù)

例子

Redis核心數(shù)據(jù)結(jié)構(gòu)之壓縮列表(一),Redis,redis,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù)

  • 1.列表zlbytes屬性的值為0x50(十進(jìn)制80),表示壓縮列表的總長(zhǎng)為80字節(jié)
  • 2列表zltail屬性的值為0x3c(十進(jìn)制60),這表示如果我們有一個(gè)指向壓縮
    列表起始地址的指針P,那么只要用指針P加上偏移量60,就可以計(jì)算出表尾節(jié)點(diǎn)entry3的地址
  • 3.列表zllen屬性為0x3(十進(jìn)制3),表示壓縮列表包含三個(gè)節(jié)點(diǎn)
    Redis核心數(shù)據(jù)結(jié)構(gòu)之壓縮列表(一),Redis,redis,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù)
  • 1.列表zlbytes屬性的值為0xd2(十進(jìn)制210),這表示壓縮列表的總長(zhǎng)為210字節(jié)
  • 2.列表zltail屬性的值為0xb3(十進(jìn)制179),這表示如果我們有一個(gè)指向壓縮列表起始地址的P,那么只要用指針P加上偏移量179,就可以計(jì)算出表尾節(jié)點(diǎn)entry5的地址
  • 3.列表zllen屬性的值為0x5(十進(jìn)制5),表示壓縮列表包含五個(gè)節(jié)點(diǎn)

壓縮列表節(jié)點(diǎn)的構(gòu)成

每個(gè)壓縮列表節(jié)點(diǎn)可以保存一個(gè)字節(jié)數(shù)組或者一個(gè)整數(shù)值,其中,字節(jié)數(shù)組可以是以下三種長(zhǎng)度之一:

  • 1.長(zhǎng)度小于等于63(2 ^ 6 - 1)字節(jié)的字節(jié)數(shù)組
  • 2.長(zhǎng)度小于等于16383(2 ^ 14 - 1)字節(jié)的字節(jié)數(shù)組
  • 3.長(zhǎng)度小于等于4294967295(2 ^ 32 - 1)字節(jié)的字節(jié)數(shù)組
    而整數(shù)值則可以是以下六種長(zhǎng)度之一:
  • 1.4位長(zhǎng),介于0至12之間的無(wú)符號(hào)整數(shù)
  • 2.1字節(jié)長(zhǎng)的有符號(hào)整數(shù)
  • 3.3字節(jié)長(zhǎng)的有符號(hào)整數(shù)
  • 4.int16_t類(lèi)型整數(shù)
  • 5.int32_t類(lèi)型整數(shù)
  • 6.int64_t類(lèi)型整數(shù)
    每個(gè)壓縮列表節(jié)點(diǎn)都由previous_entry_length、encoding、content三個(gè)部分組成
    Redis核心數(shù)據(jù)結(jié)構(gòu)之壓縮列表(一),Redis,redis,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù)

previous_entry_length

節(jié)點(diǎn)的previous_entry_length屬性以字節(jié)為單位,記錄了壓縮列表前一個(gè)節(jié)點(diǎn)的長(zhǎng)度。previous_entry_length屬性的長(zhǎng)度可以是1字節(jié)或者5字節(jié):
1.如果前一節(jié)點(diǎn)的長(zhǎng)度小于254字節(jié),那么previous_entry_length屬性的長(zhǎng)度為1字節(jié):前一節(jié)點(diǎn)的長(zhǎng)度保存在這一個(gè)字節(jié)里面
2.如果潛移節(jié)點(diǎn)的長(zhǎng)度大于等于254字節(jié),那么previous_entry_length屬性的長(zhǎng)度為5字節(jié):其中屬性的第一字節(jié)會(huì)被設(shè)置為0xFE(十進(jìn)制254),而之后的四個(gè)字節(jié)則用于保存前一節(jié)點(diǎn)的長(zhǎng)度

因?yàn)楣?jié)點(diǎn)的previous_entry_length屬性記錄了前一個(gè)節(jié)點(diǎn)的長(zhǎng)度,所以程序可以通過(guò)指針運(yùn)算,根據(jù)當(dāng)前節(jié)點(diǎn)的起始地址來(lái)計(jì)算出前一個(gè)節(jié)點(diǎn)的起始地址

例子

Redis核心數(shù)據(jù)結(jié)構(gòu)之壓縮列表(一),Redis,redis,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-840439.html

  • 圖中展示了一個(gè)包含一字節(jié)長(zhǎng)previous_entry_length屬性的壓縮列表節(jié)點(diǎn),屬性 的值為0x05,表示前一節(jié)點(diǎn)的長(zhǎng)度為5字節(jié)
    Redis核心數(shù)據(jù)結(jié)構(gòu)之壓縮列表(一),Redis,redis,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù)
  • 圖中展示了一個(gè)包含五字節(jié)長(zhǎng)previous_entry_length屬性的壓縮節(jié)點(diǎn),屬性的值為0xFE00002766,其中值的最高位0xFE表示這是一個(gè)五字節(jié)長(zhǎng)的previous_entry_length屬性,而之后的四字節(jié)0x00002766(十進(jìn)制10086)才是前一節(jié)點(diǎn)的實(shí)際長(zhǎng)度
    Redis核心數(shù)據(jù)結(jié)構(gòu)之壓縮列表(一),Redis,redis,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù)
  • 舉個(gè)例子,如果有一個(gè)指針當(dāng)前節(jié)點(diǎn)的起始地址的指針c,那么只要用指針c減去當(dāng)前節(jié)點(diǎn)previous_entry_length屬性的值,就可以得出一個(gè)指向前一個(gè)節(jié)點(diǎn)起始地址的指針p,如圖所示
    Redis核心數(shù)據(jù)結(jié)構(gòu)之壓縮列表(一),Redis,redis,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù)
  • 壓縮列表的從表尾向表頭遍歷操作就是使用這一原理實(shí)現(xiàn)的,只要擁有了一個(gè)指向某個(gè)節(jié)點(diǎn)起始地址的指針,那么通過(guò)這個(gè)指針以及這個(gè)節(jié)點(diǎn)的previous_entry_length屬性,程序就可以一直向前一個(gè)節(jié)點(diǎn)回溯,最終到達(dá)壓縮列表的表頭節(jié)點(diǎn)。
    1.首先,擁有指向壓縮列表表尾節(jié)點(diǎn)entry4起始地址的指針p1(指向表尾節(jié)點(diǎn)的指針可以通過(guò)指向壓縮列表起始地址的指針加上zltai屬性的值得出)
    2.通過(guò)p1減去entry4節(jié)點(diǎn)previous_entry_length屬性的值,得到一個(gè)指向entry4前一個(gè)節(jié)點(diǎn)entry3起始地址的指針p2
    3.通過(guò)p2減去entry3節(jié)點(diǎn)previous_entry_length屬性的值,得到一個(gè)指向entry3前一節(jié)點(diǎn)entry2起始地址的指針p3
    4.通過(guò)用p3減去entry2節(jié)點(diǎn)previous_entry_length屬性的值,得到一個(gè)指向entry2前一節(jié)點(diǎn)最終,從表尾節(jié)點(diǎn)向表頭節(jié)點(diǎn)遍歷了整個(gè)列表

到了這里,關(guān)于Redis核心數(shù)據(jù)結(jié)構(gòu)之壓縮列表(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Redis數(shù)據(jù)結(jié)構(gòu)——快速列表quicklist、快表

    Redis數(shù)據(jù)結(jié)構(gòu)——快速列表quicklist、快表

    Redis中的數(shù)據(jù)結(jié)構(gòu),鏈表和壓縮列表這兩種數(shù)據(jù)結(jié)構(gòu)是列表對(duì)象的底層實(shí)現(xiàn)方式。 當(dāng)時(shí)考慮到鏈表的附加空間太大,節(jié)點(diǎn)的內(nèi)存都是單獨(dú)分配的,還會(huì)導(dǎo)致內(nèi)存碎片化問(wèn)題嚴(yán)重。 因此從Redis3.2開(kāi)始,對(duì)列表的底層數(shù)據(jù)結(jié)構(gòu)進(jìn)行了改造,即使用 quickList代替鏈表list和壓縮列表z

    2024年02月12日
    瀏覽(22)
  • Redis核心數(shù)據(jù)結(jié)構(gòu)實(shí)戰(zhàn)與高性能解析

    Redis核心數(shù)據(jù)結(jié)構(gòu)實(shí)戰(zhàn)與高性能解析

    目錄 一、安裝Redis 二、Redis線程與高性能 2.1 Redis是單線程么? 2.2 Redis讀寫(xiě)是單線程為何這么快? 2.3 Redis如何處理并發(fā)操作命令? 三、核心數(shù)據(jù)結(jié)構(gòu)實(shí)戰(zhàn) 3.1 字符串常用操作實(shí)戰(zhàn) SET 存入鍵值對(duì) SETNX SETEX MSET 批量存入鍵值對(duì) MSETNX DECR 原子減1 DECRBY 原子減 INCR 原子加1 INCRBY 原子

    2024年02月07日
    瀏覽(20)
  • Redis學(xué)習(xí)路線(2)—— Redis的數(shù)據(jù)結(jié)構(gòu)

    一、Redis的數(shù)據(jù)結(jié)構(gòu) Redis是一個(gè)Key-Value的數(shù)據(jù)庫(kù),key一般是String類(lèi)型,不過(guò)Value的類(lèi)型卻有很多: String: Hello World Hash: {name: \\\"jack\\\", age: 21} List: [A - B - C - C] Set: {A, B, C} SortedSet: {A: 1, B: 2, C: 3} GEO: {A: (120.3, 30.5)} BitMap: 0110110101110101011 HyperLog: 0110110101110101011 由于Redis對(duì)數(shù)據(jù)

    2024年02月15日
    瀏覽(26)
  • 【Redis】Redis中的數(shù)據(jù)結(jié)構(gòu)和內(nèi)部編碼

    【Redis】Redis中的數(shù)據(jù)結(jié)構(gòu)和內(nèi)部編碼

    type命令實(shí)際返回的就是當(dāng)前鍵的數(shù)據(jù)結(jié)構(gòu)類(lèi)型,它們分別是:string(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序集合),但這些只是Redis對(duì)外的數(shù)據(jù)結(jié)構(gòu), 實(shí)際上Redis針對(duì)每種數(shù)據(jù)結(jié)構(gòu)都有??的底層內(nèi)部編碼實(shí)現(xiàn),?且是多種實(shí)現(xiàn),這樣Redis會(huì)在合適的

    2024年02月07日
    瀏覽(21)
  • redis1之安裝redis,啟動(dòng),常用數(shù)據(jù)結(jié)構(gòu)

    redis1之安裝redis,啟動(dòng),常用數(shù)據(jù)結(jié)構(gòu)

    ? 目錄 redis安裝與啟動(dòng)、常見(jiàn)數(shù)據(jù)結(jié)構(gòu) 啟動(dòng) ?Redis客戶端 數(shù)據(jù)結(jié)構(gòu)與常見(jiàn)的命令 ?redis的通用命令 ?String類(lèi)型的用法 Hash命令的用法 ?List命令 ?Set命令 ?SortedSet類(lèi)型用法 1,在linux上安裝上gcc的依賴,我這里是centos7.6,gcc是4.5 我們?cè)贚Inux上查看一下我們的系統(tǒng)信息 ?我這里安裝

    2024年02月06日
    瀏覽(56)
  • Redis - 底層數(shù)據(jù)結(jié)構(gòu)

    Redis - 底層數(shù)據(jù)結(jié)構(gòu)

    Redis 的底層數(shù)據(jù)結(jié)構(gòu)主要以下幾種: SDS(Simple Dynamic String, 簡(jiǎn)單動(dòng)態(tài)字符串) ZipList(壓縮列表) QuickList(快表) Dict(字典) IntSet(整數(shù)集合) ZSkipList(跳躍表) 在 Redis 中,并不會(huì)直接使用 C 語(yǔ)言自帶的字符串結(jié)構(gòu)作為實(shí)際的存儲(chǔ)結(jié)構(gòu),而只是將字符串作為字面量使用,大多數(shù)情況使用自

    2023年04月12日
    瀏覽(30)
  • Redis數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)介

    Redis數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)介

    對(duì)redis來(lái)說(shuō),所有的key(鍵)都是字符串。 ? ? 1.String 字符串類(lèi)型 是redis中最基本的數(shù)據(jù)類(lèi)型,一個(gè)key對(duì)應(yīng)一個(gè)value。 ? String類(lèi)型是二進(jìn)制安全的,意思是 redis 的 string 可以包含任何數(shù)據(jù)。如數(shù)字,字符串,jpg圖片或者序列化的對(duì)象。 ? 使用:get 、 set 、 del 、 incr、 decr 等

    2024年02月07日
    瀏覽(19)
  • Redis 數(shù)據(jù)結(jié)構(gòu)詳解

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

    Redis 數(shù)據(jù)類(lèi)型分為:字符串類(lèi)型、散列類(lèi)型、列表類(lèi)型、集合類(lèi)型、有序集合類(lèi)型。 Redis 這么火,它運(yùn)行有多塊?一臺(tái)普通的筆記本電腦,可以在1秒鐘內(nèi)完成十萬(wàn)次的讀寫(xiě)操作。 原子操作:最小的操作單位,不能繼續(xù)拆分。即最小的執(zhí)行單位,不會(huì)被其他命令插入。高并發(fā)

    2024年02月05日
    瀏覽(22)
  • Redis的數(shù)據(jù)結(jié)構(gòu)

    Redis是一款高性能的鍵值存儲(chǔ)數(shù)據(jù)庫(kù),支持多種數(shù)據(jù)結(jié)構(gòu)。在Redis中,數(shù)據(jù)結(jié)構(gòu)是指在Redis中存儲(chǔ)和操作數(shù)據(jù)的方式。Redis支持的數(shù)據(jù)結(jié)構(gòu)包括字符串、哈希表、列表、集合和有序集合。 字符串是Redis中最基本的數(shù)據(jù)結(jié)構(gòu),可以存儲(chǔ)任何類(lèi)型的數(shù)據(jù),包括數(shù)字、文本和二進(jìn)制數(shù)

    2024年02月09日
    瀏覽(17)
  • Redis常見(jiàn)數(shù)據(jù)結(jié)構(gòu)

    Redis常見(jiàn)數(shù)據(jù)結(jié)構(gòu)

    Redis是一個(gè)key-value的數(shù)據(jù)庫(kù),key一般是String類(lèi)型,但是value的類(lèi)型多種多樣 在學(xué)習(xí)Redis不同數(shù)據(jù)類(lèi)型時(shí),我們可以在官網(wǎng)( Redis官網(wǎng))查看不同的命令: 也可以使用使用help @xxx 命令的方式查看 通用命令是部分?jǐn)?shù)據(jù)類(lèi)型都可以使用的指令,常見(jiàn)的有: KEYS:查看符合模板的所有k

    2024年02月13日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包