Redis的Hash類型及相關(guān)命令小結(jié)
HSET
設(shè)置 hash 中指定的字段(field)的值(value)。
語法
HSET key field value [field value ...]
時(shí)間復(fù)雜度:插??組 field 為 O(1), 插? N 組 field 為 O(N)
返回值:添加的字段的個(gè)數(shù)。
舉例
redis> HSET myhash field1 "Hello" (integer) 1 redis> HGET myhash field1 "Hello" redis> HSET myhash field2 "Hi" field3 "World" (integer) 2 redis> HGET myhash field2 "Hi" redis> HGET myhash field3 "World" redis> HGETALL myhash 1) "field1" 2) "Hello" 3) "field2" 4) "Hi" 5) "field3" 6) "World"
HGET
獲取 hash 中指定字段的值。
語法
HGET key field
時(shí)間復(fù)雜度:O(1)
返回值:字段對(duì)應(yīng)的值或者 nil。
舉例
redis> HSET myhash field1 "foo" (integer) 1 redis> HGET myhash field1 "foo" redis> HGET myhash field2 (nil)
HEXISTS
判斷 hash 中是否有指定的字段。
語法
HEXISTS key field
時(shí)間復(fù)雜度:O(1)
返回值:1 表?存在,0 表?不存在。
舉例
redis> HSET myhash field1 "foo" (integer) 1 redis> HEXISTS myhash field1 (integer) 1 redis> HEXISTS myhash field2 (integer) 0
HDEL
刪除 hash 中指定的字段。
語法
HDEL key field [field ...]
時(shí)間復(fù)雜度:刪除?個(gè)元素為 O(1). 刪除 N 個(gè)元素為 O(N).
返回值:本次操作刪除的字段個(gè)數(shù)。
舉例
redis> HSET myhash field1 "foo" (integer) 1 redis> HDEL myhash field1 (integer) 1 redis> HDEL myhash field2 (integer) 0
HKEYS
獲取 hash 中的所有字段。
語法
HKEYS key
時(shí)間復(fù)雜度:O(N), N 為 field 的個(gè)數(shù).
返回值:字段列表。
舉例
redis> HSET myhash field1 "Hello" (integer) 1 redis> HSET myhash field2 "World" (integer) 1 redis> HKEYS myhash 1) "field1" 2) "field2"
HVALS
獲取 hash 中的所有的值。
語法
HVALS key
時(shí)間復(fù)雜度:O(N), N 為 field 的個(gè)數(shù).
返回值:所有的值。
舉例
redis> HSET myhash field1 "Hello" (integer) 1 redis> HSET myhash field2 "World" (integer) 1 redis> HVALS myhash 1) "Hello" 2) "World"
HGETALL
獲取 hash 中的所有字段以及對(duì)應(yīng)的值。
語法
HGETALL key
時(shí)間復(fù)雜度:O(N), N 為 field 的個(gè)數(shù).
返回值:字段和對(duì)應(yīng)的值。
舉例
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"
HMGET
?次獲取 hash 中多個(gè)字段的值。
語法
HMGET key field [field ...]
時(shí)間復(fù)雜度:只查詢?個(gè)元素為 O(1), 查詢多個(gè)元素為 O(N), N 為查詢?cè)貍€(gè)數(shù).
返回值:字段對(duì)應(yīng)的值或者 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)
HLEN
獲取 hash 中的所有字段的個(gè)數(shù)。
語法
HLEN key
時(shí)間復(fù)雜度:O(1)
返回值:字段個(gè)數(shù)。
舉例
redis> HSET myhash field1 "Hello" (integer) 1 redis> HSET myhash field2 "World" (integer) 1 redis> HLEN myhash (integer) 2
HSETNX
在字段不存在的情況下,設(shè)置 hash 中的字段和值。
語法
HSETNX key field value
時(shí)間復(fù)雜度:O(1)
返回值:1 表?設(shè)置成功,0 表?失敗。
舉例
redis> HSETNX myhash field "Hello" (integer) 1 redis> HSETNX myhash field "World" (integer) 0 redis> HGET myhash field "Hello"
HINCRBY
將 hash 中字段對(duì)應(yīng)的數(shù)值添加指定的值。
語法
HINCRBY key field increment
時(shí)間復(fù)雜度: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
HINCRBYFLOAT
HINCRBY 的浮點(diǎn)數(shù)版本。
語法
HINCRBYFLOAT key field increment
時(shí)間復(fù)雜度: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"
內(nèi)部編碼
哈希的內(nèi)部編碼有兩種:
ziplist(壓縮列表):當(dāng)哈希類型元素個(gè)數(shù)?于 hash-max-ziplist-entries 配置(默認(rèn) 512 個(gè))、同時(shí)所有值都?于 hash-max-ziplist-value 配置(默認(rèn) 64 字節(jié))時(shí),Redis 會(huì)使? ziplist 作為哈希的內(nèi)部實(shí)現(xiàn),ziplist 使?更加緊湊的結(jié)構(gòu)實(shí)現(xiàn)多個(gè)元素的連續(xù)存儲(chǔ),所以在節(jié)省內(nèi)存???hashtable 更加優(yōu)秀。
hashtable(哈希表):當(dāng)哈希類型?法滿? ziplist 的條件時(shí),Redis 會(huì)使? hashtable 作為哈希的內(nèi)部實(shí)現(xiàn),因?yàn)榇藭r(shí) ziplist 的讀寫效率會(huì)下降,? hashtable 的讀寫時(shí)間復(fù)雜度為 O(1)。
下?的?例演?了哈希類型的內(nèi)部編碼,以及響應(yīng)的變化。
1)當(dāng) field 個(gè)數(shù)?較少且沒有?的 value 時(shí),內(nèi)部編碼為 ziplist:
127.0.0.1:6379> hmset hashkey f1 v1 f2 v2
OK
127.0.0.1:6379> object encoding hashkey
"ziplist”
2)當(dāng)有 value ?于 64 字節(jié)時(shí),內(nèi)部編碼會(huì)轉(zhuǎn)換為 hashtable:
127.0.0.1:6379> hset hashkey f3 "one string is bigger than 64 bytes ... 省略 ..."
OK
127.0.0.1:6379> object encoding hashkey
"hashtable"
3)當(dāng) field 個(gè)數(shù)超過 512 時(shí),內(nèi)部編碼也會(huì)轉(zhuǎn)換為 hashtable:
127.0.0.1:6379> hmset hashkey f1 v1 h2 v2 f3 v3 ... 省略 ... f513 v513
OK
127.0.0.1:6379> object encoding hashkey
"hashtable"
應(yīng)用場(chǎng)景
1.緩存數(shù)據(jù)
類似于String類型,Hash類型也可以用于緩存數(shù)據(jù)。不過,由于Hash類型可以存儲(chǔ)多個(gè)字段和字段值,因此更適合用于緩存具有多個(gè)屬性的數(shù)據(jù)。
例如,可以將經(jīng)常訪問的商品信息、用戶信息等緩存在Hash類型中,以便快速讀取和響應(yīng)客戶端請(qǐng)求。
2.對(duì)象屬性存儲(chǔ)
Hash類型非常適合存儲(chǔ)對(duì)象的各個(gè)屬性,如用戶信息、商品信息等??梢詫?duì)象類別和ID構(gòu)成鍵名,使用字段表示對(duì)象的屬性,而字段值則存儲(chǔ)屬性值。例如,要存儲(chǔ)ID為1的汽車對(duì)象,可以分別使用名為color、name和price的字段來存儲(chǔ)該輛汽車的顏色、名稱和價(jià)格。
同樣,對(duì)于用戶信息,可以將用戶的ID作為Hash類型的鍵,用戶的各種屬性(如用戶名、年齡、性別等)作為字段和字段值進(jìn)行存儲(chǔ)。
到此這篇關(guān)于Redis的Hash類型及相關(guān)命令小結(jié)的文章就介紹到這了,更多相關(guān)Redis Hash類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis與數(shù)據(jù)庫數(shù)據(jù)一致性的原因及解決方案
Redis作為一種高效的鍵值對(duì)存儲(chǔ)系統(tǒng),常用于緩存數(shù)據(jù)庫減少IO操作,下面這篇文章主要介紹了Redis與數(shù)據(jù)庫數(shù)據(jù)一致性的原因及解決方案,文中介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
Redis源碼與設(shè)計(jì)剖析之網(wǎng)絡(luò)連接庫
這篇文章主要為大家介紹了Redis源碼與設(shè)計(jì)剖析之網(wǎng)絡(luò)連接庫詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Redis 多規(guī)則限流和防重復(fù)提交方案實(shí)現(xiàn)小結(jié)
本文主要介紹了Redis 多規(guī)則限流和防重復(fù)提交方案實(shí)現(xiàn)小結(jié),包括使用String結(jié)構(gòu)和Zset結(jié)構(gòu)來記錄用戶IP的訪問次數(shù),具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02
Redis實(shí)現(xiàn)延遲任務(wù)的常見方案詳解
延遲任務(wù)(Delayed?Task)是指在未來的某個(gè)時(shí)間點(diǎn),執(zhí)行相應(yīng)的任務(wù),本文為大家整理了Redis實(shí)現(xiàn)延遲任務(wù)的幾個(gè)常見方案,希望對(duì)大家有所幫助2024-04-04
高并發(fā)場(chǎng)景分析之redis+lua防重校驗(yàn)
這篇文章主要介紹了高并發(fā)場(chǎng)景分析之redis+lua防重校驗(yàn),本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
Redis常用的數(shù)據(jù)結(jié)構(gòu)及實(shí)際應(yīng)用場(chǎng)景
本文介紹了Redis中常用的數(shù)據(jù)結(jié)構(gòu),包括字符串、列表、集合、哈希表、有序集合和Bitmap,并詳細(xì)說明了它們?cè)诟鞣N場(chǎng)景下的使用,需要的朋友可以參考下2024-05-05

