高可用Redis(三):Hash類型

1.哈希類型鍵值結構

哈希類型也是key-value結構,key是字符串類型,其value分爲兩個部分:field和value
其中field部分表明屬性,value表明屬性對應的值python

上面的圖裏,user:1:info爲key,name,age,Date爲user這個key的一些屬性,value是屬性對應的值mysql

在hash中,能夠爲key添加一個新的屬性和新的值redis

好比使用下面的命令向user:1:info這個key添加一個新屬性viewCounter,屬性對應的值爲100sql

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

注意事項:code

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

例子:blog

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

使用時,根據用戶id獲取對應的數據的字符串格式,進行反序列化後就能夠獲得用戶相關的數據進行查詢和更新操做

5.2 方式二

使用用戶的id與用戶對應的屬性名進行拼接獲得新的字符串,並作爲key,用戶對應屬性的值作爲value

這樣,用戶的全部信息都是分離開的,能夠很方便的對用戶的數據進行查詢和更新,而且能夠很方便的爲用戶添加新的屬性,而不用對原來的屬性有影響 

5.3 方式三

使用用戶id作爲key,用戶的其餘數據都保存爲hash格式,

對用戶的屬性進行查詢,更新和添加都比較方便

保存用戶相關數據的方式比較

相關文章
相關標籤/搜索