Redis數據結構之Hash

一、Hash類型簡介

Redis的Hash類型是 Redis 3.2 版本引入的一個數據結構,它允許你在一個鍵下面存儲多個字段和值。在 Redis 內部,Hash 類型可以有多種底層數據結構來實現,這取決于存儲的數據量和特定的使用模式。哈希類型適用于存儲對象,例如用戶信息、商品詳情等。通過使用哈希,可以更方便地對數據進行操作和查詢。

Hash的底層數據結構在早期版本使用ZipList(壓縮列表)和HashTable,在某些版本中(尤其是較新版本),Redis 可能還會使用 Quicklist 作為 Hash 類型的底層數據結構。Quicklist 是 ziplist 和 linkedlist(鏈表)的混合體,它通過多個 ziplist 節點組成一個鏈表來提高大數據量下的性能。Quicklist 提供了更好的性能平衡,特別是在需要頻繁插入和刪除操作時。在 Redis 7.0 中,ZipList數據結構已經廢棄了,交由 ListPack 數據結構來實現了。

二、Hash使用場景

  • 存儲用戶信息:如果你需要存儲用戶信息,如用戶名、郵箱、年齡等,可以使用 Redis Hash 存儲。
  • 緩存對象:如果你有一個對象需要頻繁更新和訪問,可以將這個對象的屬性以 Hash 的形式存儲到 Redis 中。
  • 會話存儲:可以使用 Redis Hash 存儲用戶會話信息,如用戶的登錄狀態、購物車內容等。
  • 頻繁更新的統計數據,如用戶積分、訪問次數等。
  • 程序中的頻繁讀取和偶爾更新的配置數據。
  • 存儲地理位置信息的應用(如地圖服務),Redis Hash 可以用來存儲地點ID、經緯度、地址等信息。

三、底層編碼方式

編碼方式主要分兩部分講,一個是Redis6中的編碼方式,一個是Redis7的編碼方式。

在Redis6中,Hash數據結構的底層實現有兩種編碼方式,分別是ziplist(壓縮列表)和hashtable(哈希表),Quicklist 是 ziplist 和 linkedlist(鏈表)的混合體,它通過多個 ziplist 節點組成一個鏈表來提高大數據量下的性能。Quicklist 提供了更好的性能平衡,特別是在需要頻繁插入和刪除操作時。在 Redis 7.0 中,ZipList數據結構已經廢棄了,交由 ListPack 數據結構來實現了。

四、Hash底層數據結構

Redis的Hash類型的儲存結構,分別是ZipLIst、Quicklis、ListPack和HashTable  ,下面對這些結構分別進行分析。

ZIPLIST底層數據結構

ZipList是經過特殊編碼的雙向鏈接列表,對于上面提到的LinkedList鏈表結構,由于內存中不是連續的,LinkedList多使用指針導致浪費內存空間、內存使用率都較低。為了解決這個問題,引入了 ZipList這種數據結構。 ZipList是一種有順序、內存連續的數據結構。具備節省內存空間、提升內存使用率,適用于元素數量少且長度比較小的場景。在Redis 7.0版本之前是List、Hash、ZSet底層實現之一,但是自身也存在其他問題,因此在 Redis 7.0后被ListPack完全替換。

Ⅰ、ZIPLIST類對象

typedef struct ziplist{     /*ziplist分配的內存大小*/     uint32_t zlbytes;     /*達到尾部的偏移量 */     uint32_t zltail;     /*存儲元素實體個數*/     uint16_t zllen;     /*存儲內容實體元素*/     unsigned char* content[];     /*尾部標識*/     unsigned char zlend;}ziplist;
  • zlbytes:壓縮列表的字節長度。
  • zltail:壓縮列表尾元素相對于壓縮列表起始地址的偏移量(目的是為了直接定位到尾節點,方便反向查詢)。
  • zllen:壓縮列表的元素個數。
  • entry:各個節點數據。
  • zlend:壓縮列表的結尾,占一個字節,一直是0xFF(255)。

Ⅱ、ZIPLIST中節點(entry)類對象

typedef struct ziplistEntry {

    unsigned int pre_entry_len; // 前一個entry的長度編碼大小

unsigned char encoding; // 節點編碼方式

    unsigned char *content; // 指向當前entry數據的指針(節點的起始指針)

} ziplistEntry;

  • pre_entry_length: 記錄了前一個節點的長度,通過這個值,可以進行指針計算,從而跳轉到上一個節點。
  • 根據編碼方式的不同, pre_entry_length 域可能占用 1 字節或者 5 字節:1 字節,如果前一節點的長度小于 254 字節,便使用一個字節保存它的值。5 字節,如果前一節點的長度大于等于 254 字節,那么將第 1 個字節的值設為 254 ,然后用接下來的 4 個字節保存實際長度。
  • encoding表示編碼類型

字符串類型: 字符串類型有1、2、5三種編碼長度,前兩位表示編碼類型,剩余位表示字符串長度。

00|aaaaaa:存儲長度小于等于63byte的字符串。

01|aaaaaa bbbbbbbb:存儲長度小于等于16383byte的字符串。

10|...... bbbbbbbb cccccccc dddddddd eeeeeeee:存儲長度小于等于4294967295byte的字符串,'.'固定為0。

整數類型:整數類型的編碼長度統一位1字節。

1100 0000:表示16位有符號整數,content占用2byte。

1101 0000:表示32位有符號整數,content占用4byte。

1110 0000:表示64位有符號整數,content占用8byte。

1111 0000:表示24位有符號整數,content占用3byte。

1111 1110:表示8位有符號整數,content占用1byte。

1111 0001 - 1111 1101:沒有content部分,依次表示整數0-12。

  • content: 保存當前entry節點數據,可以是字符串或整數。

Ⅲ、ZIPLIST底層數據結構

Ⅳ、ZIPLIST數據結構存在問題

  • 查詢效率

數據過多,導致鏈表過長,可能影響查詢性能

  • 內存重分配&&連鎖更新

ZipList 在更新或者新增時候,如空間不夠則需要對整個列表進行重新分配。當新插入的元素較大時,可能會導致后續元素的prevlen 占用空間都發生變化,從而引起「連鎖更新」問題,導致每個元素的空間都

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

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

相關文章

【Linux系統】初見線程,概念與控制

前言: 上文我們講到了進程間信號的話題【Linux系統】萬字解析,進程間的信號-CSDN博客 本文我們再來認識一下:線程! Linux線程概念 什么是線程 概念定義: 進程內核數據結構代碼和數據(執行流) 線…

計算機視覺與深度學習 | 具身智能研究綜述:從理論框架到未來圖景

具身智能研究綜述:從理論框架到未來圖景 文章目錄 具身智能研究綜述:從理論框架到未來圖景 一、定義與核心特征 二、關鍵技術體系 2.1 感知-運動融合技術 2.2 認知架構 2.3 強化學習進展 三、發展歷程與里程碑 3.1 理論奠基期(1990-2005) 3.2 技術探索期(2006-2015) 3.3 …

玩轉deepseek之自動出試卷可直接導出word

小伙伴們,最近有新同事入職,經理讓我出一個關于sqlserver相關的試卷,想著既然有deepseek,我們就偷懶下直接用deepseek給我們自動生成出來。打開deepseek官網,輸入提示詞:出一套SQL的試題要有基礎考察&#…

Flutter 語聊房項目 ----- 禮物特效播放

在語聊房項目中,禮物特效播放是一個常見的需求,通常包括動畫、聲音等多種媒體形式。為了處理不同的禮物類型,我們可以采用抽象的設計方法,使得系統易于擴展和維護。設計架構思路:抽象禮物特效接口:定義一個…

如何實現文件批量重命名自動化

在編程、設計、數據處理等工作中,腳本或軟件往往要求文件名符合特定格式。 批量重命名可快速將文件調整為所需命名規則,避免手動操作出錯。 它的體積不到300KB,解壓后直接運行,完全綠色無安裝。 界面清爽,操作直觀&a…

【數據結構——圖與鄰接矩陣】

引入 樹的遍歷方式可分為深搜和廣搜,這同樣適用于圖,不過有些地方會有出入。 樹的節點結構從根到葉子節點都是1:n,到葉子節點后就沒有了。而對于圖來說,如果到了最底下的節點,它可能除了連接已經記錄過的上層節點&am…

Quarkus - 超音速亞原子Java,開啟云原生應用新視界!

Quarkus - 超音速亞原子Java框架 Quarkus 是一個以云為中心、優先考慮(Linux)容器的框架,專為編寫 Java 應用而設計。它旨在幫助開發者更輕松地構建和部署大規模的容器化 Java 應用,采用了一系列現代開發理念和標準。 核心特點 …

如何查看GPU運行情況:使用 Conda 安裝 nvitop 新手指南

文章目錄 ?? 1. 為什么推薦使用 Conda 環境安裝 ?? 2. 安裝步驟 步驟 1: 安裝 Miniconda 或 Anaconda (如果你還沒有安裝的話) 步驟 2: 創建并激活一個專門的 Conda 環境 步驟 3: 在 Conda 環境中安裝 nvitop 步驟 4: 驗證安裝 ?? 3. 疑難解答 ?? 4. nvitop 的基本使用…

遙感機器學習專欄簡介

專欄定位與受眾本專欄聚焦「機器學習 遙感應用」的落地實踐,專為遙感相關專業大學生、剛入門的遙感工程師、機器學習愛好者打造。避開純理論堆砌,以「實驗課式實操」為核心,幫你解決 “懂理論但不會用代碼落地”“遙感數據處理與模型結合難”…

【更新至2024年】1996-2024年各省農業總產值數據(無缺失)

【更新至2024年】1996-2024年各省農業總產值數據(無缺失) 1、時間:1996-2024年 2、來源:國家統計局、各省年檢 3、指標:農業總產值 4、范圍:31省 5、缺失情況:無缺失 6、指標解釋&#xf…

大語言模型預訓練流程

大語言模型訓練流程 Pre-training → SFT → RLHF階段1:預訓練Pre-training 海量無標注文本數據訓練自監督學習機制學習語言基礎知識掌握語法、語義、常識形成語言表示能力 核心目標:建立模型的語言理解和文本生成基礎能力 階段2:監督微調Sup…

Zookeeper:分布式協調服務

一、概念ZooKeeper 是一個分布式的、開源的分布式應用程序協調服務,為分布式應用提供一致性、配置管理、命名服務、分布式同步和組服務等。可以把它想象成一個為分布式系統提供的“文件系統”“通知機制”,但它存儲的不是普通的文件,而是少量…

海盜王客戶端BMP紋理圖片解密

海盜王客戶端的紋理貼圖bmp文件有些是加密,很多人想解密并修改替換,現在給出解密的python代碼: import os import struct import copy from pathlib import Pathclass TexEncode:def __init__(self):self.MAGIC_BYTES bmp.x # 魔法字節標識…

《鏈式二叉樹常用操作全解析》

目錄 一.求鏈式二叉樹節點個數 二.求鏈式二叉樹葉子節點個數 三.求鏈式二叉樹第k層節點個數 四.求鏈式二叉樹的深度/高度 五.鏈式二叉樹查找值為x的節點 六.鏈式二叉樹的銷毀 七. 測試函數 八. 總結: 前言: 在學習鏈式二叉樹的常用操作之前 我們需要手動創建一個二叉樹 在…

YOLO11目標檢測運行推理簡約GUI界面

YOLO11推理簡約GUI界面使用方法:支持pt和onnx格式模型,并且自動檢測設備,選擇推理設備選擇推理圖片所在的文件夾 選擇推理后的結果保存地址選擇所需要的置信度閾值點擊開始推理,程序自動運行 并在下方實時顯示推理進度非常方便不用每次都改代…

集值優化問題:理論、應用與前沿進展

本文由「大千AI助手」原創發布,專注用真話講AI,回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我,一起撕掉過度包裝,學習真實的AI技術! 1. 📚 集值優化問題概述 集值優化問題主要研究目標函數為…

提示工程架構師分享:如何用提示詞升級職業教育的實操案例教學?(萬字長文來襲,高能預警!!!)

引言:實操案例教學的“困境”,終于有了破局思路? 晚上10點,汽修專業的王強老師還在電腦前修改《汽車發動機異響故障排查案例》——這已經是他本周第四次調整方案了: 第一次授課時,學生反饋“案例太理想化&a…

「日拱一碼」087 機器學習——SPARROW

目錄 SPARROW 介紹 核心思想:稀疏掩碼訓練 與 Lottery Ticket Hypothesis (LTH) 的關系 代碼示例 代碼關鍵點解釋: 在機器學習領域,"SPARROW" 并不是一個像 Scikit-learn、TensorFlow 或 PyTorch 那樣廣為人知的通用框架或算法…

18、決策樹與集成學習 - 從單一智慧到群體決策

學習目標:理解決策樹的構建原理和分裂標準,掌握信息增益、基尼系數等概念,學會決策樹的剪枝方法,深入理解集成學習的思想,掌握隨機森林和梯度提升的基本原理。 > 從第17章到第18章:從概率模型到規則模型 在第17章中,我們學習了邏輯回歸——一個基于概率的線性分類器…

王道計算機組成原理 學習筆記

第一章計算機系統概述1.1計算機的發展歷程1.2計算機系統層次結構1.2.11.2.2 計算機硬件的基本組成1.2.2 各個硬件的工作原理1.2.3 計算機軟件1.2.4 計算機系統的層次結1.2.5 計算機系統的工作原理1.3計算機的性能指標第二章數據的表示和運算第三章存儲系統第四章指令系統第五章…