咱們知道在Redis中有5種數據類型,以前的文章中咱們已經介紹過了String類型,也就是字符串類型,今天咱們學習第二種數據類型,哈希類型。大部分語言基本都提供了哈希類型,如Java語言中的Map類型及Python語言中的字典類型等等。雖然語言不一樣,但它們基本使用都是同樣的。也就是都是鍵值對結構的。例如:python
value={{field1, value1}
下面咱們經過下圖來直觀感覺一下字符串類型和哈希類型的區別。redis
Redis中哈希類型都是鍵值對結構的,因此要特別注意這裏的value並非指的是Redis中的key的value,而是Redis中哈希類型中的field所對應的value。學習
下面咱們仍是和介紹字符串類型同樣,先是瞭解一下Redis中哈希類型的相關命令。編碼
命令spa
一. 設置值code
hset key field value
咱們看上圖執行的命令知道,hset命令也是有返回值的。若是hset命令設置成功,則返回1,不然則返回0。除此以外Redis也爲哈希類型提供了hsetnx命令。在字符串那篇文章中,咱們知道,nx命令則表示key不存在的時候,才能設置成功,而在Redis中hsetnx命令則表示field不存在的時候,才能設置成功。ip
二. 獲取值utf-8
hget key field
咱們看hget命令和get有很大的不一樣,get命令在獲取的時候,只要寫一個名字就能夠了,而hget命令則要寫兩個名字,第一個名字就是key 第二個名字就是field。除此以外,固然key或者field不存在時,返回的結果都是nil。作用域
三. 刪除fieldrem
hdel key field [field ...]
hdel命令刪除的時候,也會有返回值,而且這個返回就是成功刪除field的個數。當field不存在時,並不會報錯,而是直接返回0。
四. 計算field個數
hlen key
hlen命令返回的就是當前key中field的個數,若是key不存在,則返回0。
五. 批量設置或獲取field-value
hmget key field [field ...] hmset key field value [field value ...]
hmset命令和hmget命令分別都是批量設置和獲取值的,hmset命令沒有什麼要注意的,但hmget命令要特別注意,當咱們獲取一個不存在的key或者不存在的field時,Redis並不會報錯,而是返回nil。而且有幾個field不存在,則Redis返回幾個nil,當整個key都不存在時,則返回所有nil(有幾個field返回幾個nil)。
六. 判斷field是否存在
hexists key field
當執行hexists命令時,若是當前key包括field,則返回1,不然返回0。
七. 獲取全部field
hkeys key
八. 獲取全部value
hvals key
九. 獲取全部的field-value
hgetall key
hgetall命令會返回當前key中的全部field-value,並按照順序依次返回,也就是field-value field-value等等。
十. hincrby hincrbyfloat
hincrby key field increment hincrbyfloat key field increment
hincrby命令和incrby命令的使用功能基本同樣,都是對值進行增量操做的。惟一不一樣的就是incrby命令的做用域key,而hincrby命令的做用域則是field。
十一. 計算value的字符串長度
hstrlen key field
hstrlen命令返回的是當前key中field中字符串的長度,若是當前key中沒有field則返回0。
哈希類型命令的時間複雜度
命令 | 時間複雜度 |
---|---|
hset key field value | O(1) |
hget key field | O(1) |
hdel key field [field ...] | O(k) ,k是field個數 |
hlen key | O(1) |
hgetall key | O(n) ,n是field總數 |
hmget key field [field ...] | O(k) ,k是field個數 |
hmset key field value [field value ...] | O(k) ,k是field個數 |
hexists key field | O(1) |
hkeys key | O(n) ,n是field總數 |
hvals key | O(n) ,n是field總數 |
hsetnx key field value | O(1) |
hincrby key field increment | O(1) |
hincrbyfloat key field increment | O(1) |
hstrlen key field | O(1) |
內部編碼
在Redis哈希類型的內部編碼只有兩種它們分別是:
下面咱們經過如下命令來演示一下ziplist和hashtable這兩種內部編碼。
1.當field個數比較少而且value也不是很大時候Redis哈希類型的內部編碼爲ziplist。
2.當value中的字節數大於64字節時(能夠經過hash-max-ziplist-value設置),內部編碼會由ziplist變成hashtable。
由於在Redis中中文的字節數比英文的字節數大大,正常來講,一箇中文佔用3個字節。
3.當field個數超過512(能夠經過hash-max-ziplist-entries參數設置),內部編碼也會由ziplist變成hashtable。
因爲直接建立512個field不方便,爲了更好的驗證該功能,我將用程序的方式,動態建立512個field來驗證此功能,下面爲具體的代碼。
import redis r = redis.Redis(host='127.0.0.1', port=6379) print('Key爲【userinfo】的字節編碼爲【%s】' % r.object('encoding', 'userinfo').decode('utf-8')) for i in range(1,513): r.hset('userinfo', i, '吉林烏拉') print('Key爲【userinfo】的字節編碼爲【%s】' % r.object('encoding', 'userinfo').decode('utf-8'))
Key爲【userinfo】的字節編碼爲【ziplist】 Key爲【userinfo】的字節編碼爲【hashtable】
以上就是Redis中哈希類型的相關命令及內部編碼,如本文有不正確的地方歡迎指出。