1.哈希類型鍵值結構
哈希類型也是key-value結構,key是字符串類型,其value分為兩個部分:field和value
其中field部分代表屬性,value代表屬性對應的值
上面的圖里,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
使用時,根據用戶id獲取對應的數據的字符串格式,進行反序列化后就可以得到用戶相關的數據進行查詢和更新操作
5.2 方式二
使用用戶的id與用戶對應的屬性名進行拼接得到新的字符串,並做為key,用戶對應屬性的值做為value
這樣,用戶的所有信息都是分離開的,可以很方便的對用戶的數據進行查詢和更新,並且可以很方便的為用戶添加新的屬性,而不用對原來的屬性有影響
5.3 方式三
使用用戶id做為key,用戶的其他數據都保存為hash格式,
對用戶的屬性進行查詢,更新和添加都比較方便
保存用戶相關數據的方式比較