8.Redis之hash類型

1.hash類型的基本介紹

哈希表[之前學過的所有數據結構中,最最重要的]

1.日常開發中,出場頻率非常高.

2.面試中,非常重要的考點,

Redis 自身已經是鍵值對結構了Redis 自身的鍵值對就是通過 哈希 的方式來組織的
把 key 這一層組織完成之后, 到了 value 這一層~~ value 的其中一種類型還可以再是 哈希

哈希類型中的映射關系通常稱為 field-value,?于區分 Redis 整體的鍵值對(key-value),
注意這?的 value 是指 field 對應的值,不是鍵(key)對應的值,請注意 value 在不同上下
?的作?。

2.hash命令

2.1 hset

設置 hash 中指定的字段(field)的值(value)。
HSET key field value [field value ...]
命令有效版本:2.0.0 之后
時間復雜度:插??組 field 為 O(1), 插? N 組 field 為 O(N)
返回值:添加的字段的個數。
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HGET myhash field1
"Hello"

2.2 hget?

獲取 hash 中指定字段的值。
語法:
HGET key field
命令有效版本:2.0.0 之后
時間復雜度:O(1)
返回值:字段對應的值或者 nil。
?例:
redis> HSET myhash field1 "foo"
(integer) 1
redis> HGET myhash field1
"foo"
redis> HGET myhash field2
(nil)

2.3?HEXISTS

判斷 hash 中是否有指定的字段。
HEXISTS key field

命令有效版本:2.0.0 之后

時間復雜度:O(1)
返回值:1 表?存在,0 表?不存在。
?例:

?redis> HSET myhash field1 "foo"

(integer) 1
redis> HEXISTS myhash field1
(integer) 1
redis> HEXISTS myhash field2
(integer) 0

2.4?HDEL

刪除 hash 中指定的字段。
語法:
HDEL key field [field ...]
命令有效版本:2.0.0 之后
時間復雜度:刪除?個元素為 O(1). 刪除 N 個元素為 O(N).
返回值:本次操作刪除的字段個數。
?例:
redis> HSET myhash field1 "foo"
(integer) 1
redis> HDEL myhash field1
(integer) 1
redis> HDEL myhash field2
(integer) 0
  • del 刪除的是 key
  • hdel 刪除的是 field?

2.5?HKEYS

獲取 hash 中的所有字段。

語法:
HKEYS key
命令有效版本:2.0.0 之后
時間復雜度:O(N), N 為 field 的個數.
返回值:字段列表。

?redis> HSET myhash field1 "Hello"

(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HKEYS myhash
1) "field1"
2) "field2"

?2.6?HVALS

獲取 hash 中的所有的值。
語法:
HVALS key
命令有效版本:2.0.0 之后
時間復雜度:O(N), N 為 field 的個數.
返回值:所有的值。
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HVALS myhash
1) "Hello"
2) "World"

2.7?HGETALL

獲取 hash 中的所有字段以及對應的值。
語法:
HGETALL key
命令有效版本:2.0.0 之后
時間復雜度:O(N), N 為 field 的個數.
返回值:字段和對應的值。
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HGETALL myhash
1) "field1"
2) "Hello"
3) "field2"
4) "World"

2.8?HMGET

?次獲取 hash 中多個字段的值。
語法:
HMGET key field [field ...]
命令有效版本:2.0.0 之后
時間復雜度:只查詢?個元素為 O(1), 查詢多個元素為 O(N), N 為查詢元素個數.
返回值:字段對應的值或者 nil。
?例:
redis> HSET myhash field1 "Hello"

(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HMGET myhash field1 field2 nofield
1) "Hello"
2) "World"
3) (nil)
在使? HGETALL 時,如果哈希元素個數?較多,會存在阻塞 Redis 的可能。如果開發?員只 需要獲取部分 field,可以使? HMGET,如果?定要獲取全部 field,可以嘗試使? HSCAN命令,該命令采?漸進式遍歷哈希類型。
【敲一次命令,遍歷一小部分.
再敲一次,再遍歷一小部分
時間就是可控的~~
化整為零

ConcurrentHashMap(線程安全的 哈希表)

這個哈希表在擴容的時候,也是按照化整為零的方式進行的!!
Java 標準庫直接提供了一些線程安全的 集合類
(Java 中也有"容器"這樣的術語,指的是別的了)

2.9?HLEN

獲取 hash 中的所有字段的個數。
HLEN key
命令有效版本:2.0.0 之后
時間復雜度:O(1)
返回值:字段個數。

示例?

redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HLEN myhash
(integer) 2

2.10?HSETNX

在字段不存在的情況下,設置 hash 中的字段和值。
語法:
HSETNX key field value
命令有效版本:2.0.0 之后
時間復雜度:O(1)
返回值:1 表?設置成功,0 表?失敗。
示例:
redis> HSETNX myhash field "Hello"
(integer) 1
redis> HSETNX myhash field "World"
(integer) 0
redis> HGET myhash field
"Hello"

2.11?HINCRBY

將 hash 中字段對應的數值添加指定的值。
語法:
HINCRBY key field increment
命令有效版本:2.0.0 之后
時間復雜度:O(1)
返回值:該字段變化之后的值。
示例:
redis> HSET myhash field 5
(integer) 1
redis> HINCRBY myhash field 1
(integer) 6
redis> HINCRBY myhash field -1
(integer) 5
redis> HINCRBY myhash field -10
(integer) -5

2.12 HINCRBYFLOAT

HINCRBY 的浮點數版本。
語法:
HINCRBYFLOAT key field increment
命令有效版本:2.6.0 之后
時間復雜度:O(1)
返回值:該字段變化之后的值。
示例:
redis> HSET mykey field 10.50
(integer) 1
redis> HINCRBYFLOAT mykey field 0.1
"10.6"
redis> HINCRBYFLOAT mykey field -5
"5.6"
redis> HSET mykey field 5.0e3
(integer) 0
redis> HINCRBYFLOAT mykey field 2.0e2
"5200" ?

?3.命令小節

命令執?效果時間復雜度
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-value
O(k), k 是 field個數
hmget field [field ...]批量獲取 field-value
O(k), k 是 field個數
hmset field value [field
value ...]
批量獲取 field-value
O(k), k 是 field個數
hexists key field判斷 field 是否存在O(1)
hkeys key獲取所有的 field
O(k), k 是 field個數
hvals key
獲取所有的 value
O(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)

?4.hash編碼方式

壓縮:rar, zip, gzip,7....

一些具體的壓縮算法~~

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

不同的數據,有不同的特點.結合這些特點,進行精妙的設計重新編碼之后,就能夠縮小體積~

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

ziplist 也是同理~~
內部的數據結構也是精心設計的~~
【目的節省內存空間.】
表示一個普通的hash表,可能會浪費一定的空間~~(hash 首先是一個數組~~,數組上有些位置有元素,有些沒有元素)
ziplist 付出的代價,進行讀寫元素,速度是比較慢的,如果元素個數少,慢的并不明顯, 如果元素個數太多了,慢就會雪上加霜,
如果,
1.哈希中的元素個數比較少,使用 ziplist 表示.元素個數比較多,使用 hashtable 來表示

2.每個 value 的值長度都比較短,使用 ziplist 表示.如果某個 value 的長度太長了,也會轉換成 hashtable

  • hash-max-ziplist-entries 配置(默認 512 個)
  • hash-max-ziplist-value 配置(默認 64 字節)
  • 這個配置項就是可以寫到 redis.conf 文件中的~~?

5.hash的應用?

5.1 作為緩存

string 也是可以作為緩存使用的.

存儲結構化的數據(類似于 數據庫 表 這樣的結構~~),使用 hash 類型更合適一些~~

上述場景使用 string 類型也能做到,
就需要使用到 json 這樣的數據格式

  • 如果使用 string(ison)的格式來表示 Userlnfo萬一只想獲取其中的某個 field, 或者修改某個 field ~~就需要把整個 json 都讀出來, 解析成 對象,操作 field,再重寫轉成 json 字符串,再寫回去~~
  • 如果使用 hash 的方式來表示 Userlnfo,就可以使用 field 表示對象的每個屬性(數據表的每個列)此時就可以非常方便的修改/獲取任何一個屬性的值了~~
  • 使用 hash 的方式,確實讀寫 field 更直觀高效,但是付出的是空間的代價~~需要控制哈希在 ziplist 和hashtable 兩種內部編碼的轉換,可能會造成內存的較大消耗。

高內聚

把有關聯的東西放在一起,最好能放在指定的地方~~

耦合?

  • 兩個模塊/代碼 之間的關聯關系,關聯關系越大,越容易相互影響認為是耦合越大~~
  • 追求的是"低耦合,避免"牽一發動全身"這邊一改出 bug,影響到了其他的地方

哈希類型和關系型數據庫有兩點不同之處:

? 哈希類型是稀疏的,而關系型數據庫是完全結構化的,例如哈希類型每個鍵可以有不同的 field,而關系型數據庫?旦添加新的列,所有?都要為其設置值,即使為 null【稀疏更加節省空間】
? 關系數據庫可以做復雜的關系查詢,? Redis 去模擬關系型復雜查詢,例如聯表查詢、聚合查詢等基本不可能,維護成本?。

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

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

相關文章

最重要的時間表示,柯橋外貿俄語小班課

в第四格 1、與表示“鐘點”的數詞詞組連用 例: в шесть часов утра 在早上六點 в пять тридцать 在五點半 2、與表示“星期”的名詞連用 例: в пятницу 在周五 в следующий понедельник …

包和依賴管理:Python的pip和conda使用指南

包和依賴管理:Python的pip和conda使用指南 對于Python新手來說,包和依賴管理可能是一個令人困惑的概念。但不用擔心,本文將用淺顯易懂的語言,詳細介紹如何使用Python的兩個主要包管理工具:pip和conda。我們還會探討在安…

為 AWS 子賬戶添加安全組修改權限

文章目錄 步驟 1:創建 IAM 策略步驟 2:附加策略到子賬戶步驟 3:驗證權限 本文檔將操作如何為 AWS 子賬戶(IAM 用戶或角色)添加修改安全組的權限,包括 AuthorizeSecurityGroupIngress 和 RevokeSecurityGr…

解決uniApp 中不能直接使用 Axios 的問題

最近在使用 uniapp 進行小程序開發的時候,發現 uniapp 不能直接使用 axios,需要自己進行封裝一個 http 庫使用,于是有了這個項目。 項目地址:https://www.npmjs.com/package/uni-app-wxnetwork-tool 該包的功能介紹: u…

String類為什么設計成不可變的?

目錄 緩存 安全性 線程安全 hashCode緩存 性能 其實這個問題我們可以通過緩存、安全性、線程安全和性能幾個維度去解析。 緩存 字符串是Java最常用的數據結構,我們都知道字符串大量創建是非常耗費資源的,所以Java中就將String設計為帶有緩存的功能…

軟考 系統架構設計師之考試感悟2

接前一篇文章:軟考 系統架構設計師之考試感悟 今天是2024年5月25號,是個人第二次參加軟考系統架構師考試的正日子。和上次一樣,考了一天,身心俱疲。天是陰的,心是沉的,感覺比上一次更加沉重。仍然有諸多感悟…

express框架下后端獲取req.body報錯undefined

express框架下后端獲取req.body報錯undefined_express服務器post中data為undefine-CSDN博客 /*** 特殊說明:Express是一個單線程服務器器程序【必須存在指定的順序調用,否則無法達到預期的效果】*//*** 第一步:創建一個Express實例對象,并且在匹配路由之…

【python】python tkinter 計算器GUI版本(模仿windows計算器 源碼)【獨一無二】

👉博__主👈:米碼收割機 👉技__能👈:C/Python語言 👉公眾號👈:測試開發自動化【獲取源碼商業合作】 👉榮__譽👈:阿里云博客專家博主、5…

17.分類問題

機器學習分類問題詳解與實戰 介紹 在機器學習中,分類問題是一類常見的監督學習任務,其目標是根據輸入特征將數據樣本劃分為預先定義的類別之一。分類問題廣泛應用于各個領域,如圖像識別、自然語言處理、金融風險評估等。本文將詳細介紹機器…

Spring Cloud 項目中使用 Swagger

Spring Cloud 項目中使用 Swagger 關于方案的選擇 在 Spring Cloud 項目中使用 Swagger 有以下 4 種方式: 方式一 :在網關處引入 Swagger ,去聚合各個微服務的 Swagger。未來是訪問網關的 Swagger 原生界面。 方式二 :在網關處引…

RedHat9 | DNS剖析-配置輔助DNS服務器

一、實驗環境 1、輔助域名DNS服務器 DNS通過劃分為若干個區域進行管理,每一個區域由1臺或多臺DNS服務器負責解析,如果僅僅采用1臺DNS服務器,在DNS服務器出現故障后,用戶將無法完成解析。 輔助DNS服務器的優點 容災備份&#x…

區間預測 | Matlab實現DNN-KDE深度神經網絡結合核密度估計多置信區間多變量回歸區間預測

區間預測 | Matlab實現DNN-KDE深度神經網絡結合核密度估計多置信區間多變量回歸區間預測 目錄 區間預測 | Matlab實現DNN-KDE深度神經網絡結合核密度估計多置信區間多變量回歸區間預測效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 1.Matlab實現DNN-KDE深度神經網絡結合…

MySQL數據處理增刪改

數據處理增刪改DML 由于約束,以下操作都有可能執行失敗(后面講約束) 插入數據 INSERT 基礎添加:VALUES 值的順序必須和表中字段順序相同 INSERT INTO class VALUES(1,王小,10); 向指定字段添加: 值的順序和指定…

rocketmq初識

package com.ldj.rocketmq.producer;import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.common.message.Message;import java.nio.charset.StandardCharsets;/*** User: ldj* Date: 2024/3/26* Time: 2:26* Description: 單向消息生產…

MT7628原廠Uboot修改交互串口

工作中,遇到用戶用Skylab的SKW92A模組,在參考設計時,將UART接口預留錯的情況,對于這種情況,需要將原廠SDK默認的交互串口UART0,改為UART1。在開發過程中,經常需要在Uboot階段升級固件&#xff0…

【Linux部署】【pig前端部署】Linux安裝- docker/docker-compose/nginx (使用docker優雅部署nginx)

🌸🌸 Linux安裝- docker/docker-compose/nginx 優雅部署 🌸🌸 一、一鍵安裝jdk yum install -y java-1.8.0-openjdk.x86_64驗證 二、安裝docker yum list docker-ce --showduplicates | sort -rsudo yum install -y yum-utils …

LabVIEW波紋補償器無線監測系統

LabVIEW波紋補償器無線監測系統 在石油化工、冶金及電力等行業中,波紋補償器作為一種重要的補償性元件,其安全穩定的運行對管道輸送系統的可靠性至關重要。開發了一種基于LabVIEW的波紋補償器無線監測系統,通過實時監測波紋補償器的工作狀態…

嵌入式單片機寄存器操作與實現方法

大家好,今天給大家分享一下,單片機中寄存器該如何操作與實現。 “芯片里面的寄存器訪問方式一般是: 1.可使用地址訪問,2.可使用指令訪問,3.不可訪問” 第一:掛載到內存地址總線上了的 掛載到內存地址總線上了的,可以使用分配到的地址訪問 如下是STM32單片機存儲器映像…

單條16g和雙條8g哪個好

單條16g和雙條8g各有優劣,具體選擇要根據個人需求和電腦配置來決定。 以下是一些參考信息: ?單條16g內存的價格比雙條8g內存的價格低,而且16g的內存容量大,一條內存十分的方便。 ?兩條8g內存可以組成雙通道,電腦運行速度要快一些。 ?對于普通使用電腦的人群與熱衷于…

Sourcetree安裝教程及使用

1 Sourcetree介紹 Sourcetree是一款免費的Git圖形化客戶端,它由Atlassian開發,提供了跨平臺的支持,可運行在Windows和Mac操作系統上。Sourcetree可以讓開發者更方便地使用Git來管理代碼,不需要在命令行中輸入復雜的Git命令&#x…