主頁 > 資料庫 > Redis資料結構一之物件的介紹及各版本對應實作

Redis資料結構一之物件的介紹及各版本對應實作

2023-05-15 07:54:54 資料庫

本文首發于公眾號:Hunter后端
原文鏈接:Redis資料結構一之物件的介紹及各版本對應實作

本篇筆記開始介紹 Redis 資料結構的底層實作,

當我們被問到 Redis 中有什么資料結構,或者說資料型別,我們可能會說有字串、串列、哈希、集合、有序集合,

其實這幾種資料型別在 Redis 中都由物件構成,而且是兩個物件,一個鍵物件,一個值物件,

在這些資料型別中,它們的鍵都是字串物件,而值可以是前面說的字串物件、串列物件、哈希物件、集合物件、有序集合物件中的一種,這個取決于鍵值對的資料型別,

而在 Redis 中,這些物件都有其更底層的實作方式,也就是說這一篇筆記我們要介紹的,更底層的資料結構,而且不同的 Redis 版本有不一樣的資料結構,最基礎的資料結構包括簡單動態字串、字典、跳躍表、整數集合等,

接下來我們先介紹一下 Redis 中物件的構成,然后介紹一下不同 Redis 版本中每個物件所使用的的底層資料結構,之后再逐個介紹這些資料結構的實作原理,以下是本篇筆記的目錄:

  1. Redis 物件的介紹
  2. 不同版本的 Redis 物件的資料結構

注意:本篇文章的主體框架內容是基于書籍《Redis設計與實作》進行描述的,部分過時內容都基于網上查詢的相應資料與最新版本進行了對齊,如有其他疏漏,還望指正,

1、Redis 物件的介紹

舉一個例子,當我們設定一個字串型別的資料:

set msg "hello world"

這樣,我們就創建了兩個物件,且兩個都是字串物件,因為鍵值對的 key 和 value 都是字串,

如果我們創建了一個串列資料,那么 key 是字串物件,而值 value 是串列物件,

在 Redis 中,每個物件都由一個 redisObject 結構來表示:

typedef struct redisObject{
    //型別
    unsigned type:4;
    
    //編碼
    unsigned encoding:4;
    
    //指向底層實作資料結構的指標
    void *ptr
    
    //...
} robj;

type

在上面的結構中,type 指的是這個物件的型別,比如我們創建了一個串列資料,那么這個資料的 key 就是一個字串物件,由這個結構里的 type 來指定,這個資料的 value 就是一個串列物件,也是由 type 來進行指定區分,

但是,當我們想要知道一條資料的資料型別是字串、串列、哈希、集合、有序集合的哪一種時,我們常常是需要知道的這條資料的 value 的型別,一般也是指的 value 的型別,因為資料的 key 的型別總是字串物件,

一條資料的值物件型別的獲取我們可以用 TYPE 命令來操作:

TYPE msg

TYPE 型別的值輸出就是我們那五種型別:string、list、hash、set、zset

encoding

encoding 指的是這個物件底層資料結構使用的編碼,

一個物件在不同的情況下的編碼及底層資料結構可能是不一樣的,比如對于字串物件,它的編碼包括 int,embstr,raw 這三種,但后兩種的底層結構其實都是簡單動態字串(SDS),不過它們的底層使用方式略有不同,這個我們在下一節再介紹,

獲取物件的值的編碼使用 OBJECT ENCODING 命令:

OBJECT ENCODING msg

ptr

ptr 則是作為指標指向的是物件的底層資料結構地址,

上面這些查看物件底層編碼的命令,我們會在介紹完各個底層資料結構之后根據存盤的不同資料型別進行使用,

2、不同版本的 Redis 物件的資料結構

Redis 3.2 版本以前

在 Redis 3.2 版本以前,每個物件對應的編碼,及底層資料結構如下:

字串物件

編碼(OBJECT ENCODING輸出結果) 底層資料結構
int 整數
embstr embstr編碼的SDS
raw SDS

串列物件

編碼(OBJECT ENCODING輸出結果) 底層資料結構
ziplist 壓縮串列
linkedlist 雙向鏈表

哈希物件

編碼(OBJECT ENCODING輸出結果) 底層資料結構
ziplist 壓縮串列
hashtable 字典

集合物件

編碼(OBJECT ENCODING輸出結果) 底層資料結構
intset 整數集合
hashtable 字典

有序集合物件

編碼(OBJECT ENCODING輸出結果) 底層資料結構
ziplist 壓縮串列
skiplist 跳躍表

Redis 3.2 版本

而在 3.2 版本,主要對串列物件的底層實作做了修改,由 quicklist 構成底層實作,quicklist 實際上是 linkedlist 和 ziplist 的混合結構,

串列物件

編碼(OBJECT ENCODING輸出結果) 底層資料結構
quicklist 快速串列

Redis 5.1 之后版本

在 Redis 5.1 版本,引入了新的資料結構 listpack,6.x 版本作為過渡階段,并且在 7.0 版本,listpack 已經完全替換了 ziplist,成為了哈希物件、有序集合物件的底層資料結構的原有實作之一,更改如下:

哈希物件

編碼(OBJECT ENCODING輸出結果) 底層資料結構
listpack listpack
hashtable 字典

有序集合物件

編碼(OBJECT ENCODING輸出結果) 底層資料結構
listpack listpack
skiplist 跳躍表

而且 quicklist 也變成了 linkedlist 和 listpack 的混合結構

這一篇筆記只是作為一個引子,引入 Redis 中各個資料結構的底層結構,在下一篇筆記中我們將正式逐個介紹各個資料結構的底層實作,

如果想獲取更多后端相關文章,可掃碼關注閱讀:
image

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/552449.html

標籤:NoSQL

上一篇:讀SQL進階教程筆記16_SQL優化讓SQL飛起來

下一篇:返回列表

標籤雲
其他(159037) Python(38129) JavaScript(25421) Java(18034) C(15226) 區塊鏈(8265) C#(7972) AI(7469) 爪哇(7425) MySQL(7186) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4572) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1972) 功能(1967) Web開發(1951) HtmlCss(1936) python-3.x(1918) C++(1915) 弹簧靴(1913) xml(1889) PostgreSQL(1876) .NETCore(1860) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • Redis資料結構一之物件的介紹及各版本對應實作

    本文首發于公眾號:Hunter后端 原文鏈接:Redis資料結構一之物件的介紹及各版本對應實作 本篇筆記開始介紹 Redis 資料結構的底層實作。 當我們被問到 Redis 中有什么資料結構,或者說資料型別,我們可能會說有字串、串列、哈希、集合、有序集合。 其實這幾種資料型別在 Redis 中都由 ......

    uj5u.com 2023-05-15 07:54:54 more
  • 讀SQL進階教程筆記16_SQL優化讓SQL飛起來

    1. 查詢速度慢并不只是因為SQL陳述句本身,還可能是因為記憶體分配不佳、檔案結構不合理等其他原因 1.1. 都是為了減少對硬碟的訪問 2. 不同代碼能夠得出相同結果 2.1. 從理論上來說,得到相同結果的不同代碼應該有相同的性能 2.2. 遺憾的是,查詢優化器生成的執行計劃很大程度上要受到代碼外部結構 ......

    uj5u.com 2023-05-15 07:54:13 more
  • 資料操作(基礎)

    mysql之資料操作 第一章 添加資料 通常向表中添加資料應該包含表中的所有欄位,即為表中所有欄位添加資料。但也可不包含所有欄位來添加資料 1.1、所有欄位 按照所有欄位來添加資料,有兩種方式: 語法1: insert into 表名(所有欄位) values(欄位對應的值); 語法2: inser ......

    uj5u.com 2023-05-15 07:53:58 more
  • 大資料導論

    大資料導論 1.資料 資料概念:一切能被記錄和查詢的事物 資料價值: 對資料的內容進行深入分析,可以更好的幫助了解事和物在現實世界的運行規律 2.大資料概述 大資料是什么? 狹義上:對海量資料進行處理的軟體技術體系 廣義上:數字化、資訊化時代的基礎支撐,以資料為生活賦能 大資料解決了什么問題? 1. ......

    uj5u.com 2023-05-15 07:53:37 more
  • Redis基礎命令匯總,看這篇就夠了

    本文首發于公眾號:Hunter后端 原文鏈:Redis基礎命令匯總,看這篇就夠了 本篇筆記將匯總 Redis 基礎命令,包括幾個常用的通用命令,和各個型別的資料的操作,包括字串、哈希、串列、集合、有序集合等在內的基本操作。 以下是本篇筆記目錄: 通用命令 字串命令 哈希命令 串列命令 集合命令 ......

    uj5u.com 2023-05-14 08:58:48 more
  • MySQL開窗函式

    MySQL開窗函式 知識點 三種開窗函式:row_number(),rank(),dense_rank() 這三種函式都是用于回傳結果集的分組內每行的排名 區別: row_number():特點是唯一且連續,如果四個人是按成績排名,那么是1234這樣排的,即使有重分的人 rank(): 特點是并列不 ......

    uj5u.com 2023-05-14 08:58:42 more
  • MySQL-簡單總結

    部分概念: 1、在資料庫中產生資料不一致的根本原因是冗余 2、一個事務對某資料加S鎖后,其它的事務不能對該資料加任何型別的鎖(錯誤):所謂S鎖,是事務T對資料A加上S鎖時,其他事務只能再對資料A加S鎖,而不能加X鎖,直到T釋放A上的S鎖 3、一個資料庫只有一個模式和一個內模式 4、使某個事務永遠處于 ......

    uj5u.com 2023-05-14 08:58:38 more
  • 索引初識

    索引(基礎) 一、索引介紹 1.1、前言 在資料庫中,執行如下陳述句時: select * from emp where id=1000; mysql 是從第一條記錄開始遍歷,直至找到 id = 1000 的資料,然而這樣查詢的效率低,所以 mysql 允許通過建立索引來加快資料表的查詢和排序。 1. ......

    uj5u.com 2023-05-14 08:53:18 more
  • 大資料面試(個人總結含答案)

    大資料面試題 Hadoop 分布式系統基礎架構,主要是為了解決海量資料的存盤和和海量資料的分析計算問題 Hadoop的特點 高可靠性:Hadoop底層維護多個資料副本,即使Hadoop某個計算元素或存盤出現故障,也不會 導致資料的丟失 高擴展性:集群分配任務資料,可方便擴展數以千計的節點 高效性:并 ......

    uj5u.com 2023-05-14 08:34:50 more
  • PostgreSQL 12 檔案: 系統目錄

    系統目錄是關系型資料庫存放模式元資料的地方,比如表和列的資訊,以及內部統計資訊等。PostgreSQL的系統目錄就是普通表。你可以洗掉并重建這些表、增加列、插入和更新數值, 然后徹底把你的系統搞垮。 通常情況下,我們不應該手工修改系統目錄,通常有SQL命令可以做這些事情。(例如,CREATE DAT... ......

    uj5u.com 2023-05-14 08:34:45 more