Redis数据类型之hash数据类型与结构
1、 hash类型介绍
Redis hash数据结构 是一个键值对(key-value)集合,它是一个 string 类型的 field 和 value 的映射表,redis本身就是一个key-value型数据库,因此hash数据结构相当于在value中又套了一层key-value型数据。所以redis中hash数据结构特别适合存储关系型对象。比如用来存储学生基本信息,或者用户信息等。
2、hash 命令
2.1、hset命令
hset key field value [field value ...]
将哈希表 hash
中域 field
的值设置为 value
。
如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET
操作。
如果域 field
已经存在于哈希表中, 那么它的旧值将被新值 value
覆盖。
返回值
当 HSET
命令在哈希表中新创建 field
域并成功为它设置值时, 命令返回 1
; 如果域 field
已经存在于哈希表, 并且 HSET
命令成功使用新值覆盖了它的旧值, 那么命令返回 0
。
2.2、hsetnx命令
HSETNX key field value
当且仅当域 field
尚未存在于哈希表的情况下, 将它的值设置为 value
。
如果给定域已经存在于哈希表当中, 那么命令将放弃执行设置操作。
如果哈希表 hash
不存在, 那么一个新的哈希表将被创建并执行 HSETNX
命令。
返回值
HSETNX
命令在设置成功时返回 1
, 在给定域已经存在而放弃执行设置操作时返回 0
。
2.3、hget命令
HGET key field
返回哈希表中给定域的值。
返回值
HGET
命令在默认情况下返回给定域的值。
如果给定域不存在于哈希表中, 又或者给定的哈希表并不存在, 那么命令返回 nil
。
2.4、hexists命令
HEXISTS key field
检查给定域 field
是否存在于哈希表 hash
当中。
返回值
HEXISTS
命令在给定域存在时返回 1
, 在给定域不存在时返回 0
。
2.5、hdel命令
HDEL key field [field ...]
删除哈希表 key
中的一个或多个指定域,不存在的域将被忽略。
HLEN key
key
不存在时,返回 0
。HSTRLEN key field
返回哈希表 key
中, 与给定域 field
相关联的值的字符串长度(string length)。
如果给定的键或者域不存在, 那么命令返回 0
。
2.8、hincrby命令
HINCRBY key field increment
为哈希表 key
中的域 field
的值加上增量 increment
。
增量也可以为负数,相当于对给定域进行减法操作。
如果 key
不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
如果域 field
不存在,那么在执行命令前,域的值被初始化为 0
。
对一个储存字符串值的域 field
执行 HINCRBY 命令将造成一个错误。
2.9、hincrbyfloat命令
HINCRBYFLOAT key field increment
为哈希表 key
中的域 field
加上浮点数增量 increment
。
如果哈希表中没有域 field
,那么 HINCRBYFLOAT 会先将域 field
的值设为 0
,然后再执行加法操作。
如果键 key
不存在,那么 HINCRBYFLOAT 会先创建一个哈希表,再创建域 field
,最后再执行加法操作。
当以下任意一个条件发生时,返回一个错误:
-
域
field
的值不是字符串类型(因为 redis 中的数字和浮点数都以字符串的形式保存,所以它们都属于字符串类型) -
域
field
当前的值或给定的增量increment
不能解释(parse)为双精度浮点数(double precision floating point number)
2.10、hmset命令
HMSET key field value [field value ...]
同时将多个 field-value
(域-值)对设置到哈希表 key
中。
此命令会覆盖哈希表中已存在的域。
如果 key
不存在,一个空哈希表被创建并执行 HMSET 操作。
2.11、hmget命令
HMGET key field [field ...]
返回哈希表 key
中,一个或多个给定域的值。
如果给定的域不存在于哈希表,那么返回一个 nil
值。
因为不存在的 key
被当作一个空哈希表来处理,所以对一个不存在的 key
进行 HMGET 操作将返回一个只带有 nil
值的表。
2.12、hkeys命令
HKEYS key
key
不存在时,返回一个空表。key
不存在时,返回一个空表。HGETALL key
返回哈希表 key
中,所有的域和值。
在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。
3、Hash类型结构
hash类型基于什么实现?
压缩列表 Hash表
4、hash类型的应用场景
4.1、购物车
购物车功能主要是通过用户点击商品添加到购物车,前端会传递商品id以及用于需要购买的数据到后端,php通过前端传递的参数进而完成购物车的添加,增加或者减少购物车购买数量,删除或者清空购物车等功能。 如果说是使用redis来做我们可以以用户id为key,商品id为field,商品数量为value,恰好构成了购物车的3个要素。
4.2、存储对象
hash类型的(key, field, value)的结构与对象的(对象id, 属性, 值)的结构相似,也可以用来存储对象。
在介绍string类型的应用场景时有所介绍,string + json也是存储对象的一种方式,那么存储对象时,到底用string + json还是用hash呢?
两种存储方式的对比如下表所示: