我的编程空间,编程开发者的网络收藏夹
学习永远不晚

redis中的hash数据类型怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

redis中的hash数据类型怎么用

这篇文章主要介绍redis中的hash数据类型怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

1. hash类型数据概述

我们先来看这个例子

在上一节我们一起了解了 string 存储类型。但是如果是对象数据的存储具有较频繁的更新需求,操作会显得笨重。例如:user:id:100 -> {"id":100,"name":"春晚","fans":12355,"blogs":99,"focus:83},如果需要更新一个对象中的局部数据,就需要替换掉所有数据,于是有了以下的需求。

新的需求:对一系列存储的数据进行编组,方便管理,比如存储一个对象的信息需要的存储结构:一个存储空间保存多个键值对数据

如下图:

redis中的hash数据类型怎么用

为了解决这个问题,我们引入新的数据类型:hash。同时 hash 存储结构也做了以下优化

  • 如果 field 数量较小,存储结构优化为类数组结构

  • 如果 field 数量较多,存储结构使用 HashMap 结构

2. hash 类型数据的基本操作

  • 修改/添加数据

hset key field value
  • 查询单个字段/查询所有字段

# 查询单个字段数据
hget key field
# 查询所有数据
hgetall key
  • 删除操作

hdel key field1 [field2]
  • 修改/添加多个数据

hmset key field1 value1 field2 value2
  • 返回 hash 表中,一个或多个给定字段的值

hmget key field1 field2
  • 获取 hash 表中字段的数量

hlen key
  • 获取 hash 表中是否存在指定的字段

hexists key field

3. hash 类型数据的扩展操作

  • 获取 hash 表中所有字段名或字段值

hkey key
hvals key
  • 设置指定字符段的数值数据增加指定范围的值

hincrby key field increment
hincrbyfloat key field increment

hash 类型数据操作注意事项

  • hash 类型下的 value 只能存储字符串,不允许存储其他数据类型,不存在嵌套对象。如果数据未获取到,对应的结果为(nil);

  • 每个 hash 可以存储 2 的 32 次方减 1 个键值对;

  • hash 类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性,但 hash 设计初衷不是为了存储大量对象而设计,切记不可滥用,更不可以将 hash 作为对象列表使用;

  • hgetall 操作可以获取全部属性,如果内部 field 过多,遍历整个数据效率会很低,有可能成为数据访问瓶颈。

4. hash的应用案例

4.1. 用hash实现购物车

概述

在这里我们不讨论购物车与数据库间的持久化同步,也不讨论购物车与订单之间的关系,同时忽略未登录用户购物车信息存储。我们仅仅用 redis 的存储模型来 对购物车 的条目进行 添加、浏览、更改数量、删除、清空

实现方案

  • 以客户 id 作为 key,每位用户创建一个 hash 存储结构对应购物车信息

  • 将商品编号作为 field,购买数量作为 value 进行存储

  • 添加商品:追加全新的 field 与 value

  • 浏览商品:遍历 hash

  • 更改数量:自增/自减,设置 value 值

  • 删除商品:删除 field

  • 清空:删除 key

示例代码如下:

# 001 用户购买 ID为101商品 100件,ID为102的商品 200件
hmset 001 101 100 102 200
# 002 用户购买 ID为102商品 1件,ID为104的商品 7件
hmset 002 102 1 104 7

商品信息加速

当前仅仅是将数量存储到 redis 中,并没有起到加速作用,因为商品信息还需要查询数据库。可以使用以下方案解决:

每条购物车中的商品信息记录保存为两个 field

  • field1 专门用于保存数量

命名格式:商品 id:nums 保存数据:数值

  • field2 专门用于保存购物车中显示的商品信息,包含文字描述,图片地址,所属商家信息等

命名格式:商品 id:info 保存数据:json

示例代码如下:

# 001 用户 购买 ID为101的商品 2件,商品的信息为:{"name":"good name"} 
hmset 001 101:num 2  101:info "{\"name\":\"goods name\"}"
# 002 用户 购买 ID为101的商品 1件,商品的信息为:{"name":"good name"} 
hmset 002 101:num 1  101:info "{\"name\":\"goods name\"}"

在上面的101:info 对应的值中,字符串包含了空格,所以用双引号引用起来,达到转义的目的。

商品信息独立保存

由于 field2 可能在多条商品记录中存在,因此 field2 里的数据可保存到独立的 hash。此时,如果每添加一条购物车记录,就保存一次 hash 数据,显然是不合理的,可以通过hsetnx操作来保存数据,如果数据存在,则不执行保存操作。

命令格式如下

hsetnx key field value

代码示例如下

# 将id为101 的商品独立存起来
hsetnx info 101 "{\"name\":\"goods name\"}"

4.1. 用hash实现抢购

案例:双 11 活动日,销售手机充值卡的商家对移动、联通、电信的 30 元、50 元、100 元商品推出抢购活动,每种商品的抢购上限为 100。

解决方案

  • 以商家 id 作为 key

  • 将参与抢购的商品作为 field

  • 将参与抢购的商品数量作为对应的 value

  • 抢购时使用降值的方式控制产品数量

  • 实际业务中还有超卖等实际问题,这里不做讨论

实现过程

商品初始信息

# p01商家下,c30充值券1000张,c50充值券1000张,c100充值券1000张
hmset p01 c30 1000 c50 1000 c100 1000

当 c30 售出1件时,值减 1; 当 c100 售出 20 件时,值减 20,如下代码

# p01商家,商品c30售出1件
hincrby p01 c30 -1
# p01商家,商品c100售出20件
hincrby p01 c100 -20

5. string 存对象对比 hash 存对象

  • string 存储 json 字符串:读取方便,在更新的时候会整体进行更新

  • hash 存对象具体的字段:更新灵活

引入 hash 数据类型之后,我们就解决了 string 存储对象,更新对象时需要整体更新的问题。

以上是“redis中的hash数据类型怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

redis中的hash数据类型怎么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

redis中hash数据类型

remoteSelf:1>hset website google "www.google.com""1"remoteSelf:1>hget website"ERR wrong number of arguments for 'hget' command"rem
redis中hash数据类型
2021-09-09

Redis数据类型string和Hash怎么用

这篇文章给大家分享的是有关Redis数据类型string和Hash怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。String类型命令操作String类型是在Redis中最常用的数据类型,它也是很多程序员在日
2023-06-29

Redis中Hash类型的使用

目录Hash与String比较Hash类型的常见命令(显而易见,在String命令前加入H就是Hash的命令) 1.HSET key field value:添加或修改hash类型keandroidy的field的值(实操举例)2.HGE
2023-06-09

Redis中的Hash类型是用来存储什么样的数据

Redis中的Hash类型是用来存储键值对的数据结构,其中每个键都对应一个哈希表,哈希表中存储了多个键值对。这种数据结构适用于存储对象的字段和值,如存储用户信息、商品信息等。可以通过Hash类型实现对对象的部分字段更新或查询。
Redis中的Hash类型是用来存储什么样的数据
2024-04-09

java怎么redis取数据类型

Java通过Jedis获取Redis数据类型简介Redis是广泛使用的键值对数据库,支持多种数据类型。JavaJedis客户端提供了便捷的方法来获取这些类型。Jedis的get方法get方法获取指定键的值,返回Object类型,可根据键类型转换为Java类型。确定数据类型type方法返回字符串表示键类型。常见数据类型Redis支持多种类型,包括字符串、列表、集合、散列和有序集合。获取特定类型的值根据类型使用特定方法获取值:字符串:get列表:lrange集合:smembers散列:hget有序集合:zra
java怎么redis取数据类型
2024-04-02

redis怎么更改数据类型

在Redis中,可以使用以下命令更改数据类型:1. `SET key value`:将键 key 的值设置为 value,如果键 key 不存在,则创建新的键值对。2. `GETSET key value`:设置键 key 的值为 valu
2023-08-30

Redis基本数据类型哈希Hash常用操作实例分析

这篇文章主要介绍了Redis基本数据类型哈希Hash常用操作实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis基本数据类型哈希Hash常用操作实例分析文章都会有所收获,下面我们一起来看看吧。Red
2023-06-30

Redis特殊数据类型Geospatial怎么使用

这篇文章主要介绍“Redis特殊数据类型Geospatial怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis特殊数据类型Geospatial怎么使用”文章能帮助大家解决问题。Redi
2023-06-30

redis数据类型java怎么处理

Redis数据类型Java处理指南Redis支持多种数据类型,Java语言通过客户端库轻松操作这些类型。常见数据类型字符串:存储文本或二进制数据哈希:键值对集合,键为字符串,值可为任何类型列表:顺序元素集合集合:不重复元素集合有序集合:元素集合,每个元素有相关分数其他类型HyperLogLog:近似基数计数器地理空间:存储地理数据使用示例存储字符串:template.opsForValue().set("name","JohnDoe")获取哈希值:hashOps.hGet("user:1","name")
redis数据类型java怎么处理
2024-04-02

Redis中Stream类型怎么用

这篇文章主要介绍Redis中Stream类型怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、背景最近在看redis这方面的知识,发现在redis5中产生了一种新的数据类型Stream,它和kafka的设计有些
2023-06-25

redis怎么java怎么添加数据类型

RedisJava数据类型添加简介Redis提供丰富的内置数据类型,使用Java客户端可轻松添加数据。字符串类型set():设置键值对setex():设置键值对并指定过期时间append():追加值哈希表类型hset():设置字段值hmset():批量设置多个字段值hsetnx():仅在字段不存在时设置集合类型sadd():添加成员srem():移除成员sismember():检查成员是否存在有序集合类型zadd():添加成员并指定分数zincrby():增加分数zrange():获取范围内的成员流类型x
redis怎么java怎么添加数据类型
2024-04-02

Redis中 HyperLogLog数据类型使用小结

Redis使用HyperLogLog的主要作用是在大数据流(view,IP,城市)的情况下进行去重计数,这篇文章主要介绍了Redis中 HyperLogLog数据类型使用总结,需要的朋友可以参考下
2023-03-13

编程热搜

目录