原理Redis-QuickList

QuickList

**問題1:**ZipList雖然節省內存,但申請內存必須是連續空間,如果內存占用較多,申請內存效率很低。怎么辦?

  • 為了緩解這個問題,我們必須限制ZipList的長度和entry大小。

**問題2:**但是我們要存儲大量數據,超出了ZipList最佳的上限該怎么辦?

  • 我們可以創建多個ZipList來分片存儲數據

**問題3:**數據拆分后比較分散,不方便管理和查找,這多個ZipList如何建立聯系?

  • Redis在3.2版本引入了新的數據結構QuickList,它是一個雙端鏈表,只不過鏈表中的每個節點都是一個ZipList。

在這里插入圖片描述

為了避免QuickList中的每個ZipList中entry過多,Redis提供了一個配置項:list-max-ziplist-size來限制

  • 如果值為正,則代表ZipList的允許的entry個數的最大值

  • 如果值為負,則代表ZipList的最大內存大小,分5種情況:

    • -1:每個ZipList的內存占用不能超過4kb
    • -2:每個ZipList的內存占用不能超過8kb
    • -3:每個ZipList的內存占用不能超過16kb
    • -4:每個ZipList的內存占用不能超過32kb
    • -5:每個ZipList的內存占用不能超過64kb

    其默認值為 -2:

在這里插入圖片描述

除了控制ZipList的大小,QuickList還可以對節點的ZipList做壓縮。

通過配置項list-compress-depth來控制。因為鏈表一般都是從首尾訪問較多,所以首尾是不壓縮的。這個參數是控制首尾不壓縮的節點個數:

  • 0:特殊值,代表不壓縮
  • 1:標示QuickList的首尾各有1個節點不壓縮,中間節點壓縮
  • 2:標示QuickList的首尾各有2個節點不壓縮,中間節點壓縮
  • 以此類推

默認值: 0

在這里插入圖片描述

以下是QuickList的和QuickListNode的結構源碼:

typedef struct quicklist {// 頭節點指針quicklistNode *head; // 尾節點指針quicklistNode *tail; // 所有ziplist的entry的數量unsigned long count;    // ziplists總數量unsigned long len;// ziplist的entry上限,默認值 -2 int fill : QL_FILL_BITS;// 首尾不壓縮的節點數量unsigned int compress : QL_COMP_BITS;// 內存重分配時的書簽數量及數組,一般用不到unsigned int bookmark_count: QL_BM_BITS;quicklistBookmark bookmarks[];
} quicklist;
typedef struct quicklistNode {// 前一個節點指針struct quicklistNode *prev;// 下一個節點指針struct quicklistNode *next;// 當前節點的ZipList指針unsigned char *zl;// 當前節點的ZipList的字節大小unsigned int sz;// 當前節點的ZipList的entry個數unsigned int count : 16;  // 編碼方式:1,ZipList; 2,lzf壓縮模式unsigned int encoding : 2;// 數據容器類型(預留):1,其它;2,ZipListunsigned int container : 2;// 是否被解壓縮。1:則說明被解壓了,將來要重新壓縮unsigned int recompress : 1;unsigned int attempted_compress : 1; //測試用unsigned int extra : 10; /*預留字段*/
} quicklistNode;

在這里插入圖片描述

QuickList的特點:

  • 是一個節點為ZipList的雙端鏈表
  • 節點采用ZipList,解決了傳統鏈表的內存占用問題
  • 控制了ZipList大小,解決連續內存空間申請效率問題
  • 中間節點可以壓縮,進一步節省了內存

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

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

相關文章

[網鼎杯 2018]Fakebook

[網鼎杯 2018]Fakebook 打開環境出現一個登錄注冊的頁面 在登錄和注冊中發現 了地址欄出現變化&#xff0c;掃一波看看 看看robots.txt和flag.php 訪問robots.txt看看 再訪問user.php.bak <?php class UserInfo { public $name ""; public …

Head、Neck、Backbone介紹

在深度學習中&#xff0c;通常將模型分為三個部分&#xff1a;backbone、neck 和 head。 Backbone&#xff1a;backbone 是模型的主要組成部分&#xff0c;通常是一個卷積神經網絡&#xff08;CNN&#xff09;或殘差神經網絡&#xff08;ResNet&#xff09;等。backbone 負責…

ON1 Photo RAW 2024 for Mac——專業照片編輯的終極利器

ON1 Photo RAW 2024 for Mac是一款專為Mac用戶打造的照片編輯器&#xff0c;以其強大的功能和易用的操作&#xff0c;讓你的照片編輯工作變得輕松愉快。 一、強大的RAW處理能力 ON1 Photo RAW 2024支持大量的RAW格式照片&#xff0c;能夠讓你在編輯過程中獲得更多的自由度和更…

練習九-利用狀態機實現比較復雜的接口設計

練習九-利用狀態機實現比較復雜的接口設計 1&#xff0c;任務目的&#xff1a;2&#xff0c;RTL代碼3&#xff0c;RTL原理框圖4&#xff0c;測試代碼5&#xff0c;波形輸出 1&#xff0c;任務目的&#xff1a; &#xff08;1&#xff09;學習運用狀態機控制的邏輯開關&#xff…

【C++11】=default與=delete關鍵字使用詳解

系列文章目錄 C11新特性使用詳解-持續更新 文章目錄 系列文章目錄一、default關鍵字1. 為什么要引入default關鍵字2. 注意事項3. 使用default關鍵字有什么好處4.實例代碼 二、delete關鍵字1. 為什么要引入delete關鍵字2. 注意事項3. 使用場景3.1刪除默認構造函數3.2 刪除拷貝構…

2023.11.22 -數據倉庫的概念和發展

目錄 https://blog.csdn.net/m0_49956154/article/details/134320307?spm1001.2014.3001.5501 1經典傳統數倉架構 2離線大數據數倉架構 3數據倉庫三層 數據運營層,源數據層&#xff08;ODS&#xff09;&#xff08;Operational Data Store&#xff09; 數據倉庫層&#…

開發上門送桶裝水小程序要考慮哪些業務場景

上門送水業務已經有很長一段時間了&#xff0c;但是最開始都是給用戶發名片、貼小廣告&#xff0c;然后客戶電話訂水&#xff0c;水站工作人員再上門去送&#xff0c;這種人工記單和派單效率并不高&#xff0c;并且電話溝通中也比較容易出現偏差&#xff0c;那么根據這個情況就…

IT 領域中的主要自動化趨勢

48%的IT自動化流程屬于IT服務管理&#xff0c;過去一年中&#xff0c;IT運維自動化增長了272%。 IT部門從交付者轉變為戰略伙伴 今年的《工作自動化指數》數據顯示&#xff0c;自動化正在蔓延到組織的各個部門&#xff0c;越來越多的部門采用自動化&#xff0c;并且IT以外的員工…

一條命令徹底卸載Linux自帶多個版本jdk

一條命令徹底卸載Linux自帶多個版本jdk 檢查系統已經安裝的jdk rpm -qa | grep java卸載所有已經安裝的 jdk xargs 將參數逐個傳遞 將已安裝的 java 程序逐個當做參數傳遞給 rpm -e --nodeps rpm -qa | grep java | xargs rpm -e --nodeps再次檢查系統已經安裝的jdk rpm -qa | …

JS實現二分查找

最近在面試的時候被問到手寫實現二分查找&#xff0c;雖然二分查找很早就聽過&#xff0c;也知道實現原理&#xff0c;但是手擼起來&#xff0c;總是差點意思&#xff0c;正好復習一下。作為前端程序員&#xff0c;可能面試絕大部分公司不需要能寫很復雜的算法問題&#xff0c;…

Azure Machine Learning - 搜索中的語義排名

目錄 什么是語義排名&#xff1f;語義排名的工作原理如何收集和總結輸入語義排名的輸出如何對摘要進行評分 語義功能和限制 在 Azure AI 搜索中&#xff0c;“語義排名”通過使用語言理解對搜索結果重新排名來顯著提高搜索相關性&#xff0c; 本文概括性地介紹了語義排名工作原…

Nodejs JavaScript 字符串加密

情景 問題的場景是這樣的&#xff1a;我們需要在瀏覽器cookie中存儲用戶名&#xff0c;但又不想直接明文存儲&#xff0c;所以對它進行了簡單的加密存儲。 因為是簡單的加密&#xff0c;目的只是不希望明文存儲。我們使用了Base64 編碼&#xff0c;使得cookie里的存儲不可只讀…

Arthas 監聽 Docker 部署的java項目CPU占比高的信息

1、Linux上安裝Arthas wget https://alibaba.github.io/arthas/arthas-boot.jar2、docker ps 查看目標項目的容器ID 3、copy Arthas 到目標容器中 (注意有 &#x1f615; ) docker cp arthas-boot.jar d97e8666666:/4、進入到目標容器目錄中 docker exec -it d97e8666666 /b…

5-7求三種數的和

#include<stdio.h> int main(){double sum10;double sum20;double sum30;double sum;int i;for(i1;i<100;i){sum1sum1i;}printf("sum1結果是&#xff1a;%15.6f\n",sum1);for(i1;i<50;i){sum2sum2i*i;}printf("sum2結果是&#xff1a;%15.6f\n"…

TS是什么、為什么、怎么辦

TS是什么 javascript程序的靜態類型檢查器 為什么要用TS js編寫時在預期不同類型值的地方使用了某種類型的值&#xff0c;導致常見的類型錯誤 js只能提供動態類型&#xff0c;也就是運行一下代碼才能知道發生了什么&#xff0c;需要靜態類型的檢查 TS怎么用 1、安裝vscode…

連接服務器的腳本

對于記不住的服務器密碼且不愿用三方工具俺簡單寫了個腳本&#xff08;檢測下最近shell腳本的學習效果咋樣&#xff09; expect 是處理交互的一種腳本語言&#xff0c;spawn啟動指定進程 -> expect獲取指定關鍵字 -> send想指定進程發送指定指令 -> 執行完成后退出 sp…

Oracle:poor sql導致的latch: cache buffers chains案例

巡檢時&#xff0c;執行如下sql發現長會話&#xff1a; SELECT SE.SID,SE.SERIAL#,TO_CHAR(LOGON_TIME,YYYY-MM-DD HH24:MI:SS),SE.STATUS,SE.OSUSER,SE.MACHINE,SE.PROGRAM,SE.BLOCKING_SESSION, SE.SQL_ID,SE.PREV_SQL_ID ,SE.EVENT,SE.P1TEXT,SE.P1,SE.P2TEXT,SE.P2,SE.P3…

LeetCode1161. Maximum Level Sum of a Binary Tree

文章目錄 一、題目二、題解 一、題目 Given the root of a binary tree, the level of its root is 1, the level of its children is 2, and so on. Return the smallest level x such that the sum of all the values of nodes at level x is maximal. Example 1: Input:…

visionOS空間計算實戰開發教程Day 4 初識ImmersiveSpace

細心的讀者會發現在在??Day1???和??Day2???的示例中我們使用的都是??WindowGroup??。 main struct visionOSDemoApp: App {var body: some Scene {WindowGroup {ContentView()}} } 本節我們來認識在visionOS開發中會經常用到的另一個概念??ImmersiveSpace??…

Spark---集群搭建

Standalone集群搭建與Spark on Yarn配置 1、Standalone Standalone集群是Spark自帶的資源調度框架&#xff0c;支持分布式搭建&#xff0c;這里建議搭建Standalone節點數為3臺&#xff0c;1臺master節點&#xff0c;2臺worker節點&#xff0c;這虛擬機中每臺節點的內存至少給…