Redis hash 是一個 string 類型的 field 和 value 的映射表.它的添加、 刪除操作都是 O(1) (平均) 。
hash 特別適合用於存儲對象。 相較於將對象的每個字段存成單個 string 類型。 將一個對象存儲在 hash 類型中會占用更少的內存,並且可以更方便的存取整個對象。省內存的原因是新建一個 hash 對象時開始是用 zipmap(又稱為 small hash)來存儲的。這個 zipmap 其實並不是 hash table,但是 zipmap 相比正常的 hash 實現可以節省不少 hash 本身需要的一些元數據存儲開銷。盡管 zipmap 的添加,刪除,查找都是 O(n),但是由於一般對象的 field 數量都不太多。所以使用 zipmap 也是很快的,也就是說添加刪除平均還是 O(1)。如果 field 或者 value的大小超出一定限制後, Redis 會在內部自動將 zipmap 替換成正常的 hash 實現. 這個限制可以在配置文件中指定hash-max-zipmap-entries 64 #配置字段最多 64 個hash-max-zipmap-value 512 #配置 value 最大為 512 字節
HSET
HSET key field value
將哈希表 key 中的域 field 的值設為 value 。
如果 key 不存在,一個新的哈希表被創建並進行HSET 操作。
如果域 field 已經存在於哈希表中,舊值將被覆蓋。
時間復雜度: O(1)
返回值:
如果 field 是哈希表中的一個新建域,並且值設置成功,返回 1 。
如果哈希表中域 field 已經存在且舊值已被新值覆蓋,返回 0 。
127.0.0.1:6379[15]> HSET website google "www.g.cn"
(integer) 1
127.0.0.1:6379[15]> HSET website google "www.google.com"
(integer) 0
HSETNX
HSETNX key field value
將哈希表 key 中的域 field 的值設置為 value ,當且僅當域 field 不存在。若域 field 已經存在,該操作無效。
如果 key 不存在,一個新哈希表被創建並執行HSETNX 命令。
時間復雜度: O(1)
返回值:
設置成功,返回 1 。
如果給定域已經存在且沒有操作被執行,返回 0 。
127.0.0.1:6379[15]> HSETNX nosql key-value-store redis
(integer) 1
127.0.0.1:6379[15]> HSETNX nosql key-value-store Memcached
(integer) 0
127.0.0.1:6379[15]> HGET nosql key-value-store
"redis"
HMSET
HMSET key field value [field value …]
同時將多個 field-value (域 -值) 對設置到哈希表 key 中。此命令會覆蓋哈希表中已存在的域。
如果 key 不存在,一個空哈希表被創建並執行HMSET 操作。
時間復雜度: O(N),N 為 field-value 對的數量。
返回值:
如果命令執行成功,返回 OK 。
當 key 不是哈希表 (hash) 類型時,返回一個錯誤。
127.0.0.1:6379[15]> HMSET website google www.google.com yahoo www.yahoo.com
OK
127.0.0.1:6379[15]> HGET website google
"www.google.com"
127.0.0.1:6379[15]> HGET website yahoo
"www.yahoo.com"
HGET
HGET key field
返回哈希表 key 中給定域 field 的值。
時間復雜度: O(1)
返回值:
給定域的值。
當給定域不存在或是給定 key 不存在時,返回 nil 。
127.0.0.1:6379[15]> HSET site redis redis.com
(integer) 1
127.0.0.1:6379[15]> HGET site redis
"redis.com"
127.0.0.1:6379[15]> HGET site mysql
(nil)
HMGET
返回哈希表 key 中,一個或多個給定域的值。
如果給定的域不存在於哈希表,那麼返回一個 nil 值。
因為不存在的 key 被當作一個空哈希表來處理,所以對一個不存在的 key 進行HMGET 操作將返回一個只 帶有 nil 值的表。
時間復雜度: O(N),N 為給定域的數量。
返回值: 一個包含多個給定域的關聯值的表,表值的排列順序和給定域參數的請求順序一樣。
127.0.0.1:6379[15]> HMSET pet dog "doudou" cat "nounou"
OK
127.0.0.1:6379[15]> HMGET pet dog cat fake_pet
1) "doudou"
2) "nounou"
3) (nil)
HEXISTS
HEXISTS key field
查看哈希表 key 中,給定域 field 是否存在。
時間復雜度: O(1)
返回值:
如果哈希表含有給定域,返回 1 。
如果哈希表不含有給定域,或 key 不存在,返回 0 。
127.0.0.1:6379[15]> HEXISTS phone myphone
(integer) 0
127.0.0.1:6379[15]> HSET phone myphone nokia-1110
(integer) 1
127.0.0.1:6379[15]> HEXISTS phone myphone
(integer) 1
HDEL
HDEL key field [field …]
刪除哈希表 key 中的一個或多個指定域,不存在的域將被忽略。
時間復雜度: O(N),N 為要刪除的域的數量。
返回值: 被成功移除的域的數量,不包括被忽略的域。
127.0.0.1:6379[15]> HMSET key f1 "v1" f2 "v2" f3 "v3" f4 "v4"
OK
127.0.0.1:6379[15]> HGETALL key
1) "f1"
2) "v1"
3) "f2"
4) "v2"
5) "f3"
6) "v3"
7) "f4"
8) "v4"
127.0.0.1:6379[15]> HDEL key f1
(integer) 1
127.0.0.1:6379[15]> HDEL key not-field
(integer) 0
127.0.0.1:6379[15]> HDEL key f2 f3
(integer) 2
127.0.0.1:6379[15]> HDEL key f4 f1
(integer) 1
HKEYS
HKEYS key
返回哈希表 key 中的所有域。
時間復雜度: O(N),N 為哈希表的大小。
返回值:
一個包含哈希表中所有域的表。
當 key 不存在時,返回一個空表。
127.0.0.1:6379[15]> HMSET website google www.google.com yahoo www.yahoo.com
OK
127.0.0.1:6379[15]> HKEYS website
1) "google"
2) "yahoo"
127.0.0.1:6379[15]> EXISTS fake_key
(integer) 0
127.0.0.1:6379[15]> HKEYS fake_key
(empty list or set)
HVALS
HVALS key
返回哈希表 key 中所有域的值。
時間復雜度: O(N),N 為哈希表的大小。
返回值:
一個包含哈希表中所有值的表。
當 key 不存在時,返回一個空表。
127.0.0.1:6379[15]> HMSET website google www.google.com yahoo www.yahoo.com
OK
127.0.0.1:6379[15]> HVALS website
1) "www.google.com"
2) "www.yahoo.com"
127.0.0.1:6379[15]> EXISTS not_exists
(integer) 0
127.0.0.1:6379[15]> HVALS not_exists
(empty list or set)
HGETALL
HGETALL key
返回哈希表 key 中,所有的域和值。
在返回值裡,緊跟每個域名 (field name) 之後是域的值 (value),所以返回值的長度是哈希表大小的兩倍。
時間復雜度: O(N),N 為哈希表的大小。
返回值:
以列表形式返回哈希表的域和域的值。
若 key 不存在,返回空列表。
127.0.0.1:6379[15]> HSET people jack "Jack Sparrow"
(integer) 1
127.0.0.1:6379[15]> HSET people gump "Forrest Gump"
(integer) 1
127.0.0.1:6379[15]> HGETALL people
1) "jack"
2) "Jack Sparrow"
3) "gump"
4) "Forrest Gump"
HINCRBY
HINCRBY key field increment
為哈希表 key 中的域 field 的值加上增量 increment 。
增量也可以為負數,相當於對給定域進行減法操作。
如果 key 不存在,一個新的哈希表被創建並執行HINCRBY 命令。
如果域 field 不存在,那麼在執行命令前,域的值被初始化為 0 。
對一個儲存字符串值的域 field 執行HINCRBY 命令將造成一個錯誤。
本操作的值被限制在 64 位 (bit) 有符號數字表示之內。
時間復雜度: O(1)
返回值: 執行HINCRBY 命令之後,哈希表 key 中域 field 的值。
127.0.0.1:6379[15]> HEXISTS counter page_view
(integer) 0
127.0.0.1:6379[15]> HINCRBY counter page_view 200
(integer) 200
127.0.0.1:6379[15]> HGET counter page_view
"200"
127.0.0.1:6379[15]> HINCRBY counter page_view -50
(integer) 150
127.0.0.1:6379[15]> HGET counter page_view
"150"
HINCRBYFLOAT
HINCRBYFLOAT key field increment
為哈希表 key 中的域 field 加上浮點數增量 increment 。
如果哈希表中沒有域 field ,那麼HINCRBYFLOAT 會先將域 field 的值設為 0 ,然後再執行加法操作。
如果鍵 key 不存在,那麼HINCRBYFLOAT 會先創建一個哈希表,再創建域 field ,最後再執行加法操作。
當以下任意一個條件發生時,返回一個錯誤:
域 field 的值不是字符串類型 (因為 redis 中的數字和浮點數都以字符串的形式保存,所以它們都屬於字符串類型)
域 field 當前的值或給定的增量 increment 不能解釋 (parse) 為雙精度浮點數 (double precision floating point number)
返回值: 執行加法操作之後 field 域的值。
127.0.0.1:6379[15]> HSET mykey field 10.50
(integer) 0
127.0.0.1:6379[15]> HINCRBYFLOAT mykey field 0.1
"10.6"
127.0.0.1:6379[15]> HSET mykey field 5.0e3
(integer) 0
127.0.0.1:6379[15]> HINCRBYFLOAT mykey field 2.0e2
"5200"
127.0.0.1:6379[15]> EXISTS price
(integer) 0
127.0.0.1:6379[15]> HINCRBYFLOAT price milk 3.5
"3.5"
127.0.0.1:6379[15]> HGETALL price
1) "milk"
2) "3.5"
HLEN
HLEN key
返回哈希表 key 中域的數量。
返回值:
哈希表中域的數量。
當 key 不存在時,返回 0 。
127.0.0.1:6379[15]> HSET db redis redis.com
(integer) 1
127.0.0.1:6379[15]> HSET db mysql mysql.com
(integer) 1
127.0.0.1:6379[15]> HLEN db
(integer) 2
127.0.0.1:6379[15]> HSET db mongodb mongodb.org
(integer) 1
127.0.0.1:6379[15]> HLEN db
(integer) 3