Redis 数据类型 Hash 哈希

news/2025/2/12 20:46:05/
在 Redis 中,哈希类型是指值本⾝⼜是⼀个键值对结构,形如 key = "key",value = { { field1, value1 }, ..., {fieldN, valueN } },Redis String 和 Hash 类型⼆者的关系可以⽤下图来表⽰。

Hash 数据类型的特点

  1. 键值对集合:Hash 类型可以存储多个键值对,每个键(field)都有一个对应的值(value)。

  2. 二进制安全:键和值都是二进制安全的,可以包含任何数据,包括二进制数据。

  3. 高效查找:无论 Hash 中存储了多少数据,查找某个键的速度都非常快。

  4. 节省内存:通过将多个相关数据存储在一个键下,减少了键的数量,节省了内存。

内部编码

Redis 的 Hash 数据类型有两种内部编码方式:

  1. 压缩列表(ziplist):当 Hash 中的元素数量较少(默认小于 512 个),且每个值的大小较小(默认小于 64 字节)时,Redis 使用压缩列表来存储 Hash。

  2. 哈希表(hashtable):当 Hash 的大小超过上述阈值时,Redis 会自动切换到哈希表编码。

命令

设置和获取键值

HSET

设置 hash 中指定的字段(field)的值(value)。
语法:
HSET key field value [field value ...]
时间复杂度:插⼊⼀组 field 为 O(1), 插⼊ N 组 field 为 O(N)
返回值:添加的字段的个数。
⽰例:

HGET

获取 hash 中指定字段的值。
语法:
HGET key field
时间复杂度:O(1)
返回值:字段对应的值或者 nil。
⽰例:

HMGET

⼀次获取 hash 中多个字段的值。
语法:
HMGET key field [field ...]
时间复杂度:只查询⼀个元素为 O(1), 查询多个元素为 O(N), N 为查询元素个数.
返回值:字段对应的值或者 nil。
⽰例:

HEXISTS

判断 hash 中是否有指定的字段。
语法:
​​​​​​​HEXISTS key field
时间复杂度:O(1)
返回值:1 表⽰存在,0 表⽰不存在。
⽰例:

HDEL

删除 hash 中指定的字段。
语法:
HDEL key field [field ...]
时间复杂度:删除⼀个元素为 O(1). 删除 N 个元素为 O(N).
返回值:本次操作删除的字段个数。
⽰例:

HKEYS

获取 hash 中的所有字段。
语法:
HKEYS key
时间复杂度:O(N), N 为 field 的个数.
返回值:字段列表。
⽰例:

HVALS

获取 hash 中的所有的值。
语法:
HVALS key
时间复杂度:O(N), N 为 field 的个数.
返回值:所有的值。
⽰例:

HGETALL

获取 hash 中的所有字段以及对应的值。
语法:
GETALL key
时间复杂度:O(N), N 为 field 的个数.
返回值:字段和对应的值。
⽰例:

HLEN

获取 hash 中的所有字段的个数。
语法:
HLEN key
时间复杂度:O(1)
返回值:字段个数。

计数命令

HINCRBY

将 hash 中字段对应的数值添加指定的值。
语法:
HINCRBY key field increment
时间复杂度:O(1)
返回值:该字段变化之后的值。
示例:

HINCRBYFLOAT

HINCRBY 的浮点数版本。
语法: ​​​​​​​
HINCRBYFLOAT key field increment
时间复杂度:O(1)
返回值:该字段变化之后的值。

使用场景

下图为关系型数据表记录的两条⽤⼾信息,⽤⼾的属性表现为表的列,每条⽤⼾信息表现为⾏。
uidnameage
city
1
James28
Beijing
2
Johnathan
30
Xian
相⽐于使⽤ JSON 格式的字符串缓存⽤⼾信息,哈希类型变得更加直观,并且在更新操作上变得更灵活。可以将每个⽤⼾的 id 定义为键后缀,多对 field-value 对应⽤⼾的各个属性,类似如下伪代码:
UserInfo getUserInfo(long uid) {// 根据 uid 得到 Redis 的键String key = "user:" + uid;// 尝试从 Redis 中获取对应的值userInfoMap = Redis 执⾏命令:hgetall key;// 如果缓存命中(hit)if (value != null) {// 将映射关系还原为对象形式UserInfo userInfo = 利⽤映射关系构建对象(userInfoMap);return userInfo;}// 如果缓存未命中(miss),从数据库中,根据 uid 获取⽤⼾信息UserInfo userInfo = MySQL 执⾏ SQL:select * from user_info where uid = <uid>// 如果表中没有 uid 对应的⽤⼾信息if (userInfo == null) {// 响应 404return null;
}// 将缓存以哈希类型保存Redis 执⾏命令:hmset key name userInfo.name age userInfo.age city userInfo.city// 写⼊缓存,为了防⽌数据腐烂(rot),设置过期时间为 1 ⼩时(3600 秒)Redis 执⾏命令:expire key 3600// 返回⽤⼾信息return userInfo;
}
但是需要注意的是哈希类型和关系型数据库有两点不同之处:
  • 哈希类型是稀疏的,⽽关系型数据库是完全结构化的,例如哈希类型每个键可以有不同的 field,⽽关系型数据库⼀旦添加新的列,所有⾏都要为其设置值,即使为 null。
  • 关系数据库可以做复杂的关系查询,⽽ Redis 去模拟关系型复杂查询,例如联表查询、聚合查询等基本不可能,维护成本⾼。

http://www.ppmy.cn/news/1571521.html

相关文章

vue2 在span里调整样式,使得斜杠/上下对齐

在span里包3个span&#xff0c;通过text-align属性控制对齐方式 <el-table-column prop"BYC" label"BYC/PBYC" width"95"><template slot-scope"scope"><!-- 保留原有条件判断&#xff0c;但调整内部结构 --><t…

【MySQL — 数据库基础】深入解析MySQL的聚合查询

1. 聚合查询 1.1 聚合函数 函数说明COUNT ( [DISTINCT] expr)返回查询到的数据的数量( 行数 )SUM ( [DISTINCT] expr)返回查询到的数据的总和&#xff0c;不是数字没有意义AVG ( [DISTINCT] expr)返回查询到的数据的平均值&#xff0c;不是数字没有意义MAX( [DISTINCT] expr)…

PHP的JIT编译器

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 PHP是一种广泛使用的脚本语言&#xff0c;被用于构建…

ZooKeeper 和 Dubbo 的关系:技术体系与实际应用

引言 在现代微服务架构中&#xff0c;服务治理和协调是至关重要的环节。ZooKeeper 和 Dubbo 是两个在分布式系统中常用的技术工具&#xff0c;它们之间有着紧密的联系。本文将详细探讨 ZooKeeper 和 Dubbo 的关系&#xff0c;从基础概念、技术架构、具体实现到实际应用场景&am…

ZooKeeper 技术全解:概念、功能、文件系统与主从同步

引言 随着分布式系统变得越来越复杂&#xff0c;对协调服务的需求也在不断增长。ZooKeeper 作为一个由 Apache 维护的开源分布式协调服务框架&#xff0c;广泛用于 Hadoop 生态系统和其他需要协调的分布式环境中。这一系统旨在解决分布式应用中常见的挑战&#xff0c;如配置管…

Kafka 详细介绍

Kafka 详细介绍 1. 概述 Apache Kafka 是一个分布式流处理平台&#xff0c;由 LinkedIn 开发并开源&#xff0c;主要用于构建实时数据管道和流应用。它具备高吞吐量、低延迟、高可扩展性和持久性&#xff0c;广泛应用于日志收集、消息系统、流处理等场景。 2. 核心概念 Pro…

开源的 DeepSeek-R1「GitHub 热点速览」

春节假期回来&#xff0c;一睁眼全是王炸级的开源模型 DeepSeek-R1&#xff01; GitHub 地址→github.com/deepseek-ai/DeepSeek-R1 DeepSeek-R1 开源还不到一个月&#xff0c;Star 数就飙升至冲破天际的 70k。虽然目前仅开源了模型权重&#xff0c;但同时发布的技术论文详细地…

Word 编辑密码解密教程

如果你遇到 word 不能打开编辑或忘记密码的情况&#xff0c;别担心&#xff0c;这里有最简单的办法。具体步骤如下&#xff1a;在手机或电脑浏览器上输入 文件密码.top 进入密码找回网站&#xff0c;然后点击“立即开始”&#xff0c;上传文件&#xff0c;无需下载软件&#xf…