0%

Redis系列第三篇之Hash

前言

Redis的Hash是字符串类型的字段和字符串类型的值之间的映射,所以Hash是用于表示对象的完美数据类型(比如表示拥有名字、姓、年龄等的用户):

1
2
3
4
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选项时,回复将是有字段和值组成的列表

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不存在时返回空数组

参考资料

Redis Hash