Redis入门指南 第3章 Redis的5种主要数据类型及相应的命令(二) 散列类型

一、介绍

  • Redis 是采用字典结构以键值对的形式存储数据的,而散列类型(hash)的值也是一种字典结构,其存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他数据类型
  • 散列类型适合的存储对象:使用对象类别和 ID 构成键名,使用字段表示对象的属性,而字段值则存储属性值。例如,要存储 ID 为 2 的汽车对象,可以分别使用名为 color、name 和 price 的3个字段来存储该辆汽车的颜色、名称和价格,存储结构图如下所示:
  • 如果使用关系数据库来存储上述的对象,那么就是生成一个表,一共有 5 列,分别是 ID、color、name 和 price。数据是以二维表的形式存储的,这也就要求所有的记录都拥有相同的属性,无法为单个记录增减属性。而 Redis 的散列类型就不存在这个问题,Redis 并不要求每个键都依据某个结构进行存储,它支持自由的为任何键增减字段而不影响其他键,这也是 Redis 优于关系数据库的一个地方

二、命令

  • 1.赋值与取值
HSET key field value
HGET key field
HMSET key field value [field value ...]
HMGET key field [field ...]
HGETALL key
  • HSET 命令用来给字段赋值,而 HGET 命令用来获得字段的值,用法如下:
redis> HSET car price 500
(integer) 1
redis> HSET car name BMW
redis> HGET car name
"BMW"
  • HSET 命令的方便之处在于不区分插入和更新操作,这意味着修改数据时不用事先判断字段是否存在来决定要执行的是插入操作(insert)还是更新操作(update)。当执行的是插入操作时(即之前字段不存在)HSET 命令会返回 1,当执行的是更新操作时(即之前字段已经存在)HSET 命令会返回 0
  • 当需要同时设置多个字段的值时,可以使用 HMSET 命令:
HMSET key field1 value1 field2 value2
  • 相对应的,HMGET 命令能够同时获得多个字段的值:
redis> HMGET car price name
1) "500"
2) "BMW"
  • HGETALL 命令则是用来获取键中的所有字段和字段值:
redis> HGETALL car
1) "price"
2) "500"
3) "name"
4) "BMW"
  • 2.判断字段是否存在
  • HEXISTS 命令用来判断一个字段是否存在,如果存在则返回 1,不存在则返回 0,其用法如下:
redis> HEXISTS car model
(integer) 0
redis> HSET car model c200
(integer) 1
redis> HEXISTS car model
(integer) 1
  • 3.当字段不存在时赋值
HSETNX key field value
  • HSETNX 命令其实和 HSET 命令相似,但是如果字段已经存在的话,HSETNX 命令将不执行任何操作
  • 4.增加数字
  • 散列类型提供了 HINCRBY 命令,与上一篇博客中讲解的 INCRBY 命令相似,可以使字段值增加指定的整数,其用法如下:
redis> HINCRBY person score 60
(integer) 60
  • 执行上述命令前,person 键是不存在的,而 HINCRBY 命会自动建立该键并默认 score 字段的值为 “0”。该命令的返回值是增值后的字段值
  • 5.删除字段
  • HDEL 命令可以删除一个或者多个字段,返回值是被删除的字段个数,其使用方法如下:
redis> HDEL car price
(integer) 1
redis> HDEL car price
(integer) 0
  • 6.只获取字段名或者字段值
  • 有时候仅仅需要获取键中的所有字段的名字而不需要字段值,那么可以使用 HKEYS 命令,用法如下:
redis> HKEYS car
1) "name"
2) "model"
  • 相对应的,如果要获取键中的所有字段值,则可以使用 HVALS 命令,用法如下:
redis> HVALS car
1) "BMW"
2) "c200"
  • 7.获取字段数量
  • HLEN 命令用来获取字段数量,用法如下:
redis> HLEN car
(integer) 2