在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

redis中的hash数据类型怎么用

128次阅读
没有评论

共计 2616 个字符,预计需要花费 7 分钟才能阅读完成。

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

1. hash 类型数据概述

我们先来看这个例子

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

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

如下图:

为了解决这个问题,我们引入新的数据类型: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 数据类型怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-15发表,共计2616字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 日本黄区免费视频观看 | 久久久亚洲色 | 青青色视频 | 亚洲成人aa | 91亚洲精品一区二区自 | 久久人人爽天天玩人人妻精品 | 一区二区在线欧美日韩中文 | 国产片欧美片亚洲片久久综合 | 成人年无码av片在线观看 | 色偷偷综合网 | 国产香蕉98碰碰久久人人 | 日日天日日夜日日摸 | 岛国午夜视频 | 可以看毛片的网址 | 日本一级欧美一级中文 | 亚洲av无码一区二区乱孑伦as | 国产乱子伦视频一区二区三区 | 手机看片福利一区二区三区 | 亚洲日本一区二区三区在线 | 国产免费av片在线播放 | 四虎影视久久久免费 | 黑人巨大videos极度另类 | 台湾佬视频在线偷拍 | 中文字幕在线一区二区在线 | 动漫精品一区二区三区四区 | 国产黄色网页 | 人妻尝试又大又粗久久 | 久久精品一区二区免费播放 | 婷婷五月日韩av永久免费 | 爱爱免费视频网站 | 久久久www免费人成精品 | 欧美成人三级网站 | 综合图片亚洲网友自拍 | 热re99久久精品国产99热 | 久久久综合亚洲色一区二区三区 | 欧美自拍另类欧美综合图片区 | 国产精品爱久久久久久久小说 | 男插女高潮一区二区 | 99精品视频在线成人精彩视频 | 日韩 欧美 亚洲国产 | 日本乱偷人妻中文字幕在线 |