【Redis】Hash介绍与应用详解
大家好,我是白晨,一个不是很能熬夜,但是也想日更的人。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪💪💪
文章目录
- Hash介绍与应用详解
- 介绍
- 常用指令
- 设置和获取字段值
- 获取所有字段和值
- 检查字段是否存在
- 删除字段
- 获取所有字段
- 获取所有值
- 获取哈希表中字段的数量
- 同时获取多个字段的值
- 同时设置多个字段的值
- 字段值的整数增加
- 字段值的浮点数增加
- 迭代哈希表中的键值对
- 仅在字段不存在时,设置字段值
- 返回字段值的字符串长度
- 常用指令汇总
- 应用场景
- 用户信息存储
- 实现用户信息存储的步骤
- 1. 设置用户信息
- 2. 获取用户信息
- 3. 获取所有用户信息
- 4. 更新用户信息
- 5. 删除用户属性
- 简易购物车
- 实现简易购物车的步骤
- 1. 添加商品到购物车
- 2. 更新购物车中商品的数量
- 3. 获取购物车中的商品总数
- 4. 从购物车中移除商品
- 5. 获取购物车中的所有商品及其数量
- 总结
- Redis Hash 介绍
- 常用指令
- 应用场景
- 用户信息存储
- 简易购物车
Hash介绍与应用详解
介绍
Redis Hash是一个键值对集合,类似于传统编程语言中的哈希表或字典。
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"
是值,值是一个简单的字符串。使用 Redis Hash:
user:1000 -> { name: "John Doe", age: 30, email: "baichen@example.com" }
在这个例子中,
user:1000
仍然是键,但是值是一个哈希表,包含了多个字段:name
、age
和email
,每个字段都有一个对应的值。添加和访问
使用 HSET
命令可以向哈希表中添加一个字段,并设置其值。无论哈希表中已有多少字段,添加新字段的操作都是 O(1) 的时间复杂度。类似地,HGET
命令可以用来获取特定字段的值,也是 O(1) 的操作。
- 限制
每个哈希可以存储多达 4,294,967,295
(
2
32
−
1
2^{32} – 1
232−1)个字段-值对。实际上,你的哈希仅受限于托管你的 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
,可以实现下图所示的用户信息存储。
实现用户信息存储的步骤
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
,可以实现下图所示的简易购物车。
具体Redis实例如下图:
实现简易购物车的步骤
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】系列的话,不如关注
👀白晨,以便看到最新更新哟!!!