Redis——五種數據類型

目錄

前言

1.String

1.1RAW編碼

1.2EMBSTR編碼

1.3 INT編碼

?2.List

3.Set

3.1 InSet編碼轉化成Dict編碼

4.ZSet

4.1結合SkipList和HT實現

?4.2使用ZipList實現

4.3編碼轉換?

4.4 ZipList排序功能

5.Hash

5.1Hash底層存儲結構

6.Redis數據結構和數據類型關系圖?


前言

?Redis 中的每種數據類型都由特定的數據結構來實現,數據結構為數據類型提供了底層的存儲和操作機制。

不同的數據類型具有不同的特性和應用場景,數據結構的選擇和設計是為了更好地滿足這些特性

數據結構是實現數據類型的基礎,它們共同構成了 Redis 強大的功能體系,使得 Redis 能夠在不同的應用場景中,根據數據的特點和操作需求,選擇合適的數據類型和對應的數據結構來高效地處理和管理數據。

1.String

String是Redis中最常見的數據存儲類型:

其基本編碼方式是RAW,基于簡單動態字符串(SDS)實現,存儲上限為512mb。

查看編碼:object encoding key

1.1RAW編碼

ptr指針指向SDS,RedisObject和SDS是兩個獨立空間所以會有尋址過程通過ptr指針找到SDS。所以會有兩次申請內存空間,釋放內存也會有兩次內存釋放,效率比較低。

1.2EMBSTR編碼

如果存儲的SDS長度小于44字節,EMBSTR編碼,此時object head與SDS是一段連續空間。申請內存時只需要調用一次內存分配函數,效率更高。

好處:減少內存碎片

Redis 通常按頁分配內存,使用 jemalloc 等內存分配器,它會分配 8、16、32、64 等字節的內存塊。對于小于 44 字節的字符串,采用 embstr 編碼可以將其存儲在一個連續的 64 字節內存塊中,減少了內存碎片的產生

如果字符串較長,超過 44 字節,為其單獨分配內存空間(轉為 raw 編碼),采用常規的 robj 和SDS分離方案性能下降,產生內存碎片

1.3 INT編碼

如果存儲的字符審是整數值,并且大小在LONG_MAX范圍內,INT編碼,直接將數據保存在RedisObject的ptr指針位置(剛好8字節),不再需要SDS了。


?2.List

Redis的List結構類似雙端鏈表,可以從首尾操作列表中的元素

選擇何種數據結構呢?

  1. LinkList:普通鏈表,可以從雙端訪問,鏈表每個節點都是獨立的內存,節點與節點之間的訪問通過指針,指針比較占用內存,內存碎片較多。
  2. ZipList:壓縮列表,可以從雙端訪問,內存占用較低,存儲上限低。如果一次性存儲大量內存需要申請大量內存空間比較困難。
  3. QuickList:LinkedList+ZipList,可以雙端訪問,內存占用較低,包含多個ZipList,存儲上限高。

在3.2版本之前,Redis采用ZipList來實現List,當元素數量小于512并且元素大小小于64字節時采用ZipList編碼,超過則采用LinkedList編碼。


在3.2版本之后,redis統一采用QuickList來實現List。Redis 可以通過list-max-ziplist-size參數來控制每個 ZipList 節點的大小,通過list-compress-depth參數來控制 QuickList 的壓縮深度,即鏈表兩端不壓縮的節點數量,以此來平衡內存使用和操作性能。

插入元素底層源碼

整體內存結構


3.Set

Set是Redis中的單列集合,滿足下列特點:

  • 不保證有序性
  • 保證元素唯一(可以判斷元素是否存在)
  • 求交集,并集,差集

不管是插入元素還是求交集等等這些操作都需要判斷元素是否存在,這樣就需要選擇對元素查詢效率較高的數據結構

  • 為了查詢效率和唯一性,set采用HT編碼(Dict)Dict中的key用來存儲元素,value統一為null
  • 當存儲的所有數據都是整數,并且元素數量不超過set-max-intset-entset會采用IntSet編碼,以節省內存。

判斷用哪種數據結構底層源碼

創建IntSet數據結構底層源碼

創建Dict數據結構底層源碼

整體執行源碼

3.1 InSet編碼轉化成Dict編碼

當元素數量超過set-max-intset-entries或者存儲元素不是數字了時會自動轉換成Dict編碼

執行結構圖:

當插入一個元素為m1字符串時會升級為Dict編碼,創建Dict數據結構

RedisObject指針ptr指向Dict,encoding編碼改為Dict


4.ZSet

ZSet也就是SortedSet,其中每個元素都需要指定一個score值和member值:

可以根據score值排序

member必須唯一

可以根據member查詢分數

因此,ZSet底層數據結構必須滿足鍵值存儲鍵必須唯一可排序這幾個需求。

4.1結合SkipList和HT實現

  • SkipList:可以排序,并且可以同時存儲score和ele值(member) | 滿足鍵值存儲和可排序
  • HT(Dict):可以鍵值存儲,并且可以根據key找value | 滿足高效查詢鍵值唯一

所以ZSet底層是使用這兩種數據結構來實現的dict用于快速查找SkipList用于鍵值存儲和排序

底層源碼:

內存圖:

?4.2使用ZipList實現

使用上述那種方式這樣帶來的壞處就是ZSet非常占用內存空間,使用兩種數據結構,存儲兩份。

當元素數量不多時,HT和SkipList的優勢不明顯,而且更耗內存。因此Zset還會采用ZipList不過需要同時滿足兩個條件:

  • 元素數量小于zset_max_ziplist_entries,默認值128
  • 每個元素都小于zset_max_ziplist_value字節,默認值64

底層判斷使用哪種數據結構如下:

4.3編碼轉換?

既然ZSet底層都是用來兩種編碼方式根據不同情況,那么肯定會出現編碼轉換,添加元素不滿足一下兩個條件就會觸發編碼轉換。

  • 元素數量小于zset_max_ziplist_entries,默認值128
  • 每個元素都小于zset_max_ziplist_value字節,默認值64

底層執行源碼:

4.4 ZipList排序功能

ZipList本身沒有排序功能,而且沒有鍵值對的概念,因此需要有zset通過編碼實現:

  • ZipList是連續內存,因此score和element是緊換在一起的兩個entry,element在前,score在后
  • score越小越接近隊首,score越大越接近隊尾,按照score值升序排列

底層結構圖:

因為元素比較少ZipList內存中是連續存儲的,所以查找的時候就去遍歷,插入元素的時候按照大小順序插入,這樣就保證了排序。性能也不錯。


5.Hash

Hash結構與Redis中的Zset非常類似:

  • 都是鍵值存儲
  • 都需要根據鍵獲取值
  • 鍵必須唯一

區別如下:

  • zset的鍵是member,值是score;hash的鍵和值都是任意值
  • zset要根據score排序;hash則無需排序

5.1Hash底層存儲結構

  • Hash結構默認采用ZipList編碼,用以節省內存。ZipList中相鄰的兩個entry分別保存field和value
  • 當數據量較大時,hash結HT編碼,也就是Dict,觸發條件有兩個:

????????????????ziplist中的元素數量超過了hash-max-ziplist-entries(默認512)
????????????????ziplist中的任意entry大小超過了hash-max-ziplist-value(默認64字節)

轉換流程:

觸發條件達成轉換編碼

6.Redis數據結構和數據類型關系圖?

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

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

相關文章

zookeeper啟動報錯have small server identifier

解決方案: 1、查看myid是否有重復 2、查看server.X 與myid的X是否一致 3、啟動順序為myid從小到大的服務器順序

#Linux動態大小裁剪以及包大小變大排查思路

1 動態庫裁剪 庫分為動態庫和靜態庫,動態庫是在程序運行時才加載,靜態庫是在編譯時就加載到程序中。動態庫的大小通常比靜態庫小,因為動態庫只包含了程序需要的函數和數據,而靜態庫則包含了所有的函數和數據。靜態庫可以理解為引入…

消息隊列生產者投遞的高可靠性與一致性保障方案

在構建高可靠分布式系統時,確保業務數據庫與消息隊列(MQ)之間的一致性是一項核心挑戰。尤其當使用 Kafka 作為消息隊列中間件時,如何避免“數據庫寫入成功,但消息發送失敗”或“消息重復發送”等問題,成為系…

Formality:Bug記錄

相關閱讀 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 本文記錄博主在使用Synopsys的形式驗證工具Formality中遇到的一個Bug。 Bug復現 情況一 // 例1 module dff (input clk, input d_in, output d_out …

通信算法之267 : DJI無人機 云哨 DroneID 640ms

DJI 無人機 與DroneID 轉 *** 載 0x01 摘要 消費級無人機可以用于高級航拍、物流和人道主義救援等等。但是其廣泛使用給安全、安保和隱私帶來了許多風險。例如,攻擊方可能會使用無人機進行監視、運輸非法物品,或通過侵入機場上方的封閉空域造成經濟損…

論壇測試報告

作者前言 🎂 ??????🍧🍧🍧🍧🍧🍧🍧🎂 ?🎂 作者介紹: 🎂🎂 🎂 🎉🎉&#x1f389…

npx 的作用以及延伸知識(.bin目錄,npm run xx 執行)

文章目錄 前言原理解析1. npx 的作用2. 為什么會有 node_modules/.bin/lerna3. npx 的查找順序4. 執行流程總結1: 1. .bin 機制什么是 node_modules/.bin?例子 2. npx 的底層實現npx 是如何工作的?為什么推薦用 npx?npx 的特殊能力…

【c語言】深入理解指針3——回調函數

一、回調函數 回調函數:通過函數指針調用的函數. 當把一個函數的地址傳遞給另一個函數,通過該地址去調用其指向的函數,那么這個被調用的函數就是回調函數. 示例: 在【深入理解指針2】中結尾寫了用函數指針實現計算器的功能&#…

HTTP 核心概念

🧑 博主簡介:CSDN博客專家,歷代文學網(PC端可以訪問:https://literature.sinhy.com/#/literature?__c1000,移動端可微信小程序搜索“歷代文學”)總架構師,15年工作經驗,…

VidBot:從野外 2D 人體視頻中學習可泛化的 3D 動作,實現零樣本機器人操控

25年3月來自慕尼黑工大、瑞士 ETH 和微軟的論文“VidBot: Learning Generalizable 3D Actions from In-the-Wild 2D Human Videos for Zero-Shot Robotic Manipulation”。 未來的機器人被設想為能夠執行各種家務的多功能系統。最大的問題仍然是,如何在盡量減少機器…

Linux 日常運維命令大全

Linux 作為一種開源操作系統,在服務器運維中扮演著重要角色。掌握常用的 Linux 命令對于運維人員而言至關重要。本文將整理一份 Linux 服務器運維常用命令大全,幫助你在日常工作中提高效率和準確性。 1. 基礎命令 基礎命令是Linux操作的起點&#xff0…

編程規范之枚舉

編程規范之枚舉 1.1 初始化枚舉項 枚舉平時用的也沒有很頻繁,今天看代碼規范提到枚舉類型初始化枚舉項。并對初始化枚舉項進行了歸納。包括下面三個 不進行顯示初始化,交由編譯器完成。 對第一個枚舉項的顯式初始化,這樣可以強制整數值的…

《軟件設計師》復習筆記(12.1)——范圍管理、進度管理

目錄 一、范圍管理 1. 核心概念 2. 范圍管理過程 WBS(工作分解結構)示例 真題示例: 二、進度管理 1. 核心過程 2. 關鍵工具與技術 真題示例: 一、范圍管理 1. 核心概念 項目范圍:為交付產品必須完成的工作…

過去十年前端框架演變與技術驅動因素剖析

一、技術演進脈絡(2013-2023) 2013-2015:結構化需求催生框架雛形 早期的jQuery雖然解決了跨瀏覽器兼容性問題(如IE8兼容性處理),但其松散的代碼組織方式難以支撐復雜應用開發。Backbone.js的出現首次引入M…

中華傳承-醫山命相卜-梅花易數

梅花易數 靈活起卦(如數字、聲音、外應等)和象數結合,準確率可達96.8%。其起卦方式擺脫傳統龜殼、蓍草的繁瑣,強調直覺與靈活性。 個人決策、事件預測等 尤其在短期、具體問題上表現突出。

如何用Brower Use WebUI實現網頁數據智能抓取與分析?

作者:算力魔方創始人/英特爾創新大使劉力 Browser-use是一款能讓AI智能體像人類一樣操作網頁的創新工具,與傳統網絡爬蟲技術相比,Browser-use能模擬人瀏覽并操作網頁,在采集網站數據時,不會被網站反爬機制識別和封禁&…

LIMS引領綜合質檢中心數字化變革,賦能質量強國戰略

在質量強國戰略的深入推進下,我國綜合質檢機構迎來了前所未有的發展機遇,同時也面臨著諸多嚴峻挑戰。隨著檢測領域從傳統的食品藥品監督向環境監測、新材料檢測等新興領域不斷拓展,跨領域協同管理的復雜度呈指數級增長。作為提升產品質量的關…

簡單好用的在線工具

用AI寫了一些在線工具,簡介好用,推薦給大家,歡迎大家使用并提議意見。 網址:https://www.bittygarden.com/ 目前已有以下功能: MD5SM3SHAUnicode 編碼Unicode 解碼Base32 編碼Base32 解碼Base64 編碼Base64 解碼URL …

阿里云服務器搭建開源版禪道

一,下載地址:禪道11.5版本發布,主要完善細節,修復bug,新增動態過濾機制 - 禪道下載 - 禪道項目管理軟件 下載地址二: 禪道21.6.stable 實現舊編輯器撰寫的文檔無感升級至新版編輯器 - 禪道下載 - 禪道項目…

leetcode 309. Best Time to Buy and Sell Stock with Cooldown

目錄 題目描述 第一步,明確并理解dp數組及下標的含義 第二步,分析并理解遞推公式 1.求dp[i][0] 2.求dp[i][1] 3.求dp[i][2] 第三步,理解dp數組如何初始化 第四步,理解遍歷順序 代碼 題目描述 這道題與第122題的區別就是賣…