我們可以将redis中的hashes類型看成具有string key和string value的map容器。是以該類型非常适合于存儲值對象的資訊。如username、password和age等。如果hash中包含很少的字段,那麼該類型的資料也将僅占用很少的磁盤空間。每一個hash可以存儲4294967295個鍵值對。
非常适合儲存一個對象,比如張三,有性别、姓名、年齡。
指令原型
時間複雜度
指令描述
傳回值
hset key field value
o(1)
為指定的key設定field/value對,如果key不存在,該指令将建立新key以參數中的field/value對,如果參數中的field在該key中已經存在,則用新值覆寫其原有值。
1表示新的field被設定了新值,0表示field已經存在,用新值覆寫原有值。
hget key field
傳回指定key中指定field的關聯值。
傳回參數中field的關聯值,如果參數中的key或field不存,傳回nil。
hexists key field
判斷指定key中的指定field是否存在。
1表示存在,0表示參數中的field或key不存在。
hlen key
擷取該key所包含的field的數量。
傳回key包含的field數量,如果key不存在,傳回0。
hdel key field [field …]
o(n)
時間複雜度中的n表示參數中待删除的字段數量。從指定key的hashes value中删除參數中指定的多個字段,如果不存在的字段将被忽略。如果key不存在,則将其視為空hashes,并傳回0.
實際删除的field數量。
hsetnx key field value
隻有當參數中的key或field不存在的情況下,為指定的key設定field/value對,否則該指令不會進行任何操作。
1表示新的field被設定了新值,0表示key或field已經存在,該指令沒有進行任何操作。
hincrby key field increment
增加指定key中指定field關聯的value的值。如果key或field不存在,該指令将會建立一個新key或新field,并将其關聯的value初始化為0,之後再指定數字增加的操作。該指令支援的數字是64位有符号整型,即increment可以負數。
傳回運算後的值。
hgetall key
時間複雜度中的n表示key包含的field數量。擷取該鍵包含的所有field/value。
其傳回格式為一個field、一個value,并以此類推。 field/value的清單。
hkeys key
時間複雜度中的n表示key包含的field數量。
傳回指定key的所有fields名。field的清單。
hvals key
傳回指定key的所有values名。 value的清單。
hmget key field [field …]
時間複雜度中的n表示請求的field數量。擷取和參數中指定fields關聯的一組values。如果請求的field不存在,其值傳回nil。如果key不存在,該指令将其視為空hash,是以傳回一組nil。
傳回和請求fields關聯的一組values,其傳回順序等同于fields的請求順序。
hmset key field value [field value …]
時間複雜度中的n表示被設定的field數量。逐對依次設定參數中給出的field/value對。
如果其中某個field已經存在,則用新值覆寫原有值。如果key不存在,則建立新key,同時設定參數中的field/value。
hset/hget/hdel/hexists/hlen/hsetnx:
在shell指令行啟動redis用戶端程式
/> redis-cli
給鍵值為myhash的鍵設定字段為field1,值為stephen。
redis 127.0.0.1:6379> hset myhash field1 “stephen”
(integer) 1
擷取鍵值為myhash,字段為field1的值。
redis 127.0.0.1:6379> hget myhash field1
“stephen”
myhash鍵中不存在field2字段,是以傳回nil。
redis 127.0.0.1:6379> hget myhash field2
(nil)
給myhash關聯的hashes值添加一個新的字段field2,其值為liu。
redis 127.0.0.1:6379> hset myhash field2 “liu”
擷取myhash鍵的字段數量。
redis 127.0.0.1:6379> hlen myhash
(integer) 2
判斷myhash鍵中是否存在字段名為field1的字段,由于存在,傳回值為1。
redis 127.0.0.1:6379> hexists myhash field1
删除myhash鍵中字段名為field1的字段,删除成功傳回1。
redis 127.0.0.1:6379> hdel myhash field1
再次删除myhash鍵中字段名為field1的字段,由于上一條指令已經将其删除,因為沒有删除,傳回0。
(integer) 0
判斷myhash鍵中是否存在field1字段,由于上一條指令已經将其删除,因為傳回0。
通過hsetnx指令給myhash添加新字段field1,其值為stephen,因為該字段已經被删除,是以該指令添加成功并傳回1。
redis 127.0.0.1:6379> hsetnx myhash field1 stephen
由于myhash的field1字段已經通過上一條指令添加成功,因為本條指令不做任何操作後傳回0。
2. hincrby:
删除該鍵,便于後面示例的測試
redis 127.0.0.1:6379> del myhash
準備測試資料,該myhash的field字段設定值1。
redis 127.0.0.1:6379> hset myhash field 5
給myhash的field字段的值加1,傳回加後的結果。
redis 127.0.0.1:6379> hincrby myhash field 1
(integer) 6
給myhash的field字段的值加-1,傳回加後的結果。
redis 127.0.0.1:6379> hincrby myhash field -1
(integer) 5
給myhash的field字段的值加-10,傳回加後的結果。
redis 127.0.0.1:6379> hincrby myhash field -10
(integer) -5
hgetall/hkeys/hvals/hmget/hmset:
删除該鍵,便于後面示例測試。
為該鍵myhash,一次性設定多個字段,分别是field1 = “hello”, field2 = “world”。
redis 127.0.0.1:6379> hmset myhash field1 “hello” field2 “world”
ok
擷取myhash鍵的多個字段,其中field3并不存在,因為在傳回結果中與該字段對應的值為nil。
redis 127.0.0.1:6379> hmget myhash field1 field2 field3
1) “hello”
2) “world”
3) (nil)
傳回myhash鍵的所有字段及其值,從結果中可以看出,他們是逐對列出的。
redis 127.0.0.1:6379> hgetall myhash
1) “field1”
2) “hello”
3) “field2”
4) “world”
僅擷取myhash鍵中所有字段的名字。
redis 127.0.0.1:6379> hkeys myhash
2) “field2”
僅擷取myhash鍵中所有字段的值。
redis 127.0.0.1:6379> hvals myhash