当前位置: 首页 > 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 作为字段名,商品的数量和价格等信息作为值。这样,在用户浏览购物车或结算时,可以快速获取到购物车中的商品信息。

http://www.dtcms.com/a/97279.html

相关文章:

  • 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的注册中心?
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例7,TableView16_07 列拖拽排序示例
  • Java 开发中的 AI 黑科技:如何用 AI 工具自动生成 Spring Boot 项目脚手架?
  • Python中的装饰器
  • 刘火良FreeRTOS内核实现与应用学习之6——多优先级
  • 蓝桥杯备考:模拟算法之排队接水
  • skynet.socket.limit 使用详解
  • 数据结构每日一题day5(顺序表)★★★★★
  • 为mariadb和mysql添加用户和修改密码的方法
  • 树莓派 —— 在树莓派4b板卡下编译FFmpeg源码,支持硬件编解码器(mmal或openMax硬编解码加速)
  • 清华大学第10讲:迈向未来的AI教学实验396页PPT 探索未来教育的无限可能|附PPT下载方法