系統學習redis之四——redis數據類型之hash類型及操作
Redis的hash是一個string類型的field(字段)和value的映射表。它的添加、刪除操作都是0/1(平均操作法)。hash特別適合用於存儲對象。相較於將對象的每一個字段存成單個string類型。。將一個對象存儲在hash類型中會占用更少的內存,並且可以更方便的存取整個對象。
方法及操作
1)hset:設置hash field為指定值,如果key不存在,則先創建
例如:設置異常hash表,名字為user:001,然後給表裏面添加一個字段為name,對應的值為crystal:
[root@test101 redis-4.0.1]# src/redis-cli 127.0.0.1:6379> HSET user:001 name crystal #user:001可以看做是一個hash表的名稱,name是字段,crystal是字段的值 (integer) 1 127.0.0.1:6379> HGET user:001 name #獲取user:001這個表裏面name的值 "crystal" 127.0.0.1:6379>
備註,同《系統學習redis之三——redis數據類型之string類型及操作》一樣,後面的例子也都在同一臺機器一次性操作完畢的,因為後面的代碼如果不加上“ [root@test101 redis-4.0.1]# src/redis-cli ”這一句。代碼高亮也會格式有問題,所以後面所有的例子中都加上了“[root@test101 redis-4.0.1]# src/redis-cli ”,只是為了格式問題。
2)hsetnx:設置hash field為指定值,如果key不存在,則先創建,如果存在,就返回0
例如:黑hash表user:001設置age
[root@test101 redis-4.0.1]# src/redis-cli 127.0.0.1:6379> HSETNX user:001 age 10 #因為age這個key不存在,所以第一次指定成功 (integer) 1 127.0.0.1:6379> HGET user:001 age "10" 127.0.0.1:6379> HSETNX user:001 age 30 #age這個key剛剛已經設置過了,這裏就會設置失敗,而且不會覆蓋原來的值 (integer) 0 127.0.0.1:6379> HGET user:001 age "10" 127.0.0.1:6379>
3)hmset:同時設置hash的多個field(字段)
例如:一次性創建一張名字為user:002的hash表,並且設置裏面兩個字段:name=crystal,age=18
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> HMSET user:002 name crystal age 18
OK
127.0.0.1:6379> HGET user:002 name
"crystal"
127.0.0.1:6379> HGET user:002 age
"18"
127.0.0.1:6379>
4)hmget:獲取全部指定的hash field
例如:一次性獲取上面例子中user:002中的name和age的值
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> HMGET user:002 name age
1) "crystal"
2) "18"
127.0.0.1:6379> HMGET user:002 name age sex #這裏因為表中並沒有sex這個字段,所以會返回空值
1) "crystal"
2) "18"
3) (nil)
127.0.0.1:6379>
5)hincrby:給指定的hash field加上給定的值
例如:給user:002中的age加上10歲
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> HMGET user:002 name age
1) "crystal"
2) "18"
127.0.0.1:6379> HINCRBY user:002 age 10 #給 age加上10歲
(integer) 28
127.0.0.1:6379> HGET user:002 age
"28"
127.0.0.1:6379> HINCRBY user:002 age -8 #給age減了8歲
(integer) 20
127.0.0.1:6379> HGET user:002 age
"20"
127.0.0.1:6379>
6)hexists:測試指定field是否存在
例如:檢測hash表user:002裏面name和sex是否存在
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> HEXISTS user:002 name #name存在,返回1
(integer) 1
127.0.0.1:6379> HEXISTS user:002 sex #sex字段不存在,返回0
(integer) 0
127.0.0.1:6379>
7)hlen:返回指定hash的field數量
例如:查看hash表user:002的field數量
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> HLEN user:002
(integer) 2 #2表示2個field
8)hdel:刪除指定的hash的field
例如:刪除user:001裏面的field age
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> HGET user:001 age
"18"
127.0.0.1:6379>
127.0.0.1:6379> HDEL user:001 age
(integer) 1
127.0.0.1:6379> HGET user:001 age #age已經成功刪除,因此這裏返回nil空值
(nil)
127.0.0.1:6379>
9)hkeys:返回hash的所有field
例如:返回hash表user:001和user:002所有的field
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> HKEYS user:001
1) "name"
127.0.0.1:6379>
127.0.0.1:6379> HKEYS user:002
1) "name"
2) "age"
10)hvals:返回hash表的所有value
例如:返回hash表user:002和user:001所有的value
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> HVALS user:001
1) "crystal"
127.0.0.1:6379> HVALS user:002
1) "crystal"
2) "20"
127.0.0.1:6379> :
11)hgetall:獲取某個hash表中全部的field及對應的value(常用)
例如:返回hash表user:002和user:001所有的field及其value
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> HGETALL user:001
1) "name" #field
2) "crystal" #value
127.0.0.1:6379> HGETALL user:002
1) "name" #field1
2) "crystal" #value1
3) "age" #field2
4) "20" #value2
127.0.0.1:6379>
系統學習redis之四——redis數據類型之hash類型及操作