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

redis----hash类型详解

hash类型的key通常用field表示

一、常用命令

1. 基础操作命令

命令格式功能说明示例返回值
HSET key field value [field value ...]为哈希表设置一个或多个字段值HSET user:1 name "张三" age 25成功设置的字段数量
HGET key field获取哈希表中指定字段的值HGET user:1 name字段值(不存在返回nil
HMSET key field value [field value ...]批量设置哈希表字段值(Redis 4.0.0 后推荐用HSET替代)HMSET user:2 name "李四" gender "男"成功返回OK
HMGET key field [field ...]批量获取哈希表多个字段的值HMGET user:1 name age字段值列表(按输入顺序)
HGETALL key获取哈希表中所有字段和值HGETALL user:1字段和值交替出现的列表

hset:

hget:

hmget:

hgetall:

2. 字段检查与删除

命令格式功能说明示例返回值
HEXISTS key field判断哈希表中是否存在指定字段HEXISTS user:1 age存在返回1,不存在返回0
HDEL key field [field ...]删除哈希表中一个或多个字段HDEL user:1 age成功删除的字段数量
HLEN key获取哈希表中字段的数量HLEN user:1字段总数

hexists:

hdel:

hlen:

3. 字段值运算与自增

命令格式功能说明示例返回值
HINCRBY key field increment为哈希表字段的整数值增加指定增量(支持负数)HINCRBY user:1 age 1增量后的值
HINCRBYFLOAT key field increment为哈希表字段的浮点数值增加指定增量HINCRBYFLOAT product:1 price 0.5增量后的值(字符串形式)

hincrby:

hincrbyfloat:

4. 字段 / 值的批量获取

命令格式功能说明示例返回值
HKEYS key获取哈希表中所有字段名HKEYS user:1字段名列表
HVALS key获取哈希表中所有字段值HVALS user:1字段值列表

如果hash的值较多,可能会使redis服务被阻塞掉

heys:

hvals:

5. 其他实用命令

命令格式功能说明示例返回值
HSTRLEN key field获取哈希表中指定字段值的字符串长度HSTRLEN user:1 name字符串长度(不存在返回0
HSCAN key cursor [MATCH pattern] [COUNT count]迭代哈希表中的字段和值(用于大数据量遍历)HSCAN user:1 0 MATCH "a*" COUNT 10下一个游标和字段值列表
HSETNX key field value设置哈希表中的值,存在设置错误,不存在设置成功hsetnx key f1 222成功返回1,错误返回0

典型应用场景

  • 存储用户信息(如user:1001nameageemail等字段)
  • 记录商品属性(如product:500pricestockcategory
  • 统计数据(如stats:dailypvuvclick等计数)

二、内部编码

Redis 的 Hash 类型(哈希表)在底层有两种不同的内部编码方式,Redis 会根据哈希表的实际数据情况自动选择合适的编码,以在内存占用和操作效率之间取得平衡。这两种编码方式分别是:

1. ziplist(压缩列表)

适用场景:当哈希表满足以下两个条件时,Redis 会使用 ziplist 编码:

  • 哈希表中所有键值对的键(field)和值(value)的字符串长度都小于 64 字节可通过配置 hash-max-ziplist-value 调整);
  • 哈希表中键值对数量小于 512 个(可通过配置 hash-max-ziplist-entries 调整)。

编码特点

  • ziplist 是一种紧凑的连续内存结构,将所有键值对按顺序存储在一块连续内存中,减少了内存碎片和指针开销,内存利用率极高。
  • 键值对按「键 1、值 1、键 2、值 2...」的顺序紧凑排列,无需额外的元数据(如哈希表节点的指针)。
  • 缺点是修改操作(如插入、删除)效率较低,因为需要移动内存中的数据。

2. hashtable(哈希表)

适用场景:当哈希表不满足 ziplist 的条件时(如键值对数量超过 512 个,或某个键 / 值的长度超过 64 字节),Redis 会自动将编码转换为 hashtable。

编码特点

  • 基于数组 + 链表的经典哈希表结构(与 Java 的 HashMap 类似),通过哈希函数将键映射到数组索引,解决哈希冲突。
  • 支持快速的插入、删除、查找操作(平均时间复杂度为 O (1)),适合键值对数量多或键 / 值较大的场景。
  • 缺点是内存占用较高,因为需要存储哈希表节点、指针等额外元数据。

编码转换规则

  • 当哈希表使用 ziplist 编码时,若后续操作导致键值对数量超过 hash-max-ziplist-entries,或某个键 / 值长度超过 hash-max-ziplist-value,Redis 会自动将编码转换为 hashtable
  • 转换是单向的:一旦从 ziplist 转为 hashtable,即使后续键值对数量减少或长度变短,也不会再转回 ziplist。

http://www.xdnf.cn/news/1354483.html

相关文章:

  • Python的标准库之时间库(小白五分钟从入门到精通)
  • 终端复用工具 tmux 的使用方式与推荐配置
  • Autosar CAN开发06(CAN通讯开发需求-CAN矩阵)
  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年8月23日第168弹
  • 【机器学习深度学习】模态与多模态的概念
  • 使用 AD 帐户从 ASP.NET 8 容器登录 SQL Server 的 Kerberos Sidecar
  • uniapp对接一键登录
  • FL Studio Win版.exe安装教程(直接安装版/详细步骤/附安装包下载)
  • 全面解析主流AI模型:功能对比与应用推荐
  • 离线优先与冲突解决:ABP vNext + PWA 的边缘同步
  • AI实现超级客户端打印 支持APP 网页 小程序 调用本地客户端打印
  • 可视化-模块1-HTML-02
  • week4-[循环结构]生日悖论-new
  • Dubbo vs Feign
  • Python 学习(十六) 下一代 Python 包管理工具:UV
  • More Effective C++ 条款04:非必要不提供默认构造函数
  • Day58 Java面向对象13 instanceof 和 类型转换
  • OCR、文档解析工具合集(下)
  • Text2API与Text2SQL深度对比:自然语言驱动的数据交互革命
  • 【51单片机】【protues仿真】基于51单片机冰箱系统
  • 嘉立创EDA快捷键汇总
  • 每日一题8.23
  • Windows应急响应一般思路(三)
  • 从词源和输出生成等角度详细解析PHP中常用文件操作类函数
  • BEVDet/BEVDet4D
  • 【40页PPT】数据安全动态数据脱敏解决方案(附下载方式)
  • LeetCode 分类刷题:2529. 正整数和负整数的最大计数
  • 【大语言模型 16】Transformer三种架构深度对比:选择最适合你的模型架构
  • XCVM1802-2MSEVSVA2197 XilinxAMD Versal Premium FPGA
  • flink常见问题之超出文件描述符限制