散列类型
Redis采用字典结构以键值对的形式存储数据的,而散列类型(hash)的键值也是一种字典结构,其存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他数据类型,即散列类型不能嵌套其他的数据类型。一个散列类型键可以包含至多2的32次方减一个字段。
注:除了散列类型,Redis 的其他数据类型同样不支持数据类型嵌套。
散列类型适合存储对象。存储结构如下:
而在关系数据库中如果要存储汽车对象,存储结构如下:
数据是以二维表的形式存储的,这要求所有的记录都拥有同样的属性,无法单独为某条记录增减属性。
而当使用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命令可以删除一个或多个字段,返回值是被删除的字段个数。