一、散列简介

散列就是hash或者说Map,Redis的散列键会将一个键和一个散列在数据库中关联起来,可以在散列中设置任意多个字符串键值对,因此通常把相关联的多项数据存储在同一个散列中,以便对这些数据进行管理或执行相关操作。
在这里插入图片描述

二、散列的基本操作

  • 创建散列并设置值

可以通过HSET命令创建散列或者为散列中指定的字段设置值,创建散列时就必须设置key以及字段和字段值;
语法格式:HSET key field1 value1 field2 value2 … ,如

# 创建一个key为article.101的散列,
#并设置title字段值为redis cookbook,author字段值为someone
HSET article.101 title 'redis cookbook' author 'smoeone'

如果给定的key不存在,那么就是一次创建操作,创建成功后返回字段的数量;反之就是一次更新操作,更新成功后返回0。

和字符串的SET命令中NX可选项一样,散列存在HSETNX命令用于只在字段不存在的情况下为它设置值,HSETNX一次只可针对一个字段操作,也就是说HSETNX一次只能设置一个字段及值
如HSETNX article.101 views 20 publish ‘2021-02-02’ 就不会执行成功,
而HSETNX article.101 views 20 可以执行成功

除了HSET外,Redis也提供了HMSET命令用于一次为散列中的多个字段设置值

  • 获取散列中指定字段的值

HGET命令用于获取指定key 中的 指定字段的值,一次只能获取一个字段
语法格式:HGET key field, 如

# 获取articel.101中title字段的值
HGET articel.101 title

如果指定的字段在当前散列中不存在,HGET命令将返回一个空值。

与HMEST相对应,Redis也提供了HMGET命令用于一次获取多个字段的值

  • 对散列中存储的整数字段进行加减操作

如果散列中存在存储整数的字段,那么就可以使用HINCRBY命令为该字段的值加上指定的整数增量,
语法格式:HINCRBY key filed increment,如

# 对articel.101中views字段的值增加100
HINCRBY article.101 views 100

如果指定字段不存在,那么就会执行创建操作。

HINCRBY也可以用于执行减法操作,只需在操作数前加上负号,但操作数只能是整数,如

# 对articel.101中views字段的值减去10
HINCRBY article.101 views -10
  • 对散列中存储的浮点数字段进行加减操作

与INCRBYFLOAT类似的,Redis提供了HINCRBYFLOAT来对散列中存储的浮点数执行加减操作,如

# 对article.101中的price字段值增加99.8
HINCRBYFLOAT article.101 price 99.8

# 对article.101中的price字段值减去9
HINCRBYFLOAT article.101 price -9
  • 获取散列中指定字段的值的长度

Redis中获取散列指定字段的值的长度命令与STRLEN类似,为HSTRLEN
语法格式:HSTRLEN key field,如

# 获取article.101中title字段值的长度
HSTRLEN article.101 title

如果给定的key不存在或字段不存在,HSTRLEN将返回0

  • 检测散列中是否存在指定字段

EXSITS命令可用于检查数据库中是否存在指定key,而HEXSITS则可用于检查散列中是否存在指定字段;
语法格式:HEXSITS key field,如

# 检查article.101中是否存在title字段
HEXSITS article.101 title
  • 删除散列中的指定字段

DEL命令可用于删除指定key,而HDEL命令可用于删除散列中的指定字段及其关联的值;
语法格式: HDEL key field,如

#删除article.101中的title
HDEL article.101 title

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

  • 获取散列的所有字段、所有值、所有字段和值

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

# 获取article.101的所有字段
HEYS article.101
# 获取article.101的所有值
HVALS article.101
# 获取article.101的所有字段和值
HGETALL article.101

三、散列与字符串比较

在这里插入图片描述
在这里插入图片描述

1、散列键的优点

为了对数据库以及数据库的使用情况进行统计,Redis会为每个数据库键存储一些额外的信息,因此会带来一些额外的内存消耗,当数据库键数量达到百万级时,这些额外的内存消耗就会变得很多。

当散列包含的字段数量比较少的时候,Redis就会使用特殊的内存优化结构去存储散列中的字段和值。与字符串键相比,这种内存优化结构存储相同数据所需要的内存要少的多。因此对于相同的数据,使用散列键进行存储比使用字符串键存储要节约一半以上的内存。

除了需要耗费更多内存之外,更多的数据库键也需要占用更多的CPU,每当Redis需要对数据库中的键进行处理时,数据库包含的键越多,进行处理所需的CPU资源就会越多。

除了资源方面的优势外,散列键还可以有效地组织起相关的多项数据,让程序产生更容易理解的数据,以及操作更方便。

2、字符串键的优点

字符串键比起散列键结构简单,操作也更加灵活,比如,字符串能够使用SETRANGE命令和GETRANGE命令设置或读取字符串值的其中一部分,或者使用APPEND命令将新内容追加到字符串值的末尾,而散列键并不支持这些操作。

Redis支持数据设置过期时间,但是是针对key的,并不能对散列中的字段设置过期时间,所以当一个散列键过期的时候,它所包含的所有字段和值都将被删除。

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐