当前位置: 首页 > news >正文

Redis:Hash 类型 内部实现、命令及应用场景

Hash(哈希)类型是一种键值对key-value的集合,其中每个键值对被称为一个字段(field)和值(value),可以将其看作是一个微型的数据库,它以高效的方式存储和操作多个相关的数据项。

内部实现

压缩列表(ziplist)

  • 结构:这是一种紧凑的连续内存块结构。它将 Hash 中的键值对依次存储,每个节点包含前一个节点的长度、当前节点的长度和节点值。在内存中键和值交替存放。
  • 适用场景:适用于存储元素较少且键值对长度较短的 Hash。当 Hash 对象的键值对数量较少,且键和值的长度都比较小时,使用压缩列表可以节省大量内存。
  • 优点:内存利用率高,避免了指针带来的额外开销。
  • 缺点:是插入和删除操作可能需要移动大量数据,时间复杂度为 O (n),在元素较多时性能会下降。

在Redis7.0中,压缩列表数据结构已经废弃,交由listpack数据结构来实现了。

紧凑列表(Listpack)

  • 结构:一种改进型压缩列表。它同样是连续内存块结构,每个节点包含自身长度和数据内容,但去除了压缩列表中记录前一个节点长度的字段,使结构更加紧凑。
  • 适用场景:用于替代压缩列表,在存储小数据量的 Hash 时能提供更好的性能和内存使用效率。
  • 优点:优点是内存使用更高效,插入和删除操作的性能有所提升。
  • 缺点:相较于哈希表,在处理大规模数据时,整体操作性能可能稍逊一筹。
image.png

哈希表(hashtable)

  • 结构:采用数组和链表(或红黑树)结合的方式。数组中的每个元素是一个桶,当多个键值对的哈希值冲突时,它们会以链表或红黑树的形式存储在同一个桶中。当链表长度超过一定阈值,链表会转换为红黑树。
  • 适用场景:适合存储大量元素的 Hash。无论 Hash 中的元素数量多少,哈希表都能提供较为稳定的查找、插入和删除操作性能。
  • 优点:优点是查找、插入和删除操作的平均时间复杂度为 O (1),能高效处理大数据量。
  • 缺点:需要额外的内存来存储指针和维护哈希表结构,当元素较少时,内存开销相对较大。

常用命令

添加

HSET / HMSET

hset/hmset key field value [field value ...]
  • 设置hash中指定字段field和值value,若字段为新增返回 1,若更新已有字段值则返回 0。

查找

HGET

hget key field
  • 获取key对应field的键值,若字段存在则返回其值,不存在则返回 nil

HMGET

hget key field [field ...]
  • 获取hash中多个字段的值,若字段存在则返回对应值,不存在则返回 nil,返回值按请求字段顺序排列。

HEXISTS

hexists key field
  • 检查指定hash键中是否存在指定field,若存在返回 1,不存在则返回 0。

HVALS

hvals key
  • 获取hash中的所有value

HGETALL

hgetall key
  • 获取hash中所有的fieldvalue

HLEN

hlen key
  • 获取hash中所有字段的数量。

删除

HDEL

hdel key field [field ...]
  • 删除 hash 中的filed字段,返回成功删除的字段数量。

修改

HINCRBY

hincrby key field increment
  • hash的指定的field对应的value增加指定值。

HINCRBYFLOAT

hincrbyfloat key field increment
  • hash的指定的field对应的value增加指定浮点值。

应用场景

缓存数据:在 Web 应用程序中,经常需要缓存用户的相关信息,如用户名、密码、邮箱、头像等。可以使用用户 ID 作为 Hash 的键,将用户的各项信息作为字段和值存储在 Hash 中。这样,在需要获取用户信息时,只需通过一次 Redis 查询即可获取到所有相关信息,大大提高了查询效率。

购物车功能:在电商网站中,购物车是一个常见的功能。需要存储用户添加到购物车中的商品信息,包括商品 ID、数量、价格等。以用户 ID 为键,每个商品的信息作为一个字段值对存储在 Hash 中。可以使用商品 ID 作为字段名,商品的数量和价格等信息作为值。这样,在用户浏览购物车或结算时,可以快速获取到购物车中的商品信息。

相关文章:

  • 51c嵌入式~MOS~合集1
  • 计算机网络基础:网络流量工程与优化策略
  • Three.js 快速入门教程【二十】3D模型加载优化实战:使用gltf-pipeline与Draco对模型进行压缩,提高加载速度和流畅性
  • Kafka 偏移量
  • python-59-基于python内置库解析html获取标签关键信息
  • python项目整体文件和依赖打包
  • ​Flink/Kafka在python中的用处
  • 局域网共享失败?打印机/文件夹共享工具
  • 机器学习中的数学知识
  • 【 C 语言实现顺序表的基本操作】(数据结构)
  • 使用matlab进行分位数回归
  • 三数之和
  • B494:开关电源领域的PWM控制新星
  • [特殊字符] AI 编程工具推荐与场景指南 ——提升研发效率的智能助
  • 练习题:109
  • 【机密计算顶会解读】12:机密提示——保护云LLM推理服务中的用户提示词
  • vue将页面导出成word
  • LLM架构解析:NLP基础(第一部分)—— 模型、核心技术与发展历程全解析
  • NO.59十六届蓝桥杯备战|基础算法-前缀和|一维前缀和|最大子段和|二维前缀和|激光炸弹(C++)
  • Dubbo(21)如何配置Dubbo的注册中心?
  • 习近平会见智利总统博里奇
  • 日月谭天丨这轮中美关税会谈让台湾社会看清了什么?
  • 独行侠以1.8%概率获得状元签,NBA原来真的有剧本?
  • 受贿3501万余元,中石油原董事长王宜林一审被判13年
  • 中国潜水救捞行业协会发布《呵护潜水员职业健康安全宣言》
  • 尹锡悦涉嫌发动内乱案举行第三次庭审