hash数据类型

Redis的hash是一个string类型的field(字段)和value的映射表。它的添加、删除操作都是0/1(平均操作法)。hash特别适合用于存储对象。相较于将对象的每一个字段存成单个string类型。。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。

hash数据类型方法

  • hset:设置hash field为指定值,如果key不存在,则先创建
  • hsetnx:设置hash field为指定值,如果key不存在,则先创建,如果存在,就返回0
  • hmset:同时设置hash的多个field(字段)
  • hmget:获取全部指定的hash field
  • hincrby:给指定的hash field加上给定的值
  • hexists:测试指定field是否存在
  • hlen:返回指定hash的field数量
  • hdel:删除指定的hash的field
  • hkeys:返回hash的所有field
  • hvals:返回hash表的所有value
  • hgetall:获取某个hash表中全部的field及对应的value(常用)

方法及操作

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>