Redis哈希類型

咱們知道在Redis中有5種數據類型,以前的文章中咱們已經介紹過了String類型,也就是字符串類型,今天咱們學習第二種數據類型,哈希類型。大部分語言基本都提供了哈希類型,如Java語言中的Map類型及Python語言中的字典類型等等。雖然語言不一樣,但它們基本使用都是同樣的。也就是都是鍵值對結構的。例如:python

value={{field1, value1}

下面咱們經過下圖來直觀感覺一下字符串類型和哈希類型的區別。redis

img

Redis中哈希類型都是鍵值對結構的,因此要特別注意這裏的value並非指的是Redis中的key的value,而是Redis中哈希類型中的field所對應的value。學習

下面咱們仍是和介紹字符串類型同樣,先是瞭解一下Redis中哈希類型的相關命令。編碼

命令spa


一. 設置值code

hset key field value

img

咱們看上圖執行的命令知道,hset命令也是有返回值的。若是hset命令設置成功,則返回1,不然則返回0。除此以外Redis也爲哈希類型提供了hsetnx命令。在字符串那篇文章中,咱們知道,nx命令則表示key不存在的時候,才能設置成功,而在Redis中hsetnx命令則表示field不存在的時候,才能設置成功。ip


二. 獲取值utf-8

hget key field

img
咱們看hget命令和get有很大的不一樣,get命令在獲取的時候,只要寫一個名字就能夠了,而hget命令則要寫兩個名字,第一個名字就是key 第二個名字就是field。除此以外,固然key或者field不存在時,返回的結果都是nil。作用域


三. 刪除fieldrem

hdel key field [field ...]

img

hdel命令刪除的時候,也會有返回值,而且這個返回就是成功刪除field的個數。當field不存在時,並不會報錯,而是直接返回0。


四. 計算field個數

hlen key

img

hlen命令返回的就是當前key中field的個數,若是key不存在,則返回0。


五. 批量設置或獲取field-value

hmget key field [field ...]
hmset key field value [field value ...]

img

hmset命令和hmget命令分別都是批量設置和獲取值的,hmset命令沒有什麼要注意的,但hmget命令要特別注意,當咱們獲取一個不存在的key或者不存在的field時,Redis並不會報錯,而是返回nil。而且有幾個field不存在,則Redis返回幾個nil,當整個key都不存在時,則返回所有nil(有幾個field返回幾個nil)。


六. 判斷field是否存在

hexists key field

img

當執行hexists命令時,若是當前key包括field,則返回1,不然返回0。

七. 獲取全部field

hkeys key

img


八. 獲取全部value

hvals key

img


九. 獲取全部的field-value

hgetall key

img

hgetall命令會返回當前key中的全部field-value,並按照順序依次返回,也就是field-value field-value等等。


十. hincrby hincrbyfloat

hincrby key field increment
hincrbyfloat key field increment

img

hincrby命令和incrby命令的使用功能基本同樣,都是對值進行增量操做的。惟一不一樣的就是incrby命令的做用域key,而hincrby命令的做用域則是field。


十一. 計算value的字符串長度

hstrlen key field

img

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(壓縮列表):當哈希類型中元素個數小於hash-max-ziplist-entries配置(默認512個)同時全部值都小於hash-max-ziplist-value配置(默認64字節)時,Redis會使用ziplist做爲哈希的內部實現。
  • hashtable(哈希表):當上述條件不知足時,Redis則會採用hashtable做爲哈希的內部實現。

下面咱們經過如下命令來演示一下ziplist和hashtable這兩種內部編碼。

1.當field個數比較少而且value也不是很大時候Redis哈希類型的內部編碼爲ziplist。
img

2.當value中的字節數大於64字節時(能夠經過hash-max-ziplist-value設置),內部編碼會由ziplist變成hashtable。
img
由於在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中哈希類型的相關命令及內部編碼,如本文有不正確的地方歡迎指出。


原文連接:http://jilinwula.com/article/...

相關文章
相關標籤/搜索