Redis数据类型 - 散列(Map)
文章目录一、散列简介二、散列的基本操作三、散列与字符串比较1、散列键的优点2、字符串键的优点一、散列简介散列就是hash或者说Map,Redis的散列键会将一个键和一个散列在数据库中关联起来,可以在散列中设置任意多个字符串键值对,因此可以把相关联的多项数据存储在同一个散列中,以便对这些数据进行管理或执行相关操作。二、散列的基本操作创建散列并设置值可以通过HSET命令创建散列或者为散列中指定的字段设
一、散列简介
散列就是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的,并不能对散列中的字段设置过期时间,所以当一个散列键过期的时候,它所包含的所有字段和值都将被删除。
更多推荐
所有评论(0)