散列,是Redis提供的一种数据类型。散列类型适用于存储类型:对象:属性
结构的数据,其中,类型:对象
作为key,属性
作为字段,值是该字段的值。例如:
需要说明的是,redis同其他所有nosql数据库一样,并不强制要求每一个对象上的属性都一样,每个对象都可以根据需求定义任务属性,在散列类型中,每个对象最多支持2^32-1个字段,这会带来很大的灵活性。
散列类型的操作
操作命令
hset key field value #设置属性-值
hsetnx key field value #设置属性-值,若存在,不执行任何操作
hget key field #获取属性的值
hmset key filed1 value1 field2 value2 ... #同时设置多个属性-值
hmget key field1 field2 ... #同时获取多个属性的值
hgetall key #获取所有的属性和对应的值
hexists key field #判断属性是否存在
hincrby key field increment #增加
hdel key field #删除属性
hkeys key #只获取fields
hvals key #只获取values
hlen key #获取字段的数量
示例
127.0.0.1:6379> hset car color red
(integer) 1
127.0.0.1:6379> hsetnx car color blue
(integer) 0
127.0.0.1:6379> hget car color
"red"
127.0.0.1:6379> hmset car price 100 type benchi
OK
127.0.0.1:6379> hmget car color price type
1) "red"
2) "100"
3) "benchi"
127.0.0.1:6379> hgetall car
1) "color"
2) "red"
3) "price"
4) "100"
5) "type"
6) "benchi"
127.0.0.1:6379> hincrby car price 200
(integer) 300
127.0.0.1:6379> hdel car type
(integer) 1
127.0.0.1:6379> hgetall car
1) "color"
2) "red"
3) "price"
4) "300"
127.0.0.1:6379> hkeys car
1) "color"
2) "price"
127.0.0.1:6379> hvals car
1) "red"
2) "300"
127.0.0.1:6379> hlen car
(integer) 2
127.0.0.1:6379>
实践
1)存储博文数据
在Redis实战(字符串类型)中提到了利用redis存储博文数据的例子中,使用一个字符串来存储别序列化后的文章数据,其中包含了文章的多个属性。
这种方式存在一个问题:即要对博文数据进行操作时,无论操作的是标题还是具体内容,都需要获取文章的所有数据并进行反序列化,这样无疑会增加系统的性能消耗。
而本节中描述的散列类型可以对以上示例进行改进,利用字段的概念来存储文章的不同部分
这样在结构上也更加清晰,更易于维护。
127.0.0.1:6379> hmset post:1 title myfirstarticle context thisismyfirstarticle author zhangdong time 20161109
OK
127.0.0.1:6379> hgetall post:1
1) "title"
2) "myfirstarticle"
3) "context"
4) "thisismyfirstarticle"
5) "author"
6) "zhangdong"
7) "time"
8) "20161109"
127.0.0.1:6379>