17- Redis 中的 quicklist 數據結構

在 Redis 3.0 之前,List 對象的底層數據結構是雙向鏈表或者壓縮列表,然后在 Redis 3.2 的時候,List 對象的底層改由 quicklist 數據結構實現。

其實 quicklist 就是【雙向鏈表 + 壓縮列表】組合,因為一個 quicklist 就是一個鏈表,而鏈表中的每個元素又是一個壓縮列表。

在前面講壓縮列表的時候,提到過壓縮列表的不足,雖然壓縮列表是通過緊湊型的內存布局節省了內存開銷,但是因為它的結構設計,如果保存的元素數量增加,或者元素變大了,壓縮列表會有【連鎖更新】的風險,一旦發生,會造成性能下降。

quicklist 解決辦法,通過控制每個鏈表節點中的壓縮列表的大小或者元素個數,來規避連鎖更新的問題,因為壓縮列表元素越少或越小,連鎖更新帶來的影響就越小,從而提供了更好的訪問性能。

1. quicklist 結構設計

quicklist 的結構體跟鏈表的結構體類似,都包含了表頭和表尾,區別在于 quicklist 的節點是 quicklistNode。

typedef struct quicklist {// quicklist 的鏈表頭quicklistNode *head;// quicklist 的鏈表尾quicklistNode *tail;// 所有壓縮列表中的總元素個數unsigned long count;// quicklistNode 的個數unsigned long len;...
} quicklist;

接下來,是quicklistNode 的結構定義:

typedef struct quicklistNode {// 前一個 quicklistNodestruct quicklistNode *prev;// 下一個 quicklistNodestruct quicklistNode *next;// quicklistNode 指向的壓縮列表unsigned char *zl;// 壓縮列表的字節大小unsigned int sz;// 壓縮列表的元素個數unsigned int count : 16;...
} quicklistNode;

可以看到,quicklistNode 結構體里包含了前一個節點和下一個節點指針,這樣每個 quicklistNode 形成了一個 雙向鏈表,但是鏈表節點的元素不再是單純保存元素值,而是保存了一個壓縮列表,所以 quicklistNode 結構體里有個指向壓縮列表的指針 *zl。

如下:

在向 quicklist 添加一個元素的時候,不會像普通的鏈表那樣,直接新建一個鏈表節點,而是會檢查插入位置的壓縮列表是否能容納該元素,如果能容納就直接保存到 quicklistNode 結構里的壓縮列表,如果不能容納,才會新建一個新的 quicklistNode 結構。

quicklist 會控制 quicklistNode 結構里的壓縮列表的大小或者元素個數,來規避潛在的連鎖更新的風險,但是這并沒有完全解決連鎖更新的問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24266.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24266.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24266.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是ESG?

什么是ESG? ESG的實施和發展是企業應對全球和國內環境、社會和治理挑戰的關鍵路徑。《ESG入門一本通》詳細闡述了ESG的概念、發展歷程和評價體系,并結合中國的實際情況,強調了ESG的重要性和必要性。企業需重視ESG管理和信息披露,…

詳細分析Mysql中的JSON_OBJECT() 基本知識(附Demo)

目錄 前言1. 基本知識2. Demo 前言 對于基本的命令行以及優化推薦閱讀: 數據庫中增刪改常用語法語句(全)Mysql優化高級篇(全)命令行登錄Mysql的詳細講解 1. 基本知識 JSON_OBJECT() 是 MySQL 中用于生成 JSON 對象…

信息系統項目管理師0149:輸入(9項目范圍管理—9.4收集需求—9.4.1輸入)

點擊查看專欄目錄 文章目錄 9.4 收集需求9.4.1 輸入9.4 收集需求 收集需求是為實現目標而確定,記錄并管理干系人的需要和需求的過程。本過程的主要作用是為定義產品范圍和項目范圍奠定基礎。本過程僅開展一次或僅在項目的預定義點開展。收集需求過程的數據流向如圖 9-2 所示。…

「前端+鴻蒙」鴻蒙應用開發簡介

鴻蒙應用開發是指使用華為鴻蒙操作系統(HarmonyOS)提供的API和開發工具,創建可以在鴻蒙設備上運行的應用程序。鴻蒙系統是華為開發的全場景、分布式操作系統,它支持多種設備類型,包括智能手機、平板電腦、智能電視、智…

Spring (45)Gateway

在計算機網絡中,一個網關(Gateway)是一個網絡節點,它充當不同網絡協議、應用程序或數據格式之間的轉換點。在微服務架構中,API網關(API Gateway)扮演著非常關鍵的角色,它是微服務和外…

電腦開機出現英文字母,如何解決這個常見問題?

電腦開機時出現英文字母的情況通常意味著系統在啟動過程中遇到了問題。這些英文字母可能是錯誤信息、系統提示或BIOS設置問題。通過理解這些信息并采取適當的措施,您可以解決大多數啟動問題。本文將介紹三種解決電腦開機出現英文字母問題的方法,幫助您恢…

智能合約中未授權訪問

未授權訪問: 如果智能合約對關鍵函數的訪問控制不足,攻擊者可能執行不應允許的操作,如修改合約狀態或提取資金。 未授權訪問示例 假設我們有一個智能合約,用于管理用戶的存款和提款。在這個例子中,合約沒有正確地限…

python使用appium打開程序后,為什么沒有操作后程序就自動退出了

當使用Appium打開應用程序并在沒有執行任何操作后它自動退出,這可能是由于幾個不同的原因。以下是一些可能的原因和相應的解決方案: 應用程序的默認行為: 有些應用程序在啟動后如果沒有用戶交互,可能會因為超時或其他邏輯而自動關…

BGP匯總+認證

一、BGP 的宣告問題 1、在 BGP 協議中每臺運行 BGP 的設備上,宣告本地直連路由 2、在 BGP 協議中運行 BGP 協議的設備來宣告.通過 IGP 學習到的,未運行 BGP 協議設備產2、生的路由; 在 BGP 協議中宣告本地路由表中路由條目時,將攜帶本地到達這…

Spring Boot集成geodesy實現距離計算

1.什么是geodesy? 浩瀚的宇宙中,地球是我們賴以生存的家園。自古以來,人類一直對星球上的位置和彼此的距離著迷。無論是航海探險、貿易往來還是科學研究,精確計算兩個地點之間的距離都是至關重要的。 Geodesy:大地測量…

Qt實現麥克風音頻輸入保存wav文件

一.本文目的 實現在Qt中接收麥克風數據并保存為WAV文件,使用QAudioInput來錄音,并使用QFile來保存數據到WAV文件。 開發環境:QT5.12 本文用極簡代碼實現,核心代碼只需不到100行。 完整工程代碼文末鏈接可以直接下載。 二.代碼實…

51單片機STC89C52RC——創建Keil項目

一,打開Keil5 菜單---project--New uVision Project... 二,新建項目文件夾 彈出選擇文件夾對話框后,可以右鍵新建一個項目文件夾【文件夾名字可以隨便取,自己看得懂就行,建議不要有特殊字符】,這樣該項目…

MATLAB算法實戰應用案例精講-【數模應用】因子分析(附MATLAB和python代碼實現)

目錄 前言 算法原理 SPSS因子分析 操作步驟 結果分析 SPSSAU 因子分析案例 1、背景 2、理論 3、操作 4、SPSSAU輸出結果 5、文字分析 6、剖析 疑難解惑 同源方差或共同方法變異偏差,Harman單因子檢驗? 提示出現奇異矩陣? 因子得分和綜合得分? 因子分析計…

品牌策劃:不只是工作,是一場創意與學習的旅程

你是否認為只有那些經驗豐富、手握無數成功案例的高手才能在品牌策劃界嶄露頭角? 今天,我要悄悄告訴你一個行業內的秘密:在品牌策劃的世界里,經驗雖重要,但絕非唯一。 1?、無止境的學習欲望 品牌策劃,這…

rtl8723DU移植 android4.4 4418 (第二部分藍牙部分)

使用的代碼: HMI (8723bu)源碼 567_RTL8723DU_WiFi_linux_v5.6.5.3_35502_COEX20181130-2e2e.20191025.zip 由于之前寫的所有筆記沒有保存,這里只能是部分。 0、 前置知識 1 、kernel 的移植 2、hardwire的移植 將 驅動中的 h…

流水線報錯:[Error: ENOENT: no such file or directory, stat ‘/application/bin‘]

報錯信息: #18 10.37 > Build error occurred #18 10.38 [Error: ENOENT: no such file or directory, stat /application/bin] { #18 10.38 errno: -2, #18 10.38 code: ENOENT, #18 10.38 syscall: stat, #18 10.38 path: /application/bin #18 10.38 } #18 12…

騰訊開源人像照片生成視頻模型V-Express

網址 https://github.com/tencent-ailab/V-Express 下面是github里的翻譯: 在人像視頻生成領域,使用單張圖像生成人像視頻變得越來越普遍。一種常見的方法是利用生成模型來增強受控發電的適配器。 但是,控制信號的強度可能會有所不同&…

系統思考—啤酒游戲沙盤

10個智商120的?組人?成?團的?隊,大?的家?集體智?是商?多少? 在?期長?輔?各導?種?業企?的?程過?中,我?經們?常?察觀?到,雖?每然?個?門部?都?力努?解決?己自?的問題,但?司公?整體的?收應…

Rust 標記一個屬性或函數為廢棄

如題,演示Rust 標記一個屬性或函數為廢棄的基本使用方法: 示例: use serde::{Deserialize, Serialize};#[derive(Clone, Debug, Serialize, Deserialize, Default)] pub struct GrpcOptions {pub addr: String,pub max_recv_message_size: u…

conntrack如何限制您的k8s網關

1.1 conntrack 介紹 對于那些不熟悉的人來說,conntrack簡單來說是Linux內核的一個子系統,它跟蹤所有進入、出去或通過系統的網絡連接,允許它監控和管理每個連接的狀態,這對于諸如NAT(網絡地址轉換)、防火墻和保持會話連續性等任務至關重要。它作為Netfilter的一部分運行,…