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>