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 中的一个或多个指定域,不存在的域将被忽略。

2.6、hlen命令

HLEN key

哈希表中域的数量。
当 key 不存在时,返回 0 。
2.7、hstrlen命令

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 不存在时,返回一个空表。
2.13、hvals命令
HVALS key
一个包含哈希表中所有值的表。
当 key 不存在时,返回一个空表。
2.14、hgetall 命令

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呢?   

两种存储方式的对比如下表所示:

 

 

 

 

posted @ 2021-03-17 15:37  08ruanjian306  阅读(2624)  评论(0编辑  收藏  举报