【Redis】Redis数据结构——Hash 哈希

发布于:2024-08-24 ⋅ 阅读:(118) ⋅ 点赞:(0)


⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。在 Redis 中,哈希类型是指值本⾝⼜是⼀个键值对结构,形如 key = “key”,value = { {field1, value1 }, …, {fieldN, valueN } },Redis 键值对和哈希类型⼆者的关系可以⽤图 2-15 来表⽰。

在这里插入图片描述
哈希类型中的映射关系通常称为 field-value,⽤于区分 Redis 整体的键值对(key-value),注意这⾥的 value 是指 field 对应的值,不是键(key)对应的值,请注意 value 在不同上下⽂的作⽤。

命令

hset

设置 hash 中指定的字段(field)的值(value)。

语法:

hset key field value [field value …]

命令有效版本:2.0.0 之后
时间复杂度:插⼊⼀组 field 为 O(1), 插⼊ N 组 field 为 O(N)
返回值:添加的字段的个数。

hget

获取 hash 中指定字段的值。

在这里插入图片描述

hexists

判断 hash 中是否有指定的字段。

在这里插入图片描述

hdel

删除 hash 中指定的字段。

在这里插入图片描述

hkeys

获取 hash 中的所有字段。

在这里插入图片描述

hvals

获取 hash 中的所有的值。

在这里插入图片描述

hgetall

获取 hash 中的所有字段以及对应的值。

在这里插入图片描述

hmget

⼀次获取 hash 中多个字段的值。

在这里插入图片描述
在使⽤ HGETALL 时,如果哈希元素个数⽐较多,会存在阻塞 Redis 的可能。如果开发⼈员只需要获取部分 field,可以使⽤ HMGET,如果⼀定要获取全部 field,可以尝试使⽤ HSCAN命令,该命令采⽤渐进式遍历哈希类型,HSCAN 会在后续章节介绍。

hlen

获取 hash 中的所有字段的个数。

在这里插入图片描述

hsetnx

在字段不存在的情况下,设置 hash 中的字段和值。

在这里插入图片描述

hincrby

将 hash 中字段对应的数值添加指定的值。

在这里插入图片描述

hincrbyfloat

HINCRBY 的浮点数版本。

在这里插入图片描述

命令小结

在这里插入图片描述

内部编码

哈希的内部编码有两种:

  • ziplist(压缩列表):当哈希类型元素个数⼩于 hash-max-ziplist-entries 配置(默认 512 个)、同时所有值都⼩于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使⽤ ziplist 作为哈希的内部实现,ziplist 使⽤更加紧凑的结构实现多个元素的连续存储,所以在节省内存⽅⾯⽐hashtable 更加优秀。
  • hashtable(哈希表):当哈希类型⽆法满⾜ ziplist 的条件时,Redis 会使⽤ hashtable 作为哈希的内部实现,因为此时 ziplist 的读写效率会下降,⽽ hashtable 的读写时间复杂度为 O(1)。

使用场景

在这里插入图片描述

在这里插入图片描述
但是需要注意的是哈希类型和关系型数据库有两点不同之处:

  • 哈希类型是稀疏的,⽽关系型数据库是完全结构化的,例如哈希类型每个键可以有不同的 field,⽽关系型数据库⼀旦添加新的列,所有⾏都要为其设置值,即使为 null,如图 2-18 所⽰。
  • 关系数据库可以做复杂的关系查询,⽽ Redis 去模拟关系型复杂查询,例如联表查询、聚合查询等基本不可能,维护成本⾼。

在这里插入图片描述

缓存⽅式对⽐

  1. 原⽣字符串类型⸺使⽤字符串类型,每个属性⼀个键。

在这里插入图片描述
优点:实现简单,针对个别属性变更也很灵活。
缺点:占⽤过多的键,内存占⽤量较⼤,同时⽤⼾信息在 Redis 中⽐较分散,缺少内聚性,所以这种⽅案基本没有实⽤性。

  1. 序列化字符串类型,例如 JSON 格式

在这里插入图片描述
优点:针对总是以整体作为操作的信息⽐较合适,编程也简单。同时,如果序列化⽅案选择合适,内存的使⽤效率很⾼。

缺点:本⾝序列化和反序列需要⼀定开销,同时如果总是操作个别属性则⾮常不灵活。

  1. 哈希类型

在这里插入图片描述
优点:简单、直观、灵活。尤其是针对信息的局部变更或者获取操作。

缺点:需要控制哈希在 ziplist 和 hashtable 两种内部编码的转换,可能会造成内存的较⼤消耗。


网站公告

今日签到

点亮在社区的每一天
去签到