這次我把Redis數據類型寫出了花✿❀🎉~~~

来源:https://www.cnblogs.com/jiagooushi/archive/2022/12/12/16975929.html
-Advertisement-
Play Games

1. String 字元串是 Redis 最基本的數據類型,不僅所有 key 都是字元串類型,其它幾種數據類型構成的元素也是字元串。註意字元串的長度不能超過 512M。 1.1 編碼方式(encoding) 字元串對象的編碼可以是 int ,raw 或者 embstr 。 int 編碼:保存的是可以 ...


1. String

字元串是 Redis 最基本的數據類型,不僅所有 key 都是字元串類型,其它幾種數據類型構成的元素也是字元串。註意字元串的長度不能超過 512M。

1.1 編碼方式(encoding)

字元串對象的編碼可以是 int ,raw 或者 embstr 。

  • int 編碼:保存的是可以用 long 類型表示的整數值。
  • embstr 編碼:保存長度小於 44 位元組的字元串(redis3.2 版本之前是 39 位元組,之後是 44 位元組)。
  • raw 編碼:保存長度大於 44 位元組的字元串(redis3.2 版本之前是 39 位元組,之後是 44 位元組)。

<file

int 編碼是用來保存整數值,而 embstr 是用來保存短字元串,raw 編碼是用來保存長字元串。

1.2 raw 編碼

file
*ptr 指向實際 SDS 存儲位置。記憶體不連續

1.3 embstr 編碼

file

記憶體連續,意味著 redis 在申請記憶體空間時只需要調用一次申請記憶體函數,減少用戶態內核態交換,效率高。

1.4 int 編碼

如果存儲的字元串是整數值,並且大小在 LONG_MAX 範圍內,則會採用 INT 編碼:直接將數據保存在 RedisObject 的 ptr 指針位置(剛好 8 位元組),不再需要 SDS 了。

1.5 總結

file

2. List

list 列表,它是簡單的字元串列表,按照插入順序排序,你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊),它的底層實際上是個鏈表結構。

2.1 編碼方式(encoding)

列表對象的編碼是 quicklist。 (之前版本中有 linkedList 和 ziplist 這兩種編碼。進一步的,目前 Redis 定義的 10 個對象編碼方式巨集名中,有兩個被完全閑置了,分別是: OBJ_ENCODING_ZIPMAP 與 OBJ_ENCODING_LINKEDLIST。 從 Redis 的演進歷史上來看,前者是後續可能會得到支持的編碼值(代碼還在), 後者則應該是被徹底淘汰了)

2.2 記憶體佈局

file

3. Set

集合對象 set 是 string 類型(整數也會轉換成 string 類型進行存儲)的無序集合。註意集合和列表的區別:集合中的元素是無序的,因此不能通過索引來操作元素;集合中的元素不能有重覆。

3.1 編碼方式(encoding)

集合對象的編碼可以是 intset 或者 hashtable; 底層實現有兩種,分別是 intset 和 dict 。 顯然當使用 intset 作為底層實現的數據結構時,集合中存儲的只能是數值數據,且必須是整數;而當使用 dict 作為集合對象的底層實現時,是將數據全部存儲於 dict 的鍵中,值欄位閑置不用.

3.2 記憶體佈局

file

3.3 編碼轉換

當集合同時滿足以下兩個條件時,使用 intset 編碼:

  1. 集合對象中所有元素都是整數
  2. 集合對象所有元素數量不超過 512

不能滿足這兩個條件的就使用 hashtable 編碼。第二個條件可以通過配置文件的 set-max-intset-entries 進行配置。

4. Zset

和上面的集合對象相比,有序集合對象是有序的。與列表使用索引下標作為排序依據不同,有序集合為每個元素設置一個分數(score)作為排序依據。

4.1 編碼方式(encoding)

  • SkipList & HT(Dict):SkipList 可以排序,並且可以同時存儲 score 和 ele 值(member);HT 可以鍵值存儲,並且可以根據 key 找 value
  • ZipList :當 節點 entry 數量 小於 128 並且 每個節點大小小於 64kb 時採用

4.2 記憶體結構

SkipList & HT(Dict)
file

ZipList

file

當元素數量不多時,HT 和 SkipList 的優勢不明顯,而且更耗記憶體。因此 zset 還會採用 ZipList 結構來節省記憶體,不過需要同時滿足兩個條件:

  • 元素數量小於 zset_max_ziplist_entries,預設值 128
  • 每個元素都小於 zset_max_ziplist_value 位元組,預設值 64

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

  • ZipList 是連續記憶體,因此 score 和 element 是緊挨在一起的兩個 entry, element 在前,score 在後
  • score 越小越接近隊首,score 越大越接近隊尾,按照 score 值升序排列

5. Hash

哈希對象的鍵是一個字元串類型,值是一個鍵值對集合。

5.1 編碼方式(encoding)

哈希對象的編碼可以是 ziplist 或者 hashtable;對應的底層實現有兩種,一種是 ziplist, 一種是 dict。

5.2 記憶體佈局

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

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

區別如下:

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

當 Hash 中數據項比較少的情況下,Hash 底層才⽤壓縮列表 ziplist 進⾏存儲數據,隨著數據的增加,底層的 ziplist 就可能會轉成 dict,具體配置如下:

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

本文由傳智教育博學谷教研團隊發佈。

如果本文對您有幫助,歡迎關註點贊;如果您有任何建議也可留言評論私信,您的支持是我堅持創作的動力。

轉載請註明出處!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • dubbo當前版本 2.7.3 期望升級到 3.0.11。 升級過程 maven依賴變更 <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>3.0.11</version> ...
  • 前言 本文給大家分享的是如何通過利用Python實現多功能音樂播放器,廢話不多直接開整~ 開發工具 Python版本: 3.6 相關模塊: os模塊 sys模塊 time模塊 random模塊 PyQt5模塊 環境搭建 安裝Python並添加到環境變數,pip安裝需要的相關模塊即可。 文中完整源碼, ...
  • 官方資料 官方解釋: https://pkg.go.dev/cmd/go#hdr-Build_constraints ,go help buildconstraint 也能看到描述 根據官方描述,go1.16開始建議使用go:build方式,與+build相比更容易被人閱讀。 有關go:build註 ...
  • keepalived 主備使用 本篇主要介紹一下 keepalived 的基本的 主備使用 1.概述 什麼是 keepalived呢,它是一個集群管理中 保證集群高可用的軟體,防止單點故障,keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual Router Redundanc ...
  • 有了非對稱密鑰、摘要、對稱密鑰等現代密碼學演算法與技術,是不是就能夠保證通信的安全無虞呢,並不是。 密碼學在互聯網應用的四個目標:機密性、完整性、身份驗證、防抵賴。到目前為止,我們討論的技術中,其中防抵賴的目標並沒有達到。 假設A、B、C三個人共用一個對稱加密演算法密鑰,現在A和B互相通信,A和B一直認 ...
  • 多線程程式 競態條件:多線程程式執行的結果是一致的,不會隨著CPU對線程不同的調用順序而產生不同的運行結果. 解決?:互斥鎖 mutex 經典的賣票問題,三個線程賣100張票 代碼1 #include <iostream> #include <thread> #include <list> #inc ...
  • C++語言層面多線程=>好處:跨平臺 windows/linux thread/mutex/condition_variable lock_gurad/unique_lock atomic/原子類型,基於CAS操作的原子類型 線程安全的 睡眠sleep_for C++ thread => windo ...
  • JZ45 把數組排成最小的數 描述 輸入一個非負整數數組numbers,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。 例如輸入數組[3,32,321],則列印出這三個數字能排成的最小數字為321323。 1.輸出結果可能非常大,所以你需要返回一個字元串而不是整數 2.拼接 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...