天天看點

高可用Redis(三):Hash類型

1.哈希類型鍵值結構

哈希類型也是key-value結構,key是字元串類型,其value分為兩個部分:field和value

其中field部分代表屬性,value代表屬性對應的值

高可用Redis(三):Hash類型

上面的圖裡,

user:1:info

為key,

name,age,Date

為user這個key的一些屬性,value是屬性對應的值

在hash中,可以為key添加一個新的屬性和新的值

比如使用下面的指令向user:1:info這個key添加一個新屬性viewCounter,屬性對應的值為100

hset user:1:info viewCounter 100           

2.特點

key-value結構
key(field)不能相同,value可以相同           

3.Redis哈希類型對應的指令

3.1 hget指令,hset指令和hdel指令

hget key field          擷取hash key對應的field的value
hset key field value    設定hash key對應的field的value
hdel key field          删除hash key對應的field的value           

例子:

127.0.0.1:6379> hset user:1:info age 23
(integer) 1
127.0.0.1:6379> hget user:1:info age
"23"
127.0.0.1:6379> hset user:1:info name python
(integer) 1
127.0.0.1:6379> hgetall user:1:info
1) "age"
2) "23"
3) "name"
4) "python"
127.0.0.1:6379> hdel user:1:info age
(integer) 1
127.0.0.1:6379> hgetall user:1:info
1) "name"
2) "python"
127.0.0.1:6379>            

注意事項:

hget指令,hset指令和hdel指令的時間複雜度為O(1)           

3.2 hexists指令和hlen指令

hexists key field   判斷hash key是否有field
hlen key            擷取hash key field的數量           
127.0.0.1:6379> hgetall user:1:info
1) "name"
2) "python"
3) "age"
4) "23"
127.0.0.1:6379> hexists user:1:info name
(integer) 1
127.0.0.1:6379> hlen user:1:info
(integer) 2           
hexists指令和hlen指令的時間複雜度為O(1)           

3.3 hmget指令和hmset指令

hmget key field1 field2 ... fieldN                          批量擷取hash key的一批field對應的值
hmset key field1 value1 field2 value2 ... fieldN valueN     批量設定hash key的一批field value           
127.0.0.1:6379> hmset user:2:info age 30 name mysql page 50
OK
127.0.0.1:6379> hlen user:2:info
(integer) 3
127.0.0.1:6379> hmget user:2:info age name
1) "30"
2) "mysql"
127.0.0.1:6379>            
hmget指令和hmset指令的時間複雜度為O(1)           

3.4 hgetall指令,hvals指令和hkeys指令

hgetall key         傳回hash key對應所有的field和value
hvals key           傳回hash key對應所有field的value
hkeys key           傳回hash key對應所有field           
127.0.0.1:6379> hgetall user:2:info
1) "age"
2) "30"
3) "name"
4) "mysql"
5) "page"
6) "50"
127.0.0.1:6379> hvals user:2:info
1) "30"
2) "mysql"
3) "50"
127.0.0.1:6379> hkeys user:2:info
1) "age"
2) "name"
3) "page"           
hgetall指令,hvals指令和hkeys指令的時間複雜度為O(1)
由于Redis的單線程的特點以及hgetall會傳回所有的key和value,是以如果hash中存儲的資料過多時,hgetall指令的執行速度會比較慢           

3.5 hsetnx指令,hincrby指令和hincrbyfloat指令

hsetnx key field value                  設定hash key對應field的value(如field已經存在,則失敗)
hincrby key field intCounter            hash key對應的field的value自增intCounter
hincrbyfloat key field floatCounter     hincrby浮點數版            
hsetnx指令,hincrby指令和hincrbyfloat指令的時間複雜度為O(1)           

4.實戰

記錄網站每個使用者個人首頁的通路量,也可以使用哈希類型

這樣可以保證每個使用者的相關資料是一個整體,而使用字元串類型儲存的話,則每個使用者個人主面的通路量與每個使用者的其他資料都是一個分離的狀态。

記錄網站每個使用者個人首頁的通路量需要根據實際情況來進行設計使用

hincrby user:1:info pageview count           

5.使用Redis儲存每個使用者相關的資料,可以使用三種方式

5.1 方式一

使用使用者的id為key,把使用者的相關資料進行序列化後并做為value

高可用Redis(三):Hash類型

使用時,根據使用者id擷取對應的資料的字元串格式,進行反序列化後就可以得到使用者相關的資料進行查詢和更新操作

5.2 方式二

使用使用者的id與使用者對應的屬性名進行拼接得到新的字元串,并做為key,使用者對應屬性的值做為value

高可用Redis(三):Hash類型

這樣,使用者的所有資訊都是分離開的,可以很友善的對使用者的資料進行查詢和更新,并且可以很友善的為使用者添加新的屬性,而不用對原來的屬性有影響 

5.3 方式三

使用使用者id做為key,使用者的其他資料都儲存為hash格式,

高可用Redis(三):Hash類型

對使用者的屬性進行查詢,更新和添加都比較友善

儲存使用者相關資料的方式比較

高可用Redis(三):Hash類型