散列类型

Redis采用字典结构以键值对的形式存储数据的,而散列类型(hash)的键值也是一种字典结构,其存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他数据类型,即散列类型不能嵌套其他的数据类型。一个散列类型键可以包含至多2的32次方减一个字段。

注:除了散列类型,Redis 的其他数据类型同样不支持数据类型嵌套。

散列类型适合存储对象。存储结构如下:

redis key 离散分布 redis散列表存储_数据类型

而在关系数据库中如果要存储汽车对象,存储结构如下:

redis key 离散分布 redis散列表存储_Redis_02

数据是以二维表的形式存储的,这要求所有的记录都拥有同样的属性,无法单独为某条记录增减属性。

而当使用ORM(对象关系映射)将关系数据库中的对象实体映射成程序中的实体时,修改表结构往往意味着要中断服务(重启网站程序)。为了防止这些问题,在关系数据库中存储这种半结构化数据还需要额外的表才行。

而Redis的散列结构类型则不存在这个问题。虽然在图3-5中描述了汽车的存储结构,但是这个结构只是人为的约定,Redis并不要求每个键都依据此存储结构,我们完全可以自由地为任何键增减字段而不影响其他键。

命令

赋值与取值

HSET key field value

HGET key field

HMSET key field value [field value ....]

HMGET key field [field]

HGETALL key

127.0.0.1:6379> HSET car price 500
(integer) 1
127.0.0.1:6379> HSET car name BMW
(integer) 1
127.0.0.1:6379> HGET car name
"BMW"

HSET命令的不区分插入和更新操作,当执行的是插入操作时HSET命令返回1,更新则返回0。当键不存在时,则自动建立它。

注:在Redis中每个键都属于一个明确的数据类型。使用一种数据类型的命令操作另一种数据类型的键会提示错误,当然也不是所有命令都是如此,如SET命令可以覆盖已经存在的键而不论原来键是什么类型。

127.0.0.1:6379> HMSET car1 price 200 name "sss"
OK
127.0.0.1:6379> HMGET car1 price name
1) "200"
2) "sss"

HMSET 和 HMGET命令可同时设置,获取多个字段的值。

127.0.0.1:6379> HGETALL car
1) "price"
2) "500"
3) "name"
4) "BMW"

HGETALL命令获取键中所有字段和字段值。


判断字段是否存在

HEXISTS key field

HEXISTS 命令用来判断一个字段是否存在。存在返回1,否则返回0。

127.0.0.1:6379> HEXISTS car model
(integer) 0
127.0.0.1:6379> HEXISTS car name
(integer) 1

下面命令就不一一举例了,当然操作散列的命令也不止这些。

当字段不存在时赋值

HSETNX key field value

增加数字

HINCRBY key field increment

删除字段

HDEL key field [field ...]

HDEL命令可以删除一个或多个字段,返回值是被删除的字段个数。