Redis:hash數據類型

文章目錄

  • hash
  • 常用命令
    • hset
    • hget
    • hexists
    • hdel
    • hkeys
    • hvals
    • hmget
  • 壓縮
  • hash和string

本篇總結的是,在Redis中的哈希數據類型

hash

在Redis內部本身,其實就是一種鍵值對的結構,而在key-value的value本身,其實也可以是一種哈希結構

而在value的哈希結構中,一般叫做是field-value結構

常用命令

hset

hset key field value [field value ...]

而在這里的value,只能是以字符串的形式出現,返回值是設置成功的數量:

127.0.0.1:6379> hset key1 f1 111
(integer) 1
127.0.0.1:6379> hset key1 f2 222 f3 333
(integer) 2

hget

這個命令只能獲取單個field的值:

hget key field

具體使用:

127.0.0.1:6379> hget key1 f1
"111"
127.0.0.1:6379> hget key1 f2
"222"
127.0.0.1:6379> hget key1 f1 f2
(error) ERR wrong number of arguments for 'hget' command

hexists

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

時間復雜度是O(1),返回值是0表示沒有,返回值是1表示存在

127.0.0.1:6379> hexists key1 f1
(integer) 1
127.0.0.1:6379> hexists key1 f100
(integer) 0

hdel

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

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

hdel key field [field ...]

具體事例如下:

127.0.0.1:6379> hdel key1 f1 f2
(integer) 2

hkeys

先根據key找到對應的hash,再遍歷hash

127.0.0.1:6379> hkeys key1
1) "f3"
2) "f1"
3) "f2"

這個操作也是有一定的風險存在的,具體類似于之前講過的keys *,這個操作可能會因為某個key對應的hash結構中存在大量的數據,導致最終單線程模型下的Redis被阻塞

hvals

和hkeys相對,能夠獲取到hash中所有的value值

127.0.0.1:6379> hkeys key1
1) "f3"
2) "f1"
3) "f2"
127.0.0.1:6379> hvals key1
1) "333"
2) "111"
3) "222"

hmget

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

127.0.0.1:6379> hmget key f1 f2 f3
1) (nil)
2) (nil)
3) (nil)
127.0.0.1:6379> hmget key1 f1 f2 f3
1) "111"
2) "222"
3) "333"

上述的這些命令都是有一定風險的,可能會造成線程阻塞,原因在于這些命令都是要一次完成所有的操作,所以可能會阻塞Redis,那有沒有其他的方法呢?

這里介紹一個命令叫做hscan,它屬于是漸進式遍歷,相當于是敲一次命令遍歷一小部分,再敲一次,遍歷一小部分,連續執行多次,就可以完成整個的遍歷過程了,相當于是化整為零的操作

壓縮

談到哈希,就要先說說壓縮算法了,壓縮算法常見的有rar,zip,gzip,7z等等,而壓縮的本質,其實就是對于數據進行重新編碼,而針對于不同的數據,它們會有不同的特點,就可以依據這些不同的特點進行特定的設計,從而在編碼之后,就能夠達到縮小體積的效果

而這里想表述的含義是,ziplist也是如此,作為哈希的編碼方式,它內部的數據結構也是精心設計的,目的就是在于要節省內存空間,對于表示一個普通的哈希表來說,可能會造成一些內存浪費的問題,比如說,hash是一個數組,而作為數組,就會導致有些地方有元素,有些地方沒有元素,那么沒有元素的位置其實就是一種資源的浪費,那為了解決這樣的問題,就有了ziplist這種編碼方式

對于這種編碼方式來說,它的一個特點就是讀寫元素的效率會變低,速度會變慢,如果元素比較少還好,但是一旦元素達到一定的程度,此時就會導致效率明顯降低,所以此時就有了另外一種編碼方式叫做hashtable

總結

因此我們說:

  1. 哈希表的元素比較少的時候,就使用ziplist來表示,如果比較多就使用hashtable來表示
  2. 每個value的值長度都比較短的時候,就使用ziplist來表示,如果某個value的值太長了,就會轉換成hashtable

hash和string

那么現在的問題是,為什么要使用hash?難道使用JSON進行表示string難道不可以嗎?其實是可以的,但是這會面臨一個問題,比如要對于數據進行修改,需要把JSON先進行序列化,然后更改數據后再進行反序列化,這樣的成本顯然是比直接操作hash要高的,因此才引入了hash這樣的概念

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

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

相關文章

【c++算法篇】滑動窗口

🔥個人主頁:Quitecoder 🔥專欄:算法筆記倉 目錄 1.長度最小的子數組2.無重復字符的最長子串3.最大連續1的個數 III4.將 x 減到 0 的最小操作數5.水果成籃6.找到字符串中所有字母異位詞7.串聯所有單詞的子串8.最小覆蓋子串 滑動窗…

李宏毅-Self-attention機制詳解

原視頻鏈接:attention 一. 基本問題分析 1. 模型的input 無論是預測視頻觀看人數還是圖像處理,輸入都可以看作是一個向量,輸出是一個數值或類別。然而,若輸入是一系列向量,長度可能會不同,例如把句子里的…

C 深入指針(4)

目錄 一、字符指針變量 1 初始化 2 與字符串數組的區別 二、數組指針變量 1 初始化 2 二維數組傳參本質 三、函數指針變量 1 初始化 2 用法 四、typedef關鍵字 五、函數指針數組 一、字符指針變量 1 初始化 //VS2022 x64 #include <stdio.h> int main() {…

機器人非線性阻抗控制系統

機器人非線性控制系統本質上是一個復雜的控制系統&#xff0c;其狀態變量和輸出變量相對于輸入變量的運動特性不能用線性關系來描述。這種系統的形成基于兩類原因&#xff1a;一是被控系統中包含有不能忽略的非線性因素&#xff0c;二是為提高控制性能或簡化控制系統結構而人為…

人形機器人場景應用全解析,2024睿抗 AI ROBOT創新挑戰賽火熱報名中!

人工智能&#xff08;AI&#xff09;已成為推動科技革命和產業變革的關鍵力量。隨著大模型等AIGC技術的迅猛發展&#xff0c;AI正深刻改變我們的生活并重新定義生產方式。越來越多人期望將AI技術從純粹的思維和計算擴展到與物理世界的互動中&#xff0c;即發展具身智能。 為了推…

探索中國文本到視頻AI模型——Vidu

引言 隨著人工智能技術的不斷進步&#xff0c;我們見證了從文本到視頻內容生成的革命。最近&#xff0c;一個名為Vidu的中國文本到視頻AI模型引起了全球的關注。由清華大學和中國AI初創公司聲書科技聯合開發的Vidu&#xff0c;于2024年4月27日宣布&#xff0c;它聲稱能夠生成高…

測試周期記錄

測試周期是軟件開發生命周期中的一個重要環節&#xff0c;它包括單元測試、集成測試、系統測試和驗收測試等階段。本文將詳細介紹測試周期的各個階段及其重要性&#xff0c;幫助讀者更好地理解測試周期在軟件開發過程中的作用。 一、單元測試 單元測試是測試周期中的第一個階段…

個人工控方面收藏網址記錄(持續更新中)

1、OPC類 OPC Foundation GitHub Downloads - Unified Automation (unified-automation.com) 物聯網IoT協議之OPC UA快速入門教程 | 源碼先生的調試人生 (debugself.com) OPC Servers - OPC UA Migration - 100 Solutions by Matrikon (matrikonopc.com) Prosys OPC UA Simu…

k8s coredns配置

1.coredns可根據集群具體數量修改pod數&#xff0c;官方推薦比例為5/1&#xff0c;即有15臺服務器最好是3個pod。 2.coredns會繼承pod所在主機的dns解析,修改了主機的dns解析之后&#xff0c;coredns有一段時間的緩存&#xff0c;重啟coredns才會在集群內部立刻生效該解析。 …

SpringBoot3集成WebSocket

標簽&#xff1a;WebSocket&#xff0c;Session&#xff0c;Postman。 一、簡介 WebSocket通過一個TCP連接在客戶端和服務器之間建立一個全雙工、雙向的通信通道&#xff0c;使得客戶端和服務器之間的數據交換變得更加簡單&#xff0c;允許服務端主動向客戶端推送數據&#xf…

003_PyCharm的安裝與使用

如果你正在學習PyQt&#xff0c;本系列教程完全可以帶你入門直至入土。 所謂從零開始&#xff0c;就是從軟件安裝、環境配置開始。 不跳過一個細節&#xff0c;不漏掉一行代碼&#xff0c;不省略一個例圖。 IDE 開始學習一個編程語言&#xff0c;我們肯定是首先得安裝好它&…

std::funture和std::promise

#include <iostream> #include <thread> #include <future>void calculateResult(std::promise<int>& promiseObj) {// 模擬耗時計算std::this_thread::sleep_for(std::chrono::seconds(2));// 設置結果到 promise 中promiseObj.set_value(42); }i…

信息系統項目管理師——十大管理過程輸入、工具和技術、輸出(論文篇)二

六、項目風險管理 規劃風險管理 在撰寫關于“規劃風險管理”的論文時&#xff0c;這個過程是項目風險管理的第一步&#xff0c;旨在建立風險管理的框架&#xff0c;為整個項目周期內的風險識別、分析、應對和監控奠定基礎。以下是規劃風險管理過程中可能涉及的輸入、工具和技…

Python學習(五)異常處理

異常概念 異常的捕獲方法 try: f open("D:/abc.txt","r",encoding"UTF-8") except: print("出現異常了&#xff0c;因為文件不存在&#xff0c;我將open的模式&#xff0c;改為w模式去打開") f open("D:/abc.txt&qu…

Python代碼:十、字符串連接

1、題目 小明有兩個最好的朋友&#xff0c;他們的名字分別用input讀入記錄在兩個字符串中&#xff0c;請使用字符串連接&#xff08;&#xff09;幫助牛牛將兩個朋友的名字依次連接在一個字符串中輸出。 2、代碼 import sysstr1 input() str2 input() str3 str1 str2 pr…

從0到1:使用HuggingFace的管線加載Diffusion模型生成第一張圖像!

Hugging Face系列1&#xff1a;詳細剖析Hugging Face網站資源 前言本篇摘要1. Hugging Face Hub三大件1.1 模型1.1.1 模型簡介1.1.2 制作模型卡片1.1.3 模型下載和上傳1.1.4 模型應用 1.2 數據集1.2.1 數據集簡介1.2.2 調用代碼1.2.3 AutoTrain在線微調 1.3 Space應用1.3.1 內容…

理解 Python 中的 `super()` 與 `__init__()` 方法

在 Python 的面向對象編程中&#xff0c;super() 函數和 __init__() 方法是兩個非常重要的概念。它們在類的繼承和初始化過程中扮演著關鍵的角色。本文將深入探討這兩個概念的工作原理&#xff0c;并通過示例代碼來展示它們的使用。 基本原理 __init__() 方法 __init__() 是…

Vue中的全局事件總線:EventBus與$bus的比較詳解與實戰應用

EventBus實例&#xff1a; var EventBus new Vue() 會創建一個名為EventBus的Vue實例&#xff0c;并將其存儲在變量EventBus中。Vue.prototype.$bus new Vue() 則直接在Vue的原型上創建一個新的Vue實例&#xff0c;并將其賦值給$bus屬性。 使用方式&#xff1a; var EventBus…

C# 結合 JavaScript 對 Web 控件進行數據輸入驗證

目錄 關于數據驗證 范例運行環境 驗證設計 JavaScript 方法 設計 實現 調用示例 C# 方法 設計 實現 調用示例 小結 關于數據驗證 在 Web 應用的錄入界面&#xff0c;數據驗證是一項重要的實現功能&#xff0c;數據驗證是指確認 Web 控件輸入或選擇的數據&#xff…

類對象作為類成員

在C中&#xff0c;類對象可以作為另一個類的成員變量。這種設計方式可以用于創建復雜的對象結構&#xff0c;使得一個類的對象能夠包含另一個類的對象。這種嵌套類的組合方式可以增強代碼的可重用性和模塊化。 類對象作為類成員的示例 讓我們通過一個示例來解釋這一概念。假設…