国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

redis—Hash哈希

這篇具有很好參考價值的文章主要介紹了redis—Hash哈希。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

前言

1.常見命令

1.1命令小結

1.2內(nèi)部編碼

2.使用場景


前言

幾乎所有的主流編程語言都提供了哈希(hash) 類型,它們的叫法可能是哈希、字典、關聯(lián)數(shù)組、映射。在Redis中,哈希類型是指值本身又是一個鍵值對結構,形如key= "key", value={{
field1, value1 }, ... {fieldN, valueN }}, Redis 鍵值對和哈希類型二者的關系可以用圖2-15來表示。
圖2-15字符串和哈希類型對比

redis—Hash哈希,哈希算法,redis,算法

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

1.常見命令

HSET
設置hash中指定的字段(field) 的值(value) 。
語法:

HSET key field value [field value ...] 

命令有效版本: 2.0.0之后
時間復雜度:插入一組field為0(1),插入N組field為O(N)
返回值:添加的字段的個數(shù)。
示例:

redis> HSET myhash field1 "Hello"
(integer) 1
redis> HGET myhash field1
"Hello"

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)

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

HDEL
刪除hash中指定的字段。
語法:

HDEL key field [field ...]

命令有效版本: 2.0.0之后
時間復雜度:刪除一個元素為0(1).刪除N個元素為O(N).
返回值:本次操作刪除的字段個數(shù)。
示例:

redis> HSET myhash field1 "foo"
(integer) 1
redis> HDEL myhash field1
(integer) 1
redis> HDEL myhash field2
(integer) 0

HKEYS
獲取hash中的所有字段。
語法:

HKEYS key 

命令有效版本: 2.0.0之后
時間復雜度: O(N), N為field的個數(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 

命令有效版本: 2.0.0 之后
時間復雜度: O(N), N為field的個數(shù).
返回值:所有的值。
示例:

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

HGETALL
獲取hash中的所有字段以及對應的值。
語法:

HGETALL key 

命令有效版本: 2.0.0之后
時間復雜度: O(N), N為field的個數(shù).
返回值:字段和對應的值。
示例:

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中多個字段的值。
語法:

HMGET key field [field ...] 

命令有效版本: 2.0.0之后
時間復雜度:只查詢一個元素為0(1),查詢多個元素為O(N), N為查詢元素個數(shù).
返回值:字段對應的值或者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時,如果哈希元素個數(shù)比較多,會存在阻塞Redis的可能。如果開發(fā)人員只需要獲取部分field,可以使用HMGET,如果一定要獲取全部field,可以嘗試使用HSCAN命令,該命令采用漸進式遍歷哈希類型,HSCAN會在后續(xù)章節(jié)介紹。

HLEN
獲取hash中的所有字段的個數(shù)。
語法:

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

HSETNX
在字段不存在的情況下,設置hash中的字段和值。
語法:

HSETNX key field value 

命令有效版本: 2.0.0之后
時間復雜度: 0(1)
返回值: 1表示設置成功,0表示失敗。
示例:

redis> HSETNX myhash field "Hello"
(integer) 1
redis> HSETNX myhash field "World"
(integer) 0
redis> HGET myhash field
"Hello"

HINCRBY
將hash中字段對應的數(shù)值添加指定的值。
語法:

HINCRBY key field increment 

命令有效版本: 2.0.0之后
時間復雜度: 0(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的浮點數(shù)版本。
語法:

HINCRBYFLOAT key field increment 

命令有效版本: 2.6.0之后
時間復雜度: 0(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"

1.1命令小結

表2-4是哈希類型命令的效果、時間復雜度,開發(fā)人員可以參考此表,結合自身業(yè)務需求和數(shù)據(jù)
大小選擇合適的命令。
表2-4哈希類型命令小結

redis—Hash哈希,哈希算法,redis,算法

1.2內(nèi)部編碼

哈希的內(nèi)部編碼有兩種:
ziplist (壓縮列表) : 當哈希類型元素個數(shù)小于hash-max -ziplist-entries配置(默認512個)、
同時所有值都小于hash-max- ziplist-value配置(默認 64字節(jié))時,Redis 會使用ziplist作為哈
希的內(nèi)部實現(xiàn),ziplist 使用更加緊湊的結構實現(xiàn)多個元素的連續(xù)存儲,所以在節(jié)省內(nèi)存方面比
hashtable更加優(yōu)秀。
●hashtable (哈希表) :當哈希類型無法滿足ziplist的條件時,Redis 會使用hashtable作為哈希
的內(nèi)部實現(xiàn),因為此時ziplist的讀寫效率會下降,而hashtable的讀寫時間復雜度為0(1)。
下面的示例演示了哈希類型的內(nèi)部編碼,以及響應的變化。
1)當field個數(shù)比較少且沒有大的value時,內(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)當有value大于64字節(jié)時,內(nèi)部編碼會轉(zhuǎn)換為hashtable:

127.0.0.1:6379> hset hashkey f3 "one string is bigger than 64 bytes ... 省略 ..." 1
OK
127.0.0.1:6379> object encoding hashkey
"hashtable"

3)當field個數(shù)超過512時,內(nèi)部編碼也會轉(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"

2.使用場景

圖2-16為關系型數(shù)據(jù)表記錄的兩條用戶信息,用戶的屬性表現(xiàn)為表的列,每條用戶信息表現(xiàn)為行。如果映射關系表示這兩個用戶信息,則如圖2-17所示。
圖2-16關系型數(shù)據(jù)表保存用戶信息

redis—Hash哈希,哈希算法,redis,算法

圖2-17映射關系表示用戶信息

redis—Hash哈希,哈希算法,redis,算法

相比于使用JSON格式的字符串緩存用戶信息,哈希類型變得更加直觀,并且在更新操作.上變得
更靈活??梢詫⒚總€用戶的id定義為鍵后綴,多對field-value對應用戶的各個屬性,類似如下偽代
碼:

redis—Hash哈希,哈希算法,redis,算法

●哈希類型是稀疏的,而關系型數(shù)據(jù)庫是完全結構化的,例如哈希類型每個鍵可以有不同的field, 而
關系型數(shù)據(jù)庫一旦添加新的列,所有行都要為其設置值,即使為null,如圖2-18所示。
●關系數(shù)據(jù)庫可以做復雜的關系查詢,而Redis去模擬關系型復雜查詢,例如聯(lián)表查詢、聚合查詢等基本不可能,維護成本高。
圖2-18關系型數(shù)據(jù)庫稀疏性

redis—Hash哈希,哈希算法,redis,算法

緩存方式對比
截至目前為止,我們已經(jīng)能夠用三種方法緩存用戶信息,下面給出三種方案的實現(xiàn)方法和優(yōu)缺點
分析。
1.原生字符串類型一使用字符串類型, 每個屬性一個鍵。

set user:1:name James
set user:1:age 23
set user:1:city Beijing

優(yōu)點:實現(xiàn)簡單,針對個別屬性變更也很靈活。
缺點:占用過多的鍵,內(nèi)存占用量較大,同時用戶信息在Redis中比較分散,缺少內(nèi)聚性,所以這種
方案基本沒有實用性。
2.序列化字符串類型,例如JSON格式

set user:1 經(jīng)過序列化后的??對象字符串 

優(yōu)點:針對總是以整體作為操作的信息比較合適,編程也簡單。同時,如果序列化方案選擇合適,內(nèi)存的使用效率很高。
缺點:本身序列化和反序列需要一-定開 銷,同時如果總是操作個別屬性則非常不靈活。

3.hash類型:

hmset user:1 name James age 23 city Beijing 

優(yōu)點:簡單、直觀、靈活。尤其是針對信息的局部變更或者獲取操作。
缺點:需要控制哈希在ziplist和hashtable兩種內(nèi)部編碼的轉(zhuǎn)換,可能會造成內(nèi)存的較大消耗。
文章來源地址http://www.zghlxwxcb.cn/news/detail-762618.html

到了這里,關于redis—Hash哈希的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Redis命令---Hash(哈希)篇 (超全)

    Redis命令---Hash(哈希)篇 (超全)

    可用版本: = 2.0.0 返回值: 如果命令執(zhí)行成功,返回 OK 。 可用版本: = 2.0.0 返回值: 一個包含多個給定字段關聯(lián)值的表,表值的排列順序和指定字段的請求順序一樣。 可用版本: = 2.0.0 返回值: 如果字段是哈希表中的一個新建字段,并且值設置成功,返回 1 。 如果哈希表中域字段

    2024年02月19日
    瀏覽(18)
  • Redis數(shù)據(jù)類型-Hash哈希存儲類型

    Redis數(shù)據(jù)類型-Hash哈希存儲類型

    小白:偉哥,java中的Map集合類型在Redis中有對應的存儲嗎? 偉哥:有的,我?guī)銛]一波。 Redis的hash哈希存儲類型,類似于是java中的map存儲結構,適合用來存儲對象,每個哈希最多可以存儲4294967295(2^32-1)個字段值對,具體數(shù)量實際上也受Redis部署的虛擬機上的總內(nèi)存的限制

    2024年02月12日
    瀏覽(22)
  • Hash(哈希)算法-Python實現(xiàn)

    Hash(哈希)算法-Python實現(xiàn)

    哈希算法將任意長度的二進制值映射為較短的固定長度的二進制值,這個小的二進制值稱為哈希值。哈希值是一段數(shù)據(jù)唯一且極其緊湊的數(shù)值表示形式。如果散列一段明文而且哪怕只更改該段落的一個字母,隨后的哈希都將產(chǎn)生不同的值。要找到散列為同一個值的兩個不同的

    2023年04月15日
    瀏覽(28)
  • 哈希算法(hash)加密解密

    哈希算法(hash)加密解密

    套路一樣 hash_jiemi.py

    2024年02月13日
    瀏覽(22)
  • 哈希(Hash)查找算法詳解之C語言版

    哈希(Hash)查找算法詳解之C語言版

    哈希查找是一種快速查找算法,該算法不需要對進行比較,而是以為自變量,以該在存儲空間中的地址為因變量,建立某種函數(shù)關系,稱為哈希函數(shù),這樣在查找某一的時候,就可以通過哈希函數(shù)直接得到其地址,有效的提高了查找效率。 選取哈希

    2024年01月19日
    瀏覽(24)
  • 數(shù)據(jù)結構與算法 | 哈希表(Hash Table)

    數(shù)據(jù)結構與算法 | 哈希表(Hash Table)

    在二分搜索中提到了在有序集合中查詢某個特定元素的時候,通過折半的方式進行搜索是一種很高效的算法。那能否根據(jù)特征直接定位元素,而非折半去查找?哈希表(Hash Table),也稱為散列表,就是一種數(shù)據(jù)結構,用于實現(xiàn)鍵-值對的映射關系。它通過將鍵映射到特定的值

    2024年02月06日
    瀏覽(25)
  • 算法數(shù)據(jù)結構基礎——哈希表(Hash Table)

    算法數(shù)據(jù)結構基礎——哈希表(Hash Table)

    哈希表(Hash Table) :也叫做散列表。是根據(jù)關鍵碼值(Key Value)直接進行訪問的數(shù)據(jù)結構。 哈希表通過「鍵 key 」和「映射函數(shù) Hash(key) 」計算出對應的「值 value 」,把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數(shù)叫做「哈希函數(shù)(散列函數(shù)

    2024年02月13日
    瀏覽(29)
  • 算法---哈希及其在字符串中的應用(字符串hash)

    算法---哈希及其在字符串中的應用(字符串hash)

    ??????? ??\\\" 加密是信息時代的鎖,密碼是鑰匙 。\\\" - 斯科特·萊普斯基(Scott Adams) ? ? ? ? 當今,為了信息的存儲安全,密碼學興起,哈希(hash)算法也由此應運而生,哈希算法是一種加密算法,是將一個數(shù)據(jù)轉(zhuǎn)換為一個標志,這個標志和源數(shù)據(jù)有十分緊密的關系。哈希 算法

    2024年02月22日
    瀏覽(33)
  • OpenCV #以圖搜圖:均值哈希算法(Average Hash Algorithm)原理與實驗

    OpenCV #以圖搜圖:均值哈希算法(Average Hash Algorithm)原理與實驗

    均值哈希算法(Average Hash Algorithm,簡稱aHash) 是哈希算法的一種,主要用來做相似圖片的搜索工作。 ? 均值哈希算法(aHash)首先將原圖像縮小成一個固定大小的像素圖像,然后將圖像轉(zhuǎn)換為灰度圖像,通過縮小圖像的每個像素與平均灰度值的比較,生成一組哈希值。最后,

    2024年02月08日
    瀏覽(27)
  • OpenCV #以圖搜圖:感知哈希算法(Perceptual hash algorithm)的原理與實驗

    OpenCV #以圖搜圖:感知哈希算法(Perceptual hash algorithm)的原理與實驗

    感知哈希算法(Perceptual Hash Algorithm,簡稱pHash) 是哈希算法的一種,主要可以用來做以圖搜索/相似圖片搜索工作。 ? 感知哈希算法(pHash)首先將原圖像縮小成一個固定大小的像素圖像,然后將圖像轉(zhuǎn)換為灰度圖像,通過使用離散余弦變換(DCT)來獲取頻域信息。然后,根

    2024年02月05日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包