【Redis】解碼Redis中hash類型:理解基礎命令,以及內部編碼方式和使用場景

📚?前言

🌟🌟🌟精彩讀導

本次我們將全面剖析Redis的核心技術要點,包括其豐富的數據類型體系、高效的編碼方式以及秒級響應的性能奧秘。對于渴望深入理解Redis底層機制的技術愛好者,這是一次難得的學習機會!

🔍 推薦擴展閱讀

想了解更多數據庫技術干貨?歡迎訪問小編的CSDN技術博客: 👉GGBondlctrl-CSDN博客 👈 (持續更新分布式系統、中間件等深度技術文章)

💖 讀者互動

您的每一個👍點贊、?收藏和??評論,都是我們持續輸出優質技術內容的強大動力!期待在評論區看到您的見解~

目錄

📚?前言

📚?1.hash類型基礎認識

📚?2.基礎命令

🚀2.1hset & hmset

🚀2.2hget & hmget

🚀2.3hexists

🚀2.4hdel

🚀2.5hkeys

🚀2.6hvals

🚀2.7hgetall

🚀2.8hlen & hstrlen

🚀2.9hsetnx

🚀2.10hincrby & hincrbyfloat

📚?3.hash的編碼方式

🚀3.1ziplist 與hashtable

🚀3.2listpack

📚?4.?hash類型的使用場景

🚀4.1作為緩存

🚀4.2哈希類型和關系型數據庫


📚?1.hash類型基礎認識

?如圖下所示:

在Redis的哈希類型數據結構中,數據存儲采用了一種嵌套的鍵值結構,稱為field-value對,這與Redis整體架構中的key-value對需要明確區分。這里的value特指field對應的具體值,而非外層鍵key對應的值。

這種雙層映射結構的具體表現為:

  1. 第一層是key-value結構,其中key是哈希表在Redis中的唯一標識符
  2. 第二層是field-value結構,存在于每個哈希表內部

field:相當于哈希表中的字段名
value:該字段對應的具體數據值?

📚?2.基礎命令

🚀2.1hset & hmset

hset key field value field2 value2

這里要具體說明一下,其實這兩個關鍵命令是效果是一樣的,沒有什么本質的區別;都可以實現設置一個或者多個鍵值對;

小編的演示如下:

很顯然發現,返回就是成功設置的鍵值對的個數~~~

🚀2.2hget & hmget

hget key field
hmget key field field2 field3

即一次獲取對應key中field鍵的值,或者一次獲取對飲key中多個field的值

演示如下所示:

🚀2.3hexists

判斷hash中是否存在指定的值

hexists key field

即獲取對應key中鍵field對應的值value是否是存在的,若不存在就直接返回0,存在就返回1

注意:這里是不支持多個field的查找的,只能一個一個進行判斷field對應的值是否是存在的;

🚀2.4hdel

del刪除key,hdel刪除field,可以指定多個

hdel key field1 field2 field3

返回的值就是成功刪除的個數;

🚀2.5hkeys

獲取hash中所有的字段,即所有的field(鍵)

hkeys key

遍歷所有的hash,這里的時間復雜度就是O(N);這里的N隨著表示不同,對應的值也是不一樣的

🚀2.6hvals

獲取hash中所有的value;與hkeys相對

hvals key

上述獲取field或者value,如果此時hash表中內容非常大,那么很有可能會阻塞我們的redis服務器

🚀2.7hgetall

所有的key以及value都會獲取得到

hgetall key

🚀2.8hlen & hstrlen

hlen key
hstrlen key field

獲取hash的長度,即鍵值對的個數,演示如下所示:

第二個命令就是獲取指定field對應的value的長度,單位是字節

🚀2.9hsetnx

hsetnx key field value

不存在就進行設置,若存在則不進行設置,這里和我們字符串中的setnx是差不多一致的;

🚀2.10hincrby & hincrbyfloat

hincrby可以加減整數

hincrbyfloat:可以加減小數

hincrby key field 10

很明顯,這里需要我們的value的值為內部編碼一個整型,而不是字符串類型

好啦,關于hash類型的命令大概就是這些,大家可以按照命令,自己嘗試嘗試~~~

📚?3.hash的編碼方式

🚀3.1ziplist 與hashtable

ziplist即壓縮列表,這里小編之前已經講解過了,這里就是為了節省空間,但是代價就是進行讀寫元素的速度比較慢,如果元素比較少,那么這里的讀取速度影響就是不大的

hashtable表示普通的hash表,可能會浪費一定的空間,例如hash是一個數組,數組上有一些位置上是沒有元素的,但是這里的讀取速度是比較快的

元素個數比較少:ziplist

元素個數比較多:hashtable

注意:每個value的長度都比較短,ziplist,如果某個value的長度太長了,也會轉變化為hashtable

配置項:

hash-max -ziplist-entries配置元素個數(默認512個)

hash-max-ziplist-value來進行配置value的閾長度(默認64字節)

位置:cd /etc/redis下的redis.conf文件中

這里為啥進行編碼判斷的時候,顯示的不是上述兩種呢???那就是更新后的內部編碼了

🚀3.2listpack

定位:?? Redis 設計的、ziplist 的??替代者??。

??核心設計:?? 緊湊的連續內存存儲。

最大亮點:?? 解決了 ziplist 的??級聯更新??問題,通過在每個 entry ??末尾??存儲自身長度(backlen)并??倒序編碼??來實現。

  • 優點:??
    • 內存占用小、緊湊。
    • 插入/刪除操作??復雜度穩定??(O(1) 或 O(M),局部影響,無連鎖反應)。
    • 良好的內存局部性(CPU緩存友好)。

??ListPack 成功繼承了 ziplist 的緊湊空間優勢并解決了其級聯更新的問題。Redis 巧妙地利用 ListPack 作為小集合的一種極其節省內存的存儲格式(犧牲了 O(1) 查找以換取空間),并在數據增長時自動切換到 hashtable 以提供 O(1) 查找性能。

???ListPack 的“讀取”:?? ListPack 支持的快速操作是??正向或反向的迭代(遍歷)??,得益于其 backlen 的設計(O(1) 跳到下一個或上一個 entry 的起始位置)。但這種迭代是針對??順序訪問??優化的,??不是針對隨機查找??某個特定元素優化的。

這里說明:listpack是ziplist的優化,但是查找的時間復雜度還是O(N),不是hashtable與ziplist的結合,這里小編前面一篇文章寫錯了,這里糾正一下

太長的情況下還是:hashtable的編碼方式

📚?4.?hash類型的使用場景

🚀4.1作為緩存

有以下表:

轉化為redis的表示方式:

當然這里string也是可以完成的,但是如果只修改其中一個field,就需要讀出整個json解析為對象后,進行修改之后,再次轉化為json;

使用string類型進行表示:

優點:?操作簡單??存儲效率 (對于整體存取)。 支持原子操作incr,??支持數據過期ttl,靈活性 (存儲格式)(json,自定義二進制...)

缺點:本身的序列化和反序列化需要一定開銷,同時如果總是操作個別屬性則不靈活

而使用hash的方式比較簡單了

hash的表示方式

優點:簡單。直觀,靈活;尤其是在針對信息的局部變更或者獲取操作

缺點:需要控制哈希在ziplist和hashtable兩種內部編碼轉化,可能會造成內存的較大消耗

🚀4.2哈希類型和關系型數據庫

哈希類型是稀疏的,而關系型數據庫就是完全結構化的例如,哈希類型每個鍵都有不同的field,但是,關系型數據庫一旦添加新的列,所有行都要為它設置值,即時為null

關系型數據庫可以做復雜的關系查詢,redis去模擬關系型復雜查詢,會導致維護成本過高,甚至基本不可能

問題:為啥不使用uid作為我們的key,而是重新設置一個key呢?

?

如果不存其實也是可以的;但是,在代碼編寫中,一般都會把uid在value中再存一份,后續在編寫相關代碼來說,使用起來更加方便

🌅🌅🌅~~~~最后希望與諸君共勉,共同進步!!!


💪💪💪以上就是本期內容了, 感興趣的話,就關注小編吧。

? ? ?? 😊😊??期待你的關注~~

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

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

相關文章

AI工具在學術寫作中的倫理邊界與誠信規范的平衡

AI寫作助手的興起與爭議 人工智能技術的飛速發展,學境思源,ChatGPT、Grok、Claude 等AI寫作工具逐漸走入高校師生的視野。一鍵生成論文初稿!從課程作業到畢業論文,不少學生已經嘗試讓AI參與寫作過程,希望借此提升效率…

課程專注度分析系統項目

前端代碼: <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>課堂專注度分析系統 - 科技…

區塊鏈是什么

區塊鏈的本質與機制 1. 核心定義 區塊鏈 加密的分布式記賬技術&#xff0c;融合密碼學、網絡學、金融學三大學科。 去中心化&#xff1a;數據存儲于全網節點&#xff08;如百萬臺計算機&#xff09;&#xff0c;而非單一數據庫。不可篡改&#xff1a;修改數據需控制全網51%以…

用可觀測工具高效定位和查找設計中深度隱藏的bug

軟件仿真擁有最佳的信號可見性和調試靈活性,被大多數工程師熟練使用,能夠高效捕獲很多顯而易見的常見錯誤。 然而,由軟件實現的數字仿真過程運行速度有限,很難做到100%代碼覆蓋。導致那些深度隱藏的設計問題,將不可避免的逃逸,只能以FPGA在線調試方式解決。 01 為什么全…

華為OD-2024年E卷-字符串化繁為簡[200分] -- python

問題描述&#xff1a; 給定一個輸入字符串&#xff0c;字符串只可能由英文字母(a~z、A~Z) 和左右小括號((、))組成。當字符串里存在小括號時&#xff0c;小括號是成對的&#xff0c;可以有一個或多個小括號對&#xff0c;小括號對不會嵌套&#xff0c;小括號對內可以包含1個或…

使用sealos安裝k8s

一、準備工作&#xff08;所有節點需執行&#xff09;? 1、系統要求 操作系統&#xff1a;本文為Ubuntu 20.0.4 配置&#xff1a;不同主機名、時間同步、SSH 免密互通、關閉防火墻/SELinux/swap。 資源&#xff1a;建議 ≥2核 CPU、2GB 內存&#xff08;生產環境需更高&am…

Pytorch 實戰四 VGG 網絡訓練

系列文章目錄 文章目錄 系列文章目錄前言一、源碼1. 解決線程沖突2.代碼框架 二、代碼詳細介紹1.基礎定義2. epoch 的定義3. 每組圖片的訓練和模型保存 前言 前面我們已經完成了數據集的制作&#xff0c;VGG 網絡的搭建&#xff0c;現在進行網絡模型的訓練。 一、源碼 import t…

課程專注度分析系統文檔

一、項目概述 本項目基于 Flask 框架開發&#xff0c;結合計算機視覺技術&#xff08;利用 YOLOv10 等模型 &#xff09;&#xff0c;實現對課堂視頻的智能分析。可檢測視頻中學生手機使用情況、面部表情&#xff08;專注、分心等 &#xff09;&#xff0c;統計專注度、手機使…

中國設計 全球審美 | 安貝斯新產品發布會:以東方美學開辟控制臺仿生智造新紀元

6月17日&#xff0c;安貝斯&#xff08;武漢&#xff09;控制技術有限公司&#xff08;以下簡稱“安貝斯”&#xff09;在武漢隆重舉行“新產品發布暨協會聯合創新峰會”。近百位來自政府機構、行業協會、行業用戶及戰略合作伙伴的嘉賓齊聚現場&#xff0c;共同見證以“中國設計…

在微信小程序wxml文件調用函數實現時間轉換---使用wxs模塊實現

1. 創建 WXS 模塊文件&#xff08;推薦單獨存放&#xff09; 在項目目錄下新建 utils.wxs 文件&#xff0c;編寫時間轉換邏輯&#xff1a; // utils.wxs module.exports {// 將毫秒轉換為分鐘&#xff08;保留1位小數&#xff09;convertToMinutes: function(ms) {if (typeo…

ByteMD 插件系統詳解

ByteMD 插件系統詳解 ByteMD 的插件系統是其強大擴展性的核心。它允許開發者在 Markdown 解析、AST 轉換、HTML 渲染、以及編輯器 UI 交互的各個階段注入自定義邏輯。這得益于 ByteMD 深度集成了 unified 處理器和其豐富的生態系統&#xff08;remark 用于 Markdown&#xff0c…

每日一練之 Lua 表

Lua 的 table 是什么數據結構&#xff1f;如何創建和訪問&#xff1f; 數據結構:Lua的table是一種哈希表&#xff0c;使用鍵值對存儲數據&#xff0c;支持動態擴容 創建方式: local t1 {} local t2 {10,20,30} local t3 {name"Alice",age25}訪問方式&#xff1a…

實現自動胡批量抓取唯品會商品詳情數據的途徑分享(官方API、網頁爬蟲)

在電商領域&#xff0c;數據就是企業的核心資產。無論是市場分析、競品研究&#xff0c;還是精準營銷&#xff0c;都離不開對大量商品詳情數據的深入挖掘。唯品會作為知名的電商平臺&#xff0c;其豐富的商品信息對于眾多從業者而言極具價值。本文將詳細探討實現自動批量抓取唯…

Zephyr 高階實踐:徹底講透 west 構建系統、模塊管理與跨平臺 CI/CD 配置

本文是 Zephyr 項目管理體系的高階解構與實戰指南&#xff0c;全面覆蓋 west 構建系統原理、模塊解耦與 west.yml 多模塊維護機制&#xff0c;結合企業級多平臺 CI/CD 落地流程&#xff0c;深入講解如何構建可靠、可維護、跨芯片架構的一體化 Zephyr 工程。 一、為什么 Zephyr …

我開源了一套springboot3快速開發模板

我開源了一套springboot3快速開發模板 開箱即用、按需組合、可快速二次開發的后端通用模板。 ? 主要特性 Spring Boot 3.x Java 17&#xff1a;跟隨 Spring 最新生態&#xff0c;利用現代語法特性。多模塊分層&#xff1a;common 抽象通用能力、starter 負責啟動、modules…

OpenCV CUDA模塊設備層-----在GPU上計算兩個uchar1類型像素值的反正切(arctangent)比值函數atan2()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 對輸入的兩個 uchar1 像素值 a 和 b&#xff0c;先分別歸一化到 [0.0, 1.0] 浮點區間&#xff0c;然后計算它們的 四象限反正切函數。 函數原型…

從C++編程入手設計模式——觀察者模式

從C編程入手設計模式——觀察者模式 ? 觀察者模式簡直就是字如其名&#xff0c;觀察觀察&#xff0c;觀察到了告訴別人。觀察手的作用如此&#xff0c;觀察者模式的工作機制也是如此。這個模式的核心思路是&#xff1a;一個對象的狀態發生變化時&#xff0c;自動通知依賴它的…

MITM 中間人攻擊

?據Akamai 2023網絡安全報告顯示&#xff0c;MITM攻擊在數據泄露事件中占比達32.7%&#xff0c;平均每次事件造成企業損失$380,000? ?NIST研究指出&#xff1a;2022-2023年高級MITM攻擊增長41%&#xff0c;近70%針對金融和醫療行業? 一、MITM攻擊核心原理與技術演進 1. 中…

llama_index chromadb實現RAG的簡單應用

此demo是自己提的一個需求&#xff1a;用modelscope下載的本地大模型實現RAG應用。畢竟大模型本地化有利于微調&#xff0c;RAG使內容更有依據。 為什么要用RAG&#xff1f; 由于大模型存在一定的局限性&#xff1a;知識時效性不足、專業領域覆蓋有限以及生成結果易出現“幻覺…

TDMQ CKafka 版事務:分布式環境下的消息一致性保障

解鎖 CKafka 事務能力的神秘面紗 在當今數字化浪潮下&#xff0c;分布式系統已成為支撐海量數據處理和高并發業務的中流砥柱。但在這看似堅不可摧的架構背后&#xff0c;數據一致性問題卻如影隨形&#xff0c;時刻考驗著系統的穩定性與可靠性。 CKafka 作為分布式流處理平臺的…