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

【Redis】Hash介绍与应用详解

大家好,我是白晨,一个不是很能熬夜,但是也想日更的人。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪💪💪

在这里插入图片描述

文章目录

  • Hash介绍与应用详解
    • 介绍
    • 常用指令
      • 设置和获取字段值
      • 获取所有字段和值
      • 检查字段是否存在
      • 删除字段
      • 获取所有字段
      • 获取所有值
      • 获取哈希表中字段的数量
      • 同时获取多个字段的值
      • 同时设置多个字段的值
      • 字段值的整数增加
      • 字段值的浮点数增加
      • 迭代哈希表中的键值对
      • 仅在字段不存在时,设置字段值
      • 返回字段值的字符串长度
    • 常用指令汇总
    • 应用场景
      • 用户信息存储
        • 实现用户信息存储的步骤
          • 1. 设置用户信息
          • 2. 获取用户信息
          • 3. 获取所有用户信息
          • 4. 更新用户信息
          • 5. 删除用户属性
      • 简易购物车
        • 实现简易购物车的步骤
          • 1. 添加商品到购物车
          • 2. 更新购物车中商品的数量
          • 3. 获取购物车中的商品总数
          • 4. 从购物车中移除商品
          • 5. 获取购物车中的所有商品及其数量
  • 总结
      • Redis Hash 介绍
      • 常用指令
      • 应用场景
        • 用户信息存储
        • 简易购物车

Hash介绍与应用详解


介绍


Redis Hash是一个键值对集合,类似于传统编程语言中的哈希表或字典。

image-20240514153315227

Redis Hash通过哈希表实现。这意味着它适合用于存储对象,比如一个用户的信息,其中每个字段(如用户名、年龄、邮箱等)都作为键值对存储在哈希表中。每个哈希表可以包含任意数量的字段,并且每个字段都有唯一的键。

Redis中本来就是每一个key对应一个value,那Hash类型和String类型的差别在哪呢?

在 Redis 中,虽然每个 key 对应一个 value,但是 value 的类型可以有多种,其中之一就是 Hash 类型。

Redis Hash 是一种键值对集合,其特点是在一个 key 对应的 value 中存储了多个字段(field)和相应的值。换句话说,Redis 的 Hash 类型允许我们在一个 Redis 键下存储多个键值对。

举个例子:

  • 普通的 Redis 键值对:

    user:1000 -> "John Doe"
    

    这里,user:1000 是键,"John Doe" 是值,值是一个简单的字符串。

    image-20240603173030439

  • 使用 Redis Hash:

    user:1000 -> { name: "John Doe", age: 30, email: "baichen@example.com" }
    

    在这个例子中,user:1000 仍然是键,但是值是一个哈希表,包含了多个字段:nameageemail,每个字段都有一个对应的值。

    image-20240603172723391

  • 添加和访问

使用 HSET 命令可以向哈希表中添加一个字段,并设置其值。无论哈希表中已有多少字段,添加新字段的操作都是 O(1) 的时间复杂度。类似地,HGET 命令可以用来获取特定字段的值,也是 O(1) 的操作。

  • 限制

每个哈希可以存储多达 4,294,967,295 2 32 − 1 2^{32} - 1 2321)个字段-值对。实际上,你的哈希仅受限于托管你的 Redis 部署的虚拟机上的总内存。

  • 性能

添加、删除和查询哈希表中单个字段的操作时间复杂度为 O(1),这使得它们非常高效。但是,对整个哈希表的操作,特别是涉及到遍历或批量处理字段的命令,通常是 O(n)。这些命令包括 HKEYS、HVALS 和 HGETALL。在处理包含大量字段的哈希表时,使用这些命令需要特别小心,以避免性能瓶颈。


常用指令


设置和获取字段值


127.0.0.1:6379> HSET myhash field1 "Hello" field2 "World" # 设置字段 field1 和 field2
(integer) 2
127.0.0.1:6379> HGET myhash field1 # 获取字段 field1 的值
"Hello"
127.0.0.1:6379> HGET myhash field2 # 获取字段 field2 的值
"World"

获取所有字段和值


127.0.0.1:6379> HGETALL myhash # 获取所有字段和值
1) "field1"
2) "Hello"
3) "field2"
4) "World"

检查字段是否存在


127.0.0.1:6379> HEXISTS myhash field1 # 检查字段 field1 是否存在
(integer) 1
127.0.0.1:6379> HEXISTS myhash field3 # 检查字段 field3 是否存在
(integer) 0

删除字段


127.0.0.1:6379> HDEL myhash field1 # 删除字段 field1
(integer) 1
127.0.0.1:6379> HGETALL myhash # 查看哈希表中的所有字段和值
1) "field2"
2) "World"

获取所有字段


127.0.0.1:6379> HSET myhash field1 "Hello" field2 "World" # 设置两个字段
(integer) 2
127.0.0.1:6379> HKEYS myhash # 获取所有字段
1) "field1"
2) "field2"

获取所有值


127.0.0.1:6379> HVALS myhash # 获取所有字段的值
1) "Hello"
2) "World"

获取哈希表中字段的数量


127.0.0.1:6379> HLEN myhash # 获取哈希表中字段的数量
(integer) 2

同时获取多个字段的值


127.0.0.1:6379> HMGET myhash field1 field2 # 获取多个字段的值
1) "Hello"
2) "World"

同时设置多个字段的值


127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World" field3 "Redis" # 设置多个字段的值
OK
127.0.0.1:6379> HGETALL myhash # 查看哈希表中的所有字段和值
1) "field1"
2) "Hello"
3) "field2"
4) "World"
5) "field3"
6) "Redis"

字段值的整数增加


127.0.0.1:6379> HSET myhash field4 10 # 设置字段 field4 为整数 10
(integer) 1
127.0.0.1:6379> HINCRBY myhash field4 5 # 增加字段 field4 的值 5
(integer) 15
127.0.0.1:6379> HGET myhash field4 # 查看字段 field4 的值
"15"

字段值的浮点数增加


127.0.0.1:6379> HSET myhash field5 10.5 # 设置字段 field5 为浮点数 10.5
(integer) 1
127.0.0.1:6379> HINCRBYFLOAT myhash field5 0.5 # 增加字段 field5 的值 0.5
"11"
127.0.0.1:6379> HGET myhash field5 # 查看字段 field5 的值
"11"

迭代哈希表中的键值对


127.0.0.1:6379> HSCAN myhash 0 MATCH field* COUNT 100 # 迭代哈希表中的键值对
1) "0"
2)  1) "field2"2) "World"3) "field1"4) "Hello"5) "field3"6) "Redis"7) "field4"8) "15"9) "field5"10) "11"

仅在字段不存在时,设置字段值


127.0.0.1:6379> HSETNX myhash field1 "New Value" # 尝试设置已经存在的字段 field1
(integer) 0
127.0.0.1:6379> HSETNX myhash field6 "New Field" # 设置不存在的字段 field6
(integer) 1
127.0.0.1:6379> HGET myhash field6 # 查看字段 field6 的值
"New Field"

返回字段值的字符串长度


127.0.0.1:6379> HSTRLEN myhash field1 # 返回字段 field1 的值的字符串长度
(integer) 5

常用指令汇总


命令描述
HDEL key field1 [field2]删除一个或多个哈希表字段
HEXISTS key field查看哈希表 key 中,指定的字段是否存在
HGET key field获取存储在哈希表中指定字段的值
HGETALL key获取在哈希表中指定 key 的所有字段和值
HINCRBY key field increment为哈希表 key 中的指定字段的整数值加上增量 increment
HINCRBYFLOAT key field increment为哈希表 key 中的指定字段的浮点数值加上增量 increment
HKEYS key获取所有哈希表中的字段
HLEN key获取哈希表中字段的数量
HMGET key field1 [field2]获取所有给定字段的值
HMSET key field1 value1 [field2 value2]同时将多个 field-value (域-值)对设置到哈希表 key 中
HSET key field value将哈希表 key 中的字段 field 的值设为 value
HSETNX key field value只有在字段 field 不存在时,设置哈希表字段的值
HVALS key获取哈希表中所有值
HSCAN key cursor [MATCH pattern] [COUNT count]迭代哈希表中的键值对
HSTRLEN key field返回哈希表 key 中,与给定域 field 相关联的值的字符串长度

应用场景


用户信息存储


在现代应用中,用户信息的管理是一个常见需求。Redis Hash 非常适合存储和操作用户信息,因为它允许在一个 Redis 键下存储多个字段,从而能够高效地组织和管理用户数据。

使用用户ID当作key,用户信息ID当作value:key,用户具体信息当作value.value,可以实现下图所示的用户信息存储。

image-20240603180205242

实现用户信息存储的步骤
1. 设置用户信息

使用 HSET 命令可以方便地将多个用户属性存储在一个 Redis 哈希表中。

127.0.0.1:6379> HSET user:1000 name "Alice" age "30" email "alice@example.com"
(integer) 3
2. 获取用户信息

使用 HGET 命令可以获取特定用户属性的值。

127.0.0.1:6379> HGET user:1000 name
"Alice"
127.0.0.1:6379> HGET user:1000 age
"30"
3. 获取所有用户信息

使用 HGETALL 命令可以获取用户的所有属性和值。

127.0.0.1:6379> HGETALL user:1000
1) "name"
2) "Alice"
3) "age"
4) "30"
5) "email"
6) "alice@example.com"
4. 更新用户信息

使用 HSET 命令可以更新用户的某个属性值。

127.0.0.1:6379> HSET user:1000 age "31"
(integer) 0
127.0.0.1:6379> HGET user:1000 age
"31"
5. 删除用户属性

使用 HDEL 命令可以删除某个属性。

127.0.0.1:6379> HDEL user:1000 email
(integer) 1
127.0.0.1:6379> HGETALL user:1000
1) "name"
2) "Alice"
3) "age"
4) "31"

简易购物车

在电子商务应用中,购物车是一个关键功能。用户可以将商品添加到购物车,查看购物车中的商品,更新商品数量,或从购物车中移除商品。Redis Hash 非常适合用来实现简易购物车,因为它允许在一个 Redis 键下存储多个字段,每个字段可以表示一个商品及其数量。

使用用户ID当作key,商品ID当作value:key,商品数量当作value.value,可以实现下图所示的简易购物车。

image-20240603181511873

具体Redis实例如下图:

image-20240603181511873

实现简易购物车的步骤
1. 添加商品到购物车

使用 HSET 命令将商品添加到购物车。

127.0.0.1:6379> HSET cart:user123 product:101 1 # 添加商品101,数量为1
(integer) 1
127.0.0.1:6379> HSET cart:user123 product:102 1 # 添加商品102,数量为1
(integer) 1
2. 更新购物车中商品的数量

使用 HINCRBY 命令更新购物车中某个商品的数量。

127.0.0.1:6379> HINCRBY cart:user123 product:101 2 # 商品101的数量增加2
(integer) 3
127.0.0.1:6379> HINCRBY cart:user123 product:102 1 # 商品102的数量增加1
(integer) 2
3. 获取购物车中的商品总数

使用 HLEN 命令获取购物车中商品的总数。

127.0.0.1:6379> HLEN cart:user123
(integer) 2
4. 从购物车中移除商品

使用 HDEL 命令从购物车中移除某个商品。

127.0.0.1:6379> HDEL cart:user123 product:102 # 移除商品102
(integer) 1
5. 获取购物车中的所有商品及其数量

使用 HGETALL 命令获取购物车中的所有商品及其数量。

127.0.0.1:6379> HGETALL cart:user123
1) "product:101"
2) "3"

总结


Redis Hash 介绍

  • Redis Hash 是一个键值对集合,类似于哈希表或字典。
  • 每个 Hash 可以包含任意数量的字段,每个字段都有唯一的键。
  • Hash 类型允许在一个 Redis 键下存储多个键值对。
  • 添加、删除和查询哈希表中单个字段的操作时间复杂度为 O(1),高效且适合存储对象(如用户信息)。

常用指令

  • 设置字段值:使用 HSET 命令可以向哈希表中添加一个字段,并设置其值。
  • 获取字段值:使用 HGET 命令可以获取特定字段的值。
  • 获取所有字段和值:使用 HGETALL 命令可以获取哈希表中所有字段和值。
  • 检查字段是否存在:使用 HEXISTS 命令可以检查哈希表中是否存在指定字段。
  • 删除字段:使用 HDEL 命令可以删除一个或多个字段。
  • 获取所有字段:使用 HKEYS 命令可以获取哈希表中的所有字段名。
  • 获取所有值:使用 HVALS 命令可以获取哈希表中的所有字段值。
  • 获取字段数量:使用 HLEN 命令可以获取哈希表中字段的数量。
  • 同时获取多个字段的值:使用 HMGET 命令可以一次获取多个字段的值。
  • 同时设置多个字段的值:使用 HMSET 命令可以一次性设置多个字段的值。
  • 字段值的整数增加:使用 HINCRBY 命令。
  • 字段值的浮点数增加:使用 HINCRBYFLOAT 命令。
  • 迭代哈希表中的键值对:使用 HSCAN 命令。
  • 仅在字段不存在时设置字段值:使用 HSETNX 命令。
  • 返回字段值的字符串长度:使用 HSTRLEN 命令。

应用场景

用户信息存储
  • 适合场景:现代应用中,管理用户信息是常见需求,Redis Hash 可以高效地组织和管理用户数据。
  • 操作:可以通过设置用户信息、获取用户信息、更新用户信息和删除用户属性来实现用户信息的存储和管理。
简易购物车
  • 适合场景:电子商务应用中的购物车功能,通过 Redis Hash 存储商品及其数量。
  • 操作:包括添加商品到购物车、更新购物车中商品的数量、获取购物车中的商品总数、从购物车中移除商品,以及获取购物车中的所有商品及其数量。

如果讲解有不对之处还请指正,我会尽快修改,多谢大家的包容。

如果大家喜欢这个系列,还请大家多多支持啦😋!

如果这篇文章有帮到你,还请给我一个大拇指 👍和小星星 ⭐️支持一下白晨吧!喜欢白晨【Redis】系列的话,不如关注👀白晨,以便看到最新更新哟!!!

相关文章:

  • Huawei 大型 WLAN 组网 AC 间漫游
  • linux基础-数据库建库建表
  • SiC碳化硅陶瓷膜的热导性
  • Three.js动效(第11辑):大屏+3D+动效,三位一体,是绝配。
  • 为什么选择mobx
  • vue使用tailwindcss
  • Python | 刷题笔记
  • vue -ant -design 卡片是布局 实现动态计算 当前的 左右间距 实现居中
  • MySQL——覆盖索引
  • 面试经典题:创建三个线程,按顺序依次循环打印hello+i
  • 你觉得学历在贬值吗?
  • 关于ASPICE 4.0评估师资质更新的说明-亚远景科技
  • Java多线程核心工具类
  • 运维开发之Linux机器码
  • 健康中国,福佑全球!第32届广州大健康展将于6月14-16日盛大举办
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • Angular 2 DI - IoC DI - 1
  • JavaScript 一些 DOM 的知识点
  • Js基础知识(四) - js运行原理与机制
  • leetcode98. Validate Binary Search Tree
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Node项目之评分系统(二)- 数据库设计
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • React系列之 Redux 架构模式
  • Swift 中的尾递归和蹦床
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 反思总结然后整装待发
  • 机器学习中为什么要做归一化normalization
  • 经典排序算法及其 Java 实现
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 算法之不定期更新(一)(2018-04-12)
  • 译自由幺半群
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 主流的CSS水平和垂直居中技术大全
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • #define
  • #职场发展#其他
  • (java)关于Thread的挂起和恢复
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十)c52学习之旅-定时器实验
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)IOS中获取各种文件的目录路径的方法
  • ****三次握手和四次挥手
  • .gitignore文件—git忽略文件
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net framework profiles /.net framework 配置
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET Standard 的管理策略
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET8 动态添加定时任务(CRON Expression, Whatever)