前言
Redis的Hash是字符串类型的字段和字符串类型的值之间的映射,所以Hash是用于表示对象的完美数据类型(比如表示拥有名字、姓、年龄等的用户):
HMSET user:1000 username antirez password P1pp0 age 34
HGETALL user:1000
HSET user:1000 password 12345
HGETALL user:1000
Redis以很少的空间存储拥有很少字段(其中很少意味着最多几百个)的Hash,所以可以在一个小型的Redis实例中存储数百万个对象。Hash除了主要用于表示对象,同样可以存储许多元素,所以Hash也可以用于其他任务。每个Hash可以存储2^32-1个键值对(超过4亿)。
下面一起来学习学习有关Hash的各种Redis命令吧!
HDEL key field [field ...]
- 可用版本: v2.0.0开始
- 历史: v2.4.0开始接受多个字段
- 时间复杂度: O(N),N为需要被移除的field数量
- 解释: 从key存储的Hash中移除指定的field,命令将会忽略Hash中不存在的field,如果key不存在,此命令将会视为空的Hash并且返回0
- 返回值: Integer(整型),返回实际被移除的field数量,其中不包括指定但不存在的field
HEXISTS key field
- 可用版本: v2.0.0开始
- 时间复杂度: O(1)
-
解释: 返回
field
是否存在于key指定的Hash中 - 返回值: Integer(整型),如果包含该字段返回1,如果不包含或者key不存在则返回0
HGET key field
- 可用版本: v2.0.0开始
- 时间复杂度: O(1)
-
解释: 返回key对应的Hash中字段
field
的值 - 返回值: Bulk String(批量字符串),返回与field关联的值,如果key不存在或者Hash不包含该field则返回nil
HGETALL key
- 可用版本: v2.0.0开始
- 时间复杂度: O(N),N为Hash的大小
- 解释: 返回存储在key中的Hash的所有字段和值,在返回值中,每个字段后面都紧随着它的值,所以回复的长度是Hash大小的两倍
- 返回值: Array(数组),返回field和value组成的数组,如果key不存在则返回空的列表
HINCRBY key field increment
- 可用版本: v2.0.0开始
- 时间复杂度: O(1)
-
解释: 对存储在key中的Hash数据的指定字段的值增加
increment
,如果key不存在,将会创建一个新的持有Hash类型的key。如果field不存在,则在执行操作前会将该field的值置为0。HINCRBY
支持的值范围为64位有符号整数 - 返回值: Integer(整型),返回执行加法操作后的field值
HINCRBYFLOAT key field increment
- 可用版本: v2.6.0开始
- 时间复杂度: O(1)
-
解释: 对Hash中指定的且表示浮点数的字段field增加指定的增量。如果增量为负,则为减法。如果field不存在,则在执行操作前会先将field置为0,如果发生以下情形之一,将会返回错误:
- field包含一个错误类型的值(非string)
- field当前的值或者指定的增量无法表示为一个浮点型数值
- 返回值: Bulk String(批量字符串),返回加操作后的field值
HKEYS key
- 可用版本: v2.0.0开始
- 时间复杂度: O(N),N为Hash的大小
- 解释: 返回存储在key中的Hash结构的所有字段名
- 返回值: Array(数组),返回字段名组成的数组,如果key不存在则返回一个空的数组
HLEN key
- 可用版本: v2.0.0开始
- 时间复杂度: O(1)
- 解释: 返回存储在key中的Hash结构中包含的字段数量
- 返回值: Integer(整型),返回指定Hash的字段数
HMGET key field [field ...]
- 可用版本: v2.0.0开始
- 时间复杂度: O(N),N为请求的字段数
- 解释: 返回指定字段的值
- 返回值: Array(数组),返回由指定字段的值组成的列表,返回顺序与请求顺序一致。对于不存在的字段,将会返回nil;如果key不存在,将会返回nil
HMSET key field value [ field value ...]
- 可用版本: v2.0.0开始,从v4.0.0开始,此命令被视为废弃
- 时间复杂度: O(N),N为被设置的字段数量
- 解释: 设置指定字段为指定的值,此命令将会覆盖任何已经存在的字段;如果key不存在将会创建一个新的持有Hash类型的key
- 返回值: Simple String(简单字符串)
HRANDFIELD key [ count [WITHVALUES]]
- 可用版本: v6.2.0开始
- 时间复杂度: O(N),N为返回的字段数量
-
解释: 当只用key参数调用命令时,将会从Hash中返回一个随机的字段。如果提供的
count
参数为正,将会返回由去重字段组成的数组,数组长度为count和Hash大小的最小值;如果count
为负,命令将允许返回同一个字段多次,这种情况下,返回的字段数为count的绝对值。如果提供了WITHVALUES
选项,将同时返回字段的值。 -
返回值:
- Bulk String(批量字符串):没有指定
count
参数,命令将会返回随机字段,如果key不存在则返回nil - Array(数组):当指定
count
参数时,命令返回字段名组成的数组,key不存在时返回空的数组。指定WITHVALUES
选项时,回复将是有字段和值组成的列表
- Bulk String(批量字符串):没有指定
HSCAN key cursor [MATCH pattern] [COUNT count]
- 可用版本: v2.8.0
-
历史: v6.0.0开始支持
TYPE
子命令 - 时间复杂度: 每次调用O(1)。O(N)用于完整的迭代,包括足够的命令调用以使光标返回0,N是集合内的元素数
-
解释: 用于增量迭代字段以及对应的值
-
COUNT
选项:默认值为10,指定每次调用时应该完成的工作量 -
MATCH
选项:匹配给定模式的元素
-
- 返回值: Array(数组),数组由两个元素组成:第一个元素为此次迭代后的cursor值;第二个元素为field-value组成的数组,格式为每个字段名后紧跟其字段值
HSET key field value [ field value ...]
- 可用版本: v2.0.0开始
- 历史: v4.0.0开始接收多个field和value参数
- 时间复杂度: O(N),N为请求的field-value数量
- 解释: 设置一个或者多个field-value键值对。如果key不存在,首先会创建一个Hash类型的key,如果key已经存在,则会覆盖其值
- 返回值: Integer(整型),返回添加的字段数量
HSETNX key field value
- 可用版本: v2.0.0开始
- 时间复杂度: O(1)
- 解释: 只有当字段不存在时才设置字段的值;如果key不存在,将会创建一个新的Hash类型的key,如果字段早已存在,命令将不会产生影响。
- 返回值: Integer(整型),如果设置成功返回1,否则返回0
HSTRLEN key field
- 可用版本: v3.2.0开始
- 时间复杂度: O(1)
- 解释: 返回存储在key中的Hash的指定字段对应的字符串值的长度,如果key或者field不存在将会返回0
- 返回值: Integer(整型),与field关联的值的长度,key不存在或者field不存在时都返回0
HVALS key
- 可用版本: v2.0.0
- 时间复杂度: O(N),N为Hash的大小
- 解释: 返回key对应Hash的所有字段值
- 返回值: Array(数组),返回由所有Hash字段值组成的数组,key不存在时返回空数组