您的位置:首页 > 数据库 > Redis

redis学习 第三章 5种数据类型----hash类型

2016-10-09 14:16 399 查看
跟着Redis入门指南学习

第三章 5种数据类型----hash类型

3.3(散列类型)

redis采用几点结构以健值对的形式存储数据的,而散列类型(hash)的健值也是一种字典结构,其存储了字段和字段值的映射。但字段值只能是字符串,不支持其他数据类型。换句话说,散列类型不能嵌套其他的数据类型。一个散列类型健可以包含至多2^32 -1个字段。

提示:除了散列类型,redis的其他数据类型同样不支持数据类型嵌套。比如集合类型的每个元素都只能是字符串,而不能是另一个集合或者散列表等。

散列类型适合存储对象:使用对象类别和ID构成健名,使用字段表示的对象的属性,而字段值则存储属性值。例如要存储ID为2的汽车对象,可以分别使用名为color、name和price的3个字段来存储该汽车的颜色、名称和价格。

在关系数据库中如果要存储汽车对象,数据是以二维表的形式存储的,这就要所有的记录都拥有同样的属性,无法单独为某条几率增减属性,如果想为ID为1的汽车增加生产日期属性,就需要把数据表更改添加一个data属性,对于之前的数据data就是冗余的。可想而知当不同的记录需要不同的属性时,表的字段数量会越来越多以至于难以维护。而且当使用ORM将关系数据库中的对象实体映射成程序中的实体时,修改表的结构往往意味着要中断服务(重启网站程序)。为了防止这些问题,在关系数据库中存储这种半结构化数据还需要额外的表才行。

而redis的散列类型则不存在这个问题。redis并不要求每个健都依据此结构存储,我们完全可以自由的位任何健增减字段而不影响其他健。

3.3.2 命令

1.赋值与取值

hset key field value
hget key fiels
hmset key field value [field value ...]
hmget key field [field ...]
hgetall key hset命令用来给字段赋值,而hget命令来获取字段的值,用法如下:

127.0.0.1:6379[1]> hset car price 500
(integer) 1
127.0.0.1:6379[1]> hset car price 666
(integer) 0
127.0.0.1:6379[1]> hget car price
"666"
127.0.0.1:6379[1]> hset car name bmw
(integer) 1
127.0.0.1:6379[1]> hget car name
"bmw" hset命令的方便之处在于不区分插入和更新操作,这意味着修改数据时不用事先判断字段是否存在来决定要执行的是插入操作(insert)还是更新操作(update)。当执行的是插入时(即之前字段不存在)hset命令返回1,当执行的是更新操作时,返回的是0.当健本身不存在时,hset命令还会自动建立它。

提示:在redis中每个健都属于一个明确的数据类型,如通过hset命令建立的健是散列类型,通过set命令建立的健是字符串类型等。使用一种数据类型的命令操作另一种数据类型的健会提示错误:err operation against a key holding the wrong kind of value.

127.0.0.1:6379[1]> hmget car name price
1) "bmw"
2) "666"
127.0.0.1:6379[1]> hmset car color blue data 2016
OK
127.0.0.1:6379[1]> hmget car name price color data
1) "bmw"
2) "666"
3) "blue"
4) "2016"
127.0.0.1:6379[1]> hgetall car
1) "price"
2) "666"
3) "name"
4) "bmw"
5) "color"
6) "blue"
7) "data"
8) "2016" 如果想获取健中所有字段和字段值却不知道健中有哪些字段时,应该使用hgetall命令,返回的结果是字段和字段值组成的列表,不是很直观,好在很多语言的redis客户端会将hgetall的返回结果封装成编程语言中的对象,处理起来就非常方便了。例如,在node.js中:

redis.hgetall("car",function(error,car){
//hgetall方法的返回值被封装成了javaSript的对象
console.log(car.price);
console.log(car.name);
});
2.判断字段是否存在

hexists key field 若果存在返回1,否则返回0。(如果健不存在也会返回0)。
127.0.0.1:6379[1]> hexists car model
(integer) 0
127.0.0.1:6379[1]> hexists car name
(integer) 1
127.0.0.1:6379[1]> hexists nocar name
(integer) 0

3.字段不存在时赋值

hsetnx key field value hsetnx命令与hset命令类似,区别在于如果字段已经存在,hsetnx命令将不执行任何操作。hsetnx命令是原子操作,不用担心竞态条件。

4.增加数字

hincrby key field increment hincrby 与incrby命令类似,可以是字段值增加指定的整数,散列类型没有hincr命令,但可以通过hincrby key field 1 来实现。

127.0.0.1:6379[1]> hincrby ca price 200
(integer) 200
127.0.0.1:6379[1]> hget car price
"666"
127.0.0.1:6379[1]> hincrby car price 200
(integer) 866
127.0.0.1:6379[1]> hget ca price
"200" 如果健不存在,hincrby命令会自动建立该健并默认设置price 字段在执行命令前的值为0.命令的返回值是增值后的字段值。

5.删除字段hdel key field [field ...]
hdel 命令可以删除一个或多个字段,返回值是被删除的字段个数:

127.0.0.1:6379[1]> hdel car price name
(integer) 2
127.0.0.1:6379[1]> hdel car color name
(integer) 1
3.3.4 命令拾遗

1.只获取字段名或字段值

hkeys key
hvals key
127.0.0.1:6379[1]> hkeys car
1) "data"
2) "name"
3) "color"
127.0.0.1:6379[1]> hvals car
1) "2016"
2) "bmw"
3) "blue"
2.获取字段数量
hlen key
127.0.0.1:6379[1]> hlen car
(integer) 3
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: