Redis 數據結構全景解析

在這里插入圖片描述


Redis 不是簡單的 key-value 緩存,它更像一把“瑞士軍刀”。
只要掌握數據結構,就能把同一份內存用出 10 倍效率。

0. 開場白:為什么聊數據結構?

面試常問“Redis 有幾種數據類型?”——很多人答 5 種(String、List、Hash、Set、ZSet)。
但 Redis 7.0 源碼里已出現 9 種編碼(encoding),未來還會更多。
理解“類型 vs 編碼”是區分菜鳥與專家的第一步。

對外類型(type)內部可能編碼(encoding)場景關鍵字
stringint、embstr、raw、sdshdr5…計數器、緩存
listziplist、quicklist消息隊列
hashziplist、hashtable對象緩存
setintset、hashtable去重、抽獎
zsetziplist、skiplist排行榜
streamrax + listpackKafka-lite
bitmap / hyperloglog / geo特殊緊湊編碼大數據去重、LBS

下面按使用頻率由淺入深展開。


1. String:最被低估的“全能選手”

  • 底層:簡單動態字符串(SDS),預分配策略減少 80% 內存重分配。
  • 三大絕技
    1. 緩存:SET / GET 常規操作。
    2. 計數器:INCR、INCRBY 原子自增,秒殺庫存必備。
    3. 分布式鎖:SET key value NX PX 30000 一條命令解決“SETNX + EXPIRE”非原子問題。
  • 面試題:為什么 512 MB 以下都用 embstr?
    答:embstr 將 redisObject 與 SDS 連續分配,一次 malloc,CPU cache 友好。

2. List:雙端隊列 & 阻塞隊列

  • 編碼進化史:ziplist(<=3.2) → quicklist(4.0) → listpack(7.0)。
  • 典型用法
    • 棧:LPUSH + LPOP
    • 隊列:RPUSH + LPOP
    • 阻塞隊列:BLPOP mylist 0(0 表示永不超時)
  • :ziplist 轉 quicklist 的閾值 list-max-ziplist-size -2,負值表示節點字節限制。

3. Hash:小對象之王

  • 閾值:hash-max-ziplist-entries 512 / hash-max-ziplist-value 64。
    小 Hash 用 ziplist,大 Hash 自動轉 hashtable,O(1) vs O(N) 差異巨大。
  • 實戰
    HSET user:1001 name kim age 18
    HINCRBY user:1001 age 1
    
    單 key 管理對象字段,比多個 String 省內存 30%+。

4. Set:無序去重 + 數學集合

  • 編碼:全整數且元素 ≤ set-max-intset-entries 512 → intset,否則 hashtable。
  • 花式用法
    • 抽獎:SRANDMEMBER lucky 1 隨機 1 人
    • 交并差:SINTER tag:redis tag:cache 找出共同標簽的文章。

5. Sorted Set:排行榜 & 延遲隊列

  • 底層:skiplist + dict 雙索引,O(logN) 范圍查詢 + O(1) 成員定位。
  • 排行榜
    ZINCRBY rank:2025 1 player:42
    ZREVRANGE rank:2025 0 9 WITHSCORES
    
  • 延遲隊列:score 存執行時間戳,用 ZRANGEBYSCORE 定時輪詢即可。

6. Stream:Redis 的 Kafka

  • 組成
    • 消息:XADD mystream * field value
    • 消費組:XGROUP CREATE mystream g1 $
  • 特點
    • 消息持久化,重啟不丟。
    • 支持 ACK、PEL(pending list),比 List 做隊列更可靠。

7. 三大“特種類型”

類型命令示例用途
BitmapSETBIT uv:20250801 10086 1日活統計(1 bit/用戶)
HyperLogLogPFADD ip:20250801 1.1.1.1去重計數,誤差 < 0.81%
GeoGEOADD shops 116.397 39.909 “beijing”附近 5 km 門店

8. 內存優化 3 板斧

  1. 編碼對齊DEBUG OBJECT key 看 encoding,針對性調閾值。
  2. 壓縮:開啟 list-compression-depth 2 對中間節點壓縮。
  3. 短結構:小數據量用 ziplist/listpack,可把內存壓到 1/8。

9. 小結與思維導圖

Redis 數據結構 = 對外類型 + 內部編碼 + 閾值參數↓用對結構,省內存,提性能

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

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

相關文章

ansible.cfg 配置文件的常見配置項及其說明

配置項說明默認值defaults默認配置部分inventory指定清單文件的位置&#xff0c;可以是文件路徑、目錄或動態清單腳本。/etc/ansible/hostsremote_user默認的遠程用戶roothost_key_checking是否啟用主機密鑰檢查。設置為 False 跳過 SSH 主機密鑰驗證。Trueask_pass是否在執行時…

Effective C++ 條款15:在資源管理類中提供對原始資源的訪問

Effective C 條款15&#xff1a;在資源管理類中提供對原始資源的訪問核心思想&#xff1a;RAII類需要提供訪問其封裝原始資源的顯式或隱式接口&#xff0c;以兼容需要直接操作資源的API&#xff0c;同時維持資源的安全管理。 ?? 1. 原始資源訪問的必要性 使用場景示例&#x…

Linux 進程管理與計劃任務設置

Linux 進程管理與計劃任務設置一、進程管理進程管理用于監控、控制系統中運行的程序&#xff08;進程&#xff09;&#xff0c;包括查看進程狀態、調整優先級、終止異常進程等。以下是核心命令及操作說明&#xff1a;1. 常用進程查看命令&#xff08;1&#xff09;ps&#xff1…

MYSQL數據庫之索引

1、引入索引的問題在圖書館查找一本書的過程&#xff0c;可類比數據庫查詢場景。在一般軟件系統中&#xff0c;對數據庫操作以查詢為主&#xff0c;數據量較大時&#xff0c;優化查詢是關鍵&#xff0c;索引便是優化查詢的重要手段 。2、索引是什么索引是一種特殊文件&#xff…

ArcGIS以及ArcGIS Pro如何去除在線地圖制作者名單

問題&#xff1a;ArcGIS和ArcGIS Pro提供了許多在線地圖服務&#xff0c;但是這些地圖會自動生成制作者名單&#xff0c;如下圖所示&#xff1a; 在線地圖加載方式可參考&#xff1a;如何在ArcGIS和ArcGIS Pro中添加在線底圖 這在出圖時有時會造成圖的部分信息遮擋或出圖不美觀…

InfluxDB 與 Golang 框架集成:Gin 實戰指南(二)

四、實際應用案例4.1 案例背景某智能工廠部署了大量的物聯網設備&#xff0c;如傳感器、智能儀表等&#xff0c;用于實時監測生產線上設備的運行狀態、環境參數&#xff08;如溫度、濕度&#xff09;以及生產過程中的各項指標&#xff08;如產量、次品率&#xff09;。這些設備…

Linux系統磁盤未分配的空間釋放并分配給 / 根目錄的詳細操作【openEuler系統】

選擇 Fix 修正 GPT 表 輸入 Fix 并按回車&#xff0c;parted 會自動&#xff1a; 擴展 GPT 表的 結束位置 到磁盤末尾。釋放未被使用的空間&#xff08;1048576000 個 512B 塊&#xff0c;約 500GB&#xff09;。 驗證修正結果 修正后&#xff0c;再次運行&#xff1a; parted …

王道考研-數據結構-01

數據結構-01視頻鏈接&#xff1a;https://www.bilibili.com/video/BV1b7411N798?spm_id_from333.788.videopod.sections&vd_source940d88d085dc79e5d2d1c6c13ec7caf7&p2 數據結構到底在學什么? 數據結構這門課他要學習的就是怎么用程序代碼把現實世界的問題給信息化&…

k8s云原生rook-ceph pvc快照與恢復(上)

#作者&#xff1a;Unstopabler 文章目錄前言部署rook-ceph on kubernets條件Ceph快照概述什么是PVC安裝快照控制器和CRD1.安裝crds資源2.安裝控制器3.安裝快照類前言 Rook 是一個開源的云原生存儲編排器&#xff0c;為各種存儲解決方案提供平臺、框架和支持&#xff0c;以便與…

springcloud04——網關gateway、熔斷器 sentinel

目錄 注冊中心 nacos | eurekaServer |zookeeper(dubbo) 配置中心 nacos | config Server 遠程服務調用 httpClient | RestTemplate | OpenFeign 負載均衡服務 ribbon | loadbalancer 網關 zuul | gateway 熔斷器 hystrix | sentinel 網關 sentinel 流控 壓測工具 1…

XSS跨站腳本攻擊詳解

一、XSS攻擊簡介跨站腳本攻擊的英文全稱是Cross-Site Scripting&#xff0c;為了與CSS有所區別&#xff0c;因此縮寫為“XSS”由于同源策略的存在&#xff0c;攻擊者或者惡意網站的JavaScript代碼沒有辦法直接獲取用戶在其它網站的信息&#xff0c;但是如果攻擊者有辦法把惡意的…

Linux /proc/目錄詳解

文章目錄前言文件說明注意事項前言 在 Linux 系統中&#xff0c;/proc 目錄是一個特殊的虛擬文件系統&#xff0c;它提供了對系統內核和進程的訪問。/proc 目錄中的文件和目錄不是真實存在的&#xff0c;它們是在運行時由內核動態生成的&#xff0c;用于提供系統和進程的相關信…

北斗變形監測在地質災害監測中的應用

內容概要 北斗形變監測系統在地質災害監測領域發揮著核心作用&#xff0c;該系統基于北斗衛星導航技術&#xff0c;實現對地表變形的精確追蹤。通過毫米級精度定位能力&#xff0c;北斗形變監測技術為滑坡等災害提供關鍵數據支撐&#xff0c;尤其在偏遠地區應用中&#xff0c;單…

2025新征程杯全國54校園足球錦標賽在北京世園公園隆重開幕

2025年8月1日&#xff0c;備受矚目的2025新征程杯全國54校園足球錦標賽&#xff08;北京&#xff09;在北京世園公園盛大拉開帷幕。開幕式上&#xff0c;中國關心下一代健康體育基金會副秘書長、中國青少年研究會理事、全國 54 校園足球人才培養計劃創始人何占強主任表示&#…

分類預測 | Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測

分類預測 | Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測 目錄分類預測 | Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測分類效果基本介紹程序設計分類效果 基本介紹 1.Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測&#xff0c;運…

機器學習——邏輯回歸(LogisticRegression)的核心參數:以約會數據集為例

理解 LogisticRegression 的核心參數&#xff1a;以約會數據集為例 邏輯回歸&#xff08;Logistic Regression&#xff09;是機器學習中一種基礎且重要的分類算法&#xff0c;特別適用于解決二分類和多分類問題。本文將基于 sklearn.linear_model.LogisticRegression 的用法&a…

深入解析 Apache Flink FLIP-511:優化 Kafka Sink 事務處理,減輕 Broker 負載

一、 背景與核心問題&#xff1a;Kafka Sink 事務的痛點 Flink Kafka Sink 在 Exactly-Once 模式下依賴 Kafka 事務來確保數據寫入的原子性&#xff0c;并與 Flink 檢查點對齊。然而&#xff0c;非優雅關閉&#xff08;如任務失敗、非 stop-with-savepoint 的停止&#xff09;會…

設計模式:組合模式 Composite

目錄前言問題解決方案結構代碼前言 組合是一種結構型設計模式&#xff0c;你可以使用它將對象組合成樹狀結構&#xff0c;并且能像使用獨立對象一樣使用它們。 問題 如果應用的核心模型能用樹狀結構表示&#xff0c; 在應用中使用組合模式才有價值。 例如&#xff0c; 你有兩…

嵌入式 C 語言入門:函數封裝與參數傳遞學習筆記 —— 從定義到內存機制

前言 大家好&#xff0c;這里是 Hello_Embed。在前一篇筆記中&#xff0c;我們用循環實現了 LED 閃爍&#xff0c;其中重復使用了兩段幾乎一樣的延時代碼&#xff1a; for(i 0; i < 100000000; i); // 延時這種重復不僅讓代碼冗余&#xff0c;還不利于后續修改&#xff08…

第一個大語言模型的微調

模型推理 現在,我們的模型應該能夠針對輸入的任何短句生成類似尤達大師風格的句子作為回應。 該模型要求其輸入格式規范。我們需要構建一個 “消息” 列表 —— 在這個案例中,就是來自用戶的消息 —— 并通過提示表明輪到模型進行輸出,以促使其做出回答。 add_generation…