Redis 的 hash(哈希类型) 数据类型与结构和应用场景

Hash 数据类型与结构


一、Hash 类型介绍

Redis hash数据结构 是一个键值对(key-value)集合,它是一个 string 类型的 field 和 value 的映射表,redis 本身就是一个 key-value 型数据库,因此 hash 数据结构相当于在 value 中又套了一层 key-value 型数据。所以 redis 中 hash 数据结构特别适合存储关系型对象。比如用来存储学生基本信息,或者用户信息等。


常用命令


hmset 命令

描述:用于同时将多个 field-value (字段-值)对设置到哈希表中。假如hash表中已经存在 field,则会对其进行覆盖。如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。

命令使用:[hmset 命令] [key 表名] [field 名称] [value值] [field 名称] [value值] ...

127.0.0.1:6379> hmset users id 1 username starsky age 18 sex 1
OK
127.0.0.1:6379>

hmget 命令

描述:用于返回 hash 表中 field 字段对应的值,如果 field 不存在,那么返回 nil 值。

命令使用:[hmget 命令] [key 表名] [field 名称] [field 名称] ...

127.0.0.1:6379> hmget users id username age sex
1) "1"
2) "starsky"
3) "18"
4) "1"
127.0.0.1:6379>

hset 命令

描述:对 hash 表中 field 对应的value进行赋值,如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。

命令使用:[hset 命令] [key 表名] [field 名称] [value 值]

127.0.0.1:6379> hset users address gd
(integer) 1
127.0.0.1:6379> hset users sex 0
(integer) 0
127.0.0.1:6379> hmget users id username age sex address
1) "1"
2) "starsky"
3) "18"
4) "0"
5) "gd"
127.0.0.1:6379>

hvals 命令

描述:用于返回哈希表所有 field 对应的值。

命令使用:[hvals 命令] [key 表名]

127.0.0.1:6379> hvals users
1) "1"
2) "starsky"
3) "18"
4) "0"
5) "gd"
127.0.0.1:6379> 

hdel 命令

描述:用于删除指定哈希表中的一个或多个field,不存在的field将被忽略。

命令使用:[hdel 命令] [key 表名] [field 名称] ...

127.0.0.1:6379> hdel users sex address
(integer) 2
127.0.0.1:6379> hvals users
1) "1"
2) "starsky"
3) "18"
127.0.0.1:6379> 

hgetall 命令

描述:用于返回哈希表中,所有的字段和值。

命令使用:[hgetall 命令] [key 表名]

127.0.0.1:6379> hgetall users
1) "id"
2) "1"
3) "username"
4) "starsky"
5) "age"
6) "18"
127.0.0.1:6379> 



Hash 类型应用场景


一、购物车

购物车功能主要是通过用户点击商品添加到购物车,前端会传递商品id以及用于需要购买的数据到后端,php 通过前端传递的参数进而完成购物车的添加,增加或者减少购物车购买数量,删除或者清空购物车等功能。

如果说是使用redis来做我们可以以用户 id 为 key,商品 id 为 field,商品数量为 value,恰好构成了购物车的3个要素。

如:

				[命令] [购物车用户:ID] [产品:ID] [数量]
127.0.0.1:6379> hmset shopcartuser:1 product:1 2
OK
127.0.0.1:6379> hmget shopcartuser:1 product:1
1) "2"
127.0.0.1:6379> 



二、存储对象

hash 类型的 (key, field, value) 的结构与对象的(对象id, 属性, 值)的结构相似,也可以用来存储对象。

在介绍string类型的应用场景时有所介绍,string + json 也是存储对象的一种方式,那么存储对象时,到底用 string + json 还是用 hash 呢?

两种存储方式的对比如下表所示:

String + jsonHash
效率很高
容量
灵活性
序列化简单复杂

当对象的某个属性需要频繁修改时,不适合用 string+json,因为它不够灵活,每次修改都需要重新将整个对象序列化并赋值,如果使用 hash 类型,则可以针对某个属性单独修改,没有序列化,也不需要修改整个对象。比如,商品的价格、销量、关注数、评价数等可能经常发生变化的属性,就适合存储在hash类型里。

当然,不常变化的属性存储在 hash 类型里也没有问题,比如商品名称、商品描述、上市日期等。但是,当对象的某个属性不是基本类型或字符串时,使用 hash 类型就必须手动进行复杂序列化,比如,商品的标签是一个标签对象的列表,商品可领取的优惠券是一个优惠券对象的列表等,即使以 coupons(优惠券)作为 field,value 想存储优惠券对象列表也还是要使用 json 来序列化,这样的话序列化工作就太繁琐了,不如直接用 string + json 的方式存储商品信息来的简单。




  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Redis支持五种数据结构类型:字符串(string)、列表(list)、哈希hash)、集合(sets)、有序集合(sorted sets)。它们可以用于实现缓存、消息队列、计数器、在线聊天室、投票系统、排行榜等应用场景。 ### 回答2: Redis支持多种数据结构类型,常用的有字符串、哈希、列表、集合和有序集合。 1. 字符串(strings):最基本的数据结构类型,可以存储字符串、整数或浮点数等。常用场景包括缓存、计数器和分布式锁等。 2. 哈希hashes):类似于一个关联数组,可以存储多个字段和值的映射关系。适用于存储对象的各个属性,例如用户信息、商品详情等。 3. 列表(lists):支持在头部或尾部添加或删除元素,保持了元素的插入顺序。常用于消息队列、发布订阅系统和任务队列等场景。 4. 集合(sets):无序且唯一的元素集合。适用于需要对元素进行去重或集合操作的场景,例如标签云、社交关系等。 5. 有序集合(sorted sets):元素集合,每个元素都关联了一个分数,用于排序和获取范围内的元素。常见应用包括排行榜、热门文章等。 这些数据结构类型提供了丰富的功能和灵活性,可以根据不同的场景选择适合的数据结构Redis 的快速读写性能和丰富的数据类型使得它成为了很多应用场景的首选,包括缓存、计数器、消息队列、排行榜、实时数据分析等。 ### 回答3: Redis是一款开源的、高性能的非关系型内存数据库,支持多种数据结构类型。常用的Redis数据结构类型有字符串(String)、哈希Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。 字符串类型Redis最基本的数据结构类型,可以存储字符串和整数。它常用于缓存、计数器、共享会话等场景。 哈希类型可以存储多个字段和值的映射关系,类似于关联数组或字典。它适用于存储用户信息、商品信息等结构化的数据。 列表类型是有序的字符串列表,可以在列表的两端进行插入、删除和查找操作。它适合做消息队列、最新消息排行等场景。 集合类型是无序的字符串集合,可以对集合进行交集、并集和差集等操作,也支持添加、删除和查找元素。常用的场景包括社交关系、标签系统等。 有序集合类型是在集合类型的基础上,为每个元素关联一个分数,可以根据分数进行元素排序。它适用于排行榜、按照分数范围查找等场景。 除了以上几种数据结构类型Redis还提供了位图、地理位置等特殊类型,可以应用于统计用户在线时长、地理位置检索等特定需求。 总而言之,Redis提供了多种数据结构类型,每种类型都有其独特的使用场景。根据具体的业务需求,选择适合的数据结构类型可以提升数据处理效率和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值