Redis 基础 -- 散列 Hash 类型 和 Hash 类型的常用命令

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 基础 -- 散列 Hash 类型 和 Hash 类型的常用命令相关的知识,希望对你有一定的参考价值。

文章目录

1. 散列( Hash )类型

Redis的散列键会将一个键和一个散列在数据库里关联起来,用户可以在散列中为任意多个字段(field)设置值。与字符串键一样,散列的字段和值既可以是文本数据,也可以是二进制数据。

通过使用散列键,用户可以把相关联的多项数据存储到同一个散列里面,以便对这些数据进行管理,或者针对它们执行批量操作。比如下图就展示了一个使用散列存储文章数据的例子,在这个例子中,散列的键为article::10086,而这个键对应的散列则包含了4个字段,其中:

  • “title"字段存储文章的标题"greeting”。
  • “content"字段存储文章的内容"hello world”。
  • “author"字段存储文章的作者名字"peter”。
  • “create_at"字段存储文章的创建时间"1442744762.631885”。

1.1 HSET:为字段设置值

用户可以通过执行HSET命令为散列中的指定字段设置值。

语法:

根据给定的字段是否已经存在于散列中,HSET命令的行为也会有所不同:

  • 如果给定字段并不存在于散列当中,那么这次设置就是一次创建操作,命令将在散列里面关联起给定的字段和值,然后返回1。
  • 如果给定的字段原本已经存在于散列里面,那么这次设置就是一次更新操作,命令将使用用户给定的新值去覆盖字段原有的旧值,然后返回0。

示例:


说明:

复杂度:O(N),其中N为被设置的字段数量。


1.2 HSETNX:只在字段不存在的情况下为它设置值

HSETNX命令的作用和HSET命令的作用非常相似,它们之间的区别在于,HSETNX命令只会在指定字段不存在的情况下执行设置操作。

HSETNX命令在字段不存在并且成功为它设置值时返回1,在字段已经存在并导致设置操作未能成功执行时返回0。

语法:

示例:


说明:

复杂度:O(1)。


1.3 HGET:获取字段的值

HGET命令可以根据用户给定的字段,从散列中获取该字段的值。如果用户给定的字段并不存在于散列当中,那么HGET命令将返回一个空值。

语法:

示例:

说明:

复杂度:O(1)。


1.4 HINCRBY:对字段存储的整数值执行加法或减法操作

与字符串键的INCRBY命令一样,如果散列的字段里面存储着能够被Redis解释为整数的数字,那么用户就可以使用HINCRBY命令为该字段的值加上指定的整数增量。

语法:


HINCRBY命令在成功执行加法操作之后将返回字段当前的值作为命令的结果。

示例:

执行加法操作:

执行减法操作:

处理异常情况:

只能对存储着整数值的字段执行HINCRBY命令,并且用户给定的增量也必须为整数,尝试对非整数值字段执行HINCRBY命令,或者向HINCRBY命令提供非整数增量,都会导致HINCRBY命令拒绝执行并报告错误。

示例:

说明:

复杂度:O(1)。


1.5 HINCRBYFLOAT:对字段存储的数字值执行浮点数加法或减法操作

HINCRBYFLOAT命令的作用和HINCRBY命令的作用类似,它们之间的主要区别在于HINCRBYFLOAT命令不仅可以使用整数作为增量,还可以使用浮点数作为增量。

语法:


HINCRBYFLOAT命令在成功执行加法操作之后,将返回给定字段的当前值作为结果。

示例:

执行加法操作:

执行减法操作:

增量和字段值的类型限制:

HINCRBYFLOAT命令不仅可以使用浮点数作为增量,还可以使用整数作为增量。

此外,不仅存储浮点数的字段可以执行HINCRBYFLOAT命令,存储整数的字段也一样可以执行HINCRBYFLOAT命令

最后,如果加法计算的结果能够被表示为整数,那么HINCRBYFLOAT命令将使用整数作为计算结果

说明:

复杂度:O(1)。


1.6 HSTRLEN:获取字段值的字节长

用户可以使用HSTRLEN命令获取给定字段值的字节长度。如果给定的字段或散列并不存在,那么HSTRLEN命令将返回0作为结果。

示例:

说明:

复杂度:O(1)。


1.7 HEXISTS:检查字段是否存在

HEXISTS命令可用于检查用户给定的字段是否存在于散列当中。

语法:


如果散列包含了给定的字段,那么命令返回1,否则命令返回0。

示例:

说明:

复杂度:O(1)。


1.8 HDEL:删除字段

HDEL命令用于删除散列中的指定字段及其相关联的值。

语法:


当给定字段存在于散列当中并且被成功删除时,命令返回1;如果给定字段并不存在于散列当中,或者给定的散列并不存在,那么命令将返回0表示删除失败。

示例:

说明:

复杂度:O(1)。


1.9 HLEN:获取散列包含的字段数量

用户可以通过使用HLEN命令获取给定散列包含的字段数量。

语法:


如果用户给定的散列并不存在,那么HLEN命令将返回0作为结果。

示例:

现在user有4个字段

说明:

复杂度:O(1)。


1.10 HMSET:一次为多个字段设置值

用户可以使用HMSET命令一次为散列中的多个字段设置值。

语法:

HMSET命令在设置成功时返回OK。

由于HSET也可以为多个字段赋值,我认为HSET和HMSET的区别不大。至少用法是一样的。

说明:

复杂度:O(N),其中N为被设置的字段数量。


1.11 HMGET:一次获取多个字段的值通过使用

HMGET命令,用户可以一次从散列中获取多个字段的值。

语法:

HMGET命令将按照用户给定字段的顺序依次返回与之对应的值。如果字段不存在则返回nil。

示例:

说明:

复杂度:O(N),其中N为用户给定的字段数量。


1.12 HKEYS、HVALS、HGETALL:获取所有字段、所有值、所有字段和值

Redis为散列提供了HKEYS、HVALS和HGETALL这3个命令,可以分别用于获取散列包含的所有字段、所有值以及所有字段和值。

语法:

HKEYS:获取散列包含的所有字段。

HVALS:获取散列包含的所有值。

HGETALL:获取散列包含的所有字段和值。

示例:


获取所有的字段:

获取所有的值:

获取所有的字段和值:

字段在散列中的排列顺序:

Redis散列包含的字段在底层是以无序方式存储的,根据字段插入的顺序不同,包含相同字段的散列在执行HKEYS命令、HVALS命令和HGETALL命令时可能会得到不同的结果,因此用户在使用这3个命令的时候,不应该对它们返回的元素的排列顺序做任何假设。

说明:

复杂度:HKEYS命令、HVALS命令和HGETALL命令的复杂度都为O(N),其中N为散列包含的字段数量。


1.14 重点回顾

  • 散列键会将一个键和一个散列在数据库中关联起来,用户可以在散列中为任意多个字段设置值。与字符串键一样,散列的字段和值既可以是文本数据,也可以是二进制数据。
  • 用户可以通过散列键把相关联的多项数据存储到同一个散列中,以便对其进行管理,或者针对它们执行批量操作。
  • 因为Redis并没有为散列提供相应的减法操作命令,所以如果用户想对字段存储的数字值执行减法操作,就需要将负数增量传递给HINCRBY命令或HINCRBYFLOAT命令。
  • Redis散列包含的字段在底层是以无序方式存储的,根据字段插入的顺序不同,包含相同字段的散列在执行HKEYS、HVALS和HGETALL等命令时可能会得到不同的结果,因此用户在使用这3个命令时,不应该对命令返回元素的排列顺序作任何假设。
  • 字符串键和散列键虽然在操作方式上非常相似,但是因为它们都拥有各自独有的优点和缺点,所以在一些情况下,这两种数据结构是没有办法完全代替对方的。因此用户在构建应用程序的时候,应该根据实际需要来选择相应的数据结构。


以上是关于Redis 基础 -- 散列 Hash 类型 和 Hash 类型的常用命令的主要内容,如果未能解决你的问题,请参考以下文章

Redis数据类型之散列类型hash

Redis数据类型之散列(hash)

redis基本数据类型-hash类型

Redis的散列类型

Redis散列类型

redis使用基础 ——Redis数据类型