Redis Hash數據類型深度解析:從命令、原理到實戰場景

前言

在Redis的眾多數據結構中,Hash(哈希)類型占據著至關重要的地位。Redis本身就是一個高性能的鍵值(Key-Value)數據庫,其底層的鍵值對便是通過哈希方式組織的。而Hash數據類型則更進一步,它允許在Value層級再構建一個鍵值對集合,形成一種“域-值”(Field-Value)的映射關系。這種結構使得Hash特別適合用來存儲對象信息,您可以將一個對象的多個屬性高效地聚合在一個Redis鍵中

之前學過的所有數據結構中,最最重要的

redis自身已經是鍵值對的結構了
redis自身的鍵值對就是通過哈希的方式來組織的額

把key這一層組織完成之后,到了value這一層,value的其中一種類型還可以是哈希image.png

hset、hget

hset就是設置鍵值對
field->value
返回值是設置成功的鍵值對(field–value)

hset key field value [field value...]

image.png

然后我們使用hget進行key里面鍵值對的獲取

hget key field

image.png
如果要查詢的內容不存在的話就返回nil

hexists

判斷hash中是否有指定的字段

hexists key field

返回1就是存在,返回0就是不存在
image.png

hdel

刪除hash中指定的字段
del刪除的是key
hdel刪除的是field

hdel key field [field]

都是先指定key,再來指定一個或者多個field

返回值就是本次操作刪除的字段個數

image.png
查看是否存在我們是查不到的,因為已經刪除了
image.png

hkeys 、hvals

獲取hash中的所有字段

hkeys key

返回值:字段列表

時間復雜度:O(N)

原理就是根據Key找到對應的hash O(1)
然后遍歷hash O(N)這個N是hash的元素個數

這個查詢到的就是我們當前hash中的所有的Key了
image.png
這個操作也是存在一定風險的,類似于之前介紹的keys *
主要是我們也不知道某個hash鐘是否存在大量的field

可能會造成阻塞

hvals key

能夠獲取hash中所有的value
image.png

h系列的命令必須保證key對應的value得是哈希類型的

hgetall 、hmget

hegtall獲取hash中的所有字段以及對應的值

hgetall key

image.png

hmget類似于之前的mget,可以一次查詢多個field

hget只能查詢一個field,但是hmget可以查詢多個field

hmget key

多個value的順序和value是匹配的
有沒有hmset,一次設置多個field和value呢?

有,但是并不需要,因為hset已經支持一次設置多個field和value了

hkeys,hvals,hgetall都是存在一定風險的,hash的元素個數太多了,執行的耗時會比較長,從而阻塞redis

hscan遍歷redis的hash,但是他是屬于漸進式遍歷,就是敲一次命令,遍歷一小部分,再敲一次,再遍歷一小部分

連續執行多次,就可以完成整個的遍歷過程了

hlen、hsetnx

hlen獲取hash中的所有字段的個數

hlen key

這個獲取hash中的某個字段的個數我們是不需要進行遍歷的
image.png

hsetnx
在字段不存在的情況下,設置hash中的字段和值,和之前的setnx很相似的

hsetnx key field value

image.png

hincrby 、hincrbyfloat

hash這里的value,也可以當做數字來處理
hincrby就可以加減整數,返回計算后的結果
image.png

hincrbyfloat可以加減小數
好的,這是根據圖片內容生成的表格:

命令小結

命令執行效果時間復雜度
hset key field value設置值O(1)
hget key field獲取值O(1)
hdel key field [field …]刪除 fieldO(k), k 是 field 個數
hlen key計算 field 個數O(1)
hgetall key獲取所有的 field-valueO(k), k 是 field 個數
hmget field [field …]批量獲取 field-valueO(k), k 是 field 個數
hmset field value [field value …]批量獲取 field-valueO(k), k 是 field 個數
hexists key field判斷 field 是否存在O(1)
hkeys key獲取所有的 fieldO(k), k 是 field 個數
hvals key獲取所有的 valueO(k), k 是 field 個數
hsetnx key field value設置值,但必須在 field 不存在時才能設置成功O(1)
hincrby key field n對應 field-value +nO(1)
hincrbyfloat key field n對應 field-value +nO(1)
hstrlen key field計算 value 的字符串長度O(1)

hash內部編碼

哈希的內部編碼有兩種:

  • ziplist(壓縮列表):當哈希類型元素個數?于 hash-max-ziplist-entries 配置(默認 512 個)、同時所有值都?于 hash-max-ziplist-value 配置(默認 64 字節)時,Redis 會使? ziplist 作為哈希的內部實現,ziplist 使?更加緊湊的結構實現多個元素的連續存儲,所以在節省內存???hashtable 更加優秀。
  • hashtable(哈希表):當哈希類型?法滿? ziplist 的條件時,Redis 會使? hashtable 作為哈希的內部實現,因為此時 ziplist 的讀寫效率會下降,? hashtable 的讀寫時間復雜度為 O(1)。

壓縮的本質是針對數據進行重新編碼

ziplist付出的代價,進行讀寫元素,速度是比較慢的
哈希中的元素比較少,使用ziplist,元素多的話就使用hashtable

每個value的長度比較短,使用ziplist
如果太長了的話,也會轉換成hashtable

使用場景

關系型數據表保存用戶信息

image.png
image.png
高內聚低耦合image.png

Redis Hash因其結構化的數據存儲方式和高效的字段訪問能力,在實際應用中非常廣泛。

  1. 緩存對象信息:這是最經典的使用場景。例如,用戶信息、商品信息、會話數據等都可以存儲在Hash中。 相比于將整個對象序列化為JSON字符串再存入Redis,使用Hash可以讓您獨立地更新或獲取對象的某個屬性,而無需讀取和重寫整個對象,這在并發更新時能避免數據覆蓋問題并提升性能。

    • 示例: 一個用戶對象可以這樣存儲:HSET user:1001 name “Alice” age 30 email "
  2. 購物車:電商應用中的購物車功能與Hash結構完美契合。可以用用戶ID作為鍵(key),商品ID作為域(field),商品數量作為值(value)。

    • 示例:?HSET cart:1001 product:558 2?表示用戶1001的購物車中有2件ID為558的商品。通過HINCRBY可以方便地增減商品數量。
  3. 計數器聚合:當需要對一個對象的多個指標進行計數時,Hash非常有用。例如,記錄一篇文章的點贊數、評論數、分享數。

    • 示例:?HINCRBY article:998 likes 1,HINCRBY article:998 comments 1。

總結

Redis的Hash數據類型提供了一種在單個鍵下存儲多個鍵值對的高效方式,是模擬和存儲對象數據的理想選擇。它通過提供豐富的命令,實現了對對象屬性的靈活、高效操作。相比于使用JSON字符串存儲,Hash在更新部分字段時性能優勢明顯,且更加節省網絡帶寬。理解并善用ziplist和hashtable兩種內部編碼的特點,可以在內存效率和執行性能之間找到最佳平衡點,從而更好地發揮Redis的強大能力。

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

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

相關文章

【C++實戰?】解鎖C++文件操作:從基礎到實戰的進階之路

目錄一、文件操作的基本概念1.1 文件的分類與打開方式1.2 文件流的概念與相關類&#xff08;ifstream、ofstream、fstream&#xff09;1.3 文件操作的基本流程二、文本文件的讀寫實戰2.1 文本文件的打開與關閉2.2 文本文件的寫入操作&#xff08;<< 運算符、write 函數&a…

從C++開始的編程生活(9)——模板初階

前言 本系列文章承接C語言的學習&#xff0c;需要有C語言的基礎才能學會哦~ 第8篇主要講的是有關于C的模板初階。 C才起步&#xff0c;都很簡單&#xff01;&#xff01; 目錄 前言 模板初階 基本語法 函數模板的實例化 顯式實例化的作用 類模板 基本語法 模板初階 模板…

計算機網絡——傳輸層(25王道最新版)

傳輸層傳輸層提供的服務進程 端口號 傳輸層協議之間的關系socket套接字有鏈接 VS 無連接 | 可靠 VS 不可靠UDP數據報及檢驗數據報格式檢驗方法TCPTCP協議的三大階段TCP報文段格式&#xff08;很重要&#xff09;建立連接&#xff08;三次握手&#xff09;&#xff08;超級超級重…

羽毛球地板:從專業運動場景到全民健身市場的技術躍遷與產業重構

在全球體育產業向“專業化大眾化”雙軌并行的趨勢下&#xff0c;羽毛球地板作為運動場景的核心基礎設施&#xff0c;正經歷從單一功能型產品向“性能優化場景適配智能管理”一體化解決方案的轉型。據QYResearch統計&#xff0c;2031年全球羽毛球地板市場規模將達15.95億元&…

R 語言查看類庫源碼的方法

你想查看 getGEO&#xff08;來自 R 語言 GEOquery 包&#xff09;的源碼&#xff0c;這能幫你更好理解其工作原理和數據處理細節。由于 getGEO 是 R 函數&#xff0c;查看方法與 Python 有所不同。下面為你提供幾種主要方法。 方法 適用場景 關鍵命令/操作 在 R 控制臺直接查看…

SQL,posexplode 用法示例

示例1 -- 創建測試數據 WITH test_data AS (SELECT array(apple, banana, cherry) as fruits ) SELECT pos, col FROM test_data LATERAL VIEW posexplode(fruits) t AS pos, col;結果 pos | col ----|------- 0 | apple 1 | banana 2 | cherry示例2 -- 假設有一個用戶表…

數據庫造神計劃第十天---數據庫約束(1)

&#x1f525;個人主頁&#xff1a;尋星探路 &#x1f3ac;作者簡介&#xff1a;Java研發方向學習者 &#x1f4d6;個人專欄&#xff1a;《從青銅到王者&#xff0c;就差這講數據結構&#xff01;&#xff01;&#xff01;》、 《JAVA&#xff08;SE&#xff09;----如此簡單&a…

知微傳感Dkam系列3D相機SDK例程篇:CSharp連接相機及保存數據

序言 寫在前面 本人從事機器視覺細分的3D相機行業。編寫此系列文章主要目的有&#xff1a; 1、便利他人應用相機&#xff0c;本系列文章包含公司所出售相機的SDK的使用例程及詳細注釋&#xff1b;2、促進行業發展及交流。 知微傳感Dkam系列3D相機可以應用于定位分揀、焊接焊縫提…

[筆記] 系統分析師 第十二章 軟件架構設計(分析師主要工作)

文章目錄前言12.1 軟件架構概述12.1.1 軟件架構的意義12.1.2 軟件架構的發展史12.2 軟件架構建模12.3 軟件架構風格12.3.1 軟件架構風格概述12.3.2 數據流體系結構風格1.批處理體系結構風格2.管道-過濾體系結構風格12.3.3 調用/返回體系結構風格1.主程序/子程序風格2.面向對象體…

C++---存儲周期,作用域,鏈接性

在C程序設計中&#xff0c;變量的行為不僅由其類型決定&#xff0c;還由存儲周期&#xff08;變量在內存中存在的時間&#xff09;、作用域&#xff08;變量可被訪問的代碼范圍&#xff09;和鏈接性&#xff08;變量在多文件程序中的可見性&#xff09;共同約束。 一、存儲周期…

基于Python的商品爬取與可視化系統

本系統是基于Python的商品數據爬取與價格分析可視化系統&#xff0c;集成了數據爬取、數據存儲、數據展示和可視化分析等功能。下面介紹一下系統主要功能和技術棧。一、主要功能&#xff1a;1、數據爬取功能 支持淘寶美妝商品數據爬取 可配置搜索關鍵詞和爬取頁數 實時顯示爬取…

聯邦學習過程中,了解清楚影響準確率的因素有哪些也很重要

影響模型準確率的因素有很多&#xff0c;下面是一些主要的因素&#xff0c;它們可以從數據、模型設計、訓練策略以及超參數等多個層面來考慮。1. 學習率作用&#xff1a;學習率直接影響模型的訓練速度、穩定性和最終表現。過高的學習率可能導致模型不收斂或收斂不穩定&#xff…

C# WPF中使用System.Management.Automation類調用Powershell報錯解決辦法

在WPF開發中&#xff0c;需要使用powershell進行自動化管理&#xff0c;以下為開發環境 1、.NET framework 4.7.2 2、VS2019 社區版 使用System.Management.Automation類 遇到的問題&#xff1a; 需要引用 System.Management.Automation類&#xff0c;但是在使用using指令時無法…

從 Pump.fun「直播」看熱點幣的生與死

在加密市場里&#xff0c;熱點就是流量&#xff0c;流量就是價值。最近&#xff0c;Solana 生態的 Pump.fun 推出了「直播」板塊&#xff0c;讓發幣這件事變得像看秀一樣&#xff1a;一個個新幣在鏈上實時登場&#xff0c;社區即時互動&#xff0c;玩家實時下注。這種形式不僅帶…

圖靈完備性:計算理論的基石與無限可能

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1 圖靈完備性的基本概念 圖靈完備性&#xff08;Turing completeness…

HarmonyOS 5.0應用開發——V2裝飾器@once的使用

【高心星出品】 文章目錄V2裝飾器once的使用概念一、核心作用與規則二、適用場景案例V2裝飾器once的使用 概念 在鴻蒙ArkTS開發中&#xff0c;Once裝飾器用于實現子組件僅接受父組件傳遞的初始值&#xff0c;后續父組件數據變化不再同步至子組件。以下是其核心要點&#xff1…

跨域請求:解決方案

一、跨域核心概念&#xff1a;同源策略與跨域定義 跨域問題的根源是瀏覽器的 同源策略&#xff08;Same-Origin Policy&#xff09;&#xff0c;這是瀏覽器為保護用戶數據安全而設置的核心安全限制。 1. 什么是 “同源”&#xff1f; “同源” 指的是兩個 URL 的 協議、域名…

前端形態與樣式風格:從古典到現代的視覺語言演進

目錄前端形態與樣式風格&#xff1a;從古典到現代的視覺語言演進概述1. 前端形態的演進&#xff1a;四種核心范式1.1 古典范式&#xff1a;語義化HTML與CSS1.2 組件化范式&#xff1a;模塊化與復用1.3 響應式范式&#xff1a;多端適配1.4 動態范式&#xff1a;狀態驅動視圖2. 樣…

用戶系統從0到1:登錄、權限、積分一網打盡

&#x1f464; 用戶系統從0到1&#xff1a;登錄、權限、積分一網打盡 副標題&#xff1a;Flask-Login 多級權限 積分會員系統實戰 項目原型&#xff1a;https://madechango.com 難度等級&#xff1a;???☆☆ 預計閱讀時間&#xff1a;20分鐘 &#x1f3af; 引子&#xff1…

Java 大視界 -- Java 大數據在智能安防視頻監控系統中的視頻內容理解與智能預警升級

Java 大視界 -- Java 大數據在智能安防視頻監控系統中的視頻內容理解與智能預警升級引言&#xff1a;正文&#xff1a;一、傳統安防監控的 “三重困局”&#xff1a;看不全、看不懂、反應慢1.1 人工盯屏 “力不從心”1.1.1 攝像頭密度與人力的矛盾1.1.2 錄像調閱 “馬后炮”1.2…