redis中的hash数据类型怎么用
这篇文章主要介绍redis中的hash数据类型怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
1. hash类型数据概述我们先来看这个例子
在上一节我们一起了解了 string 存储类型。但是如果是对象数据的存储具有较频繁的更新需求,操作会显得笨重。例如:user:id:100 -> {"id":100,"name":"春晚","fans":12355,"blogs":99,"focus:83}
,如果需要更新一个对象中的局部数据,就需要替换掉所有数据,于是有了以下的需求。
新的需求:对一系列存储的数据进行编组,方便管理,比如存储一个对象的信息需要的存储结构:一个存储空间保存多个键值对数据
如下图:
为了解决这个问题,我们引入新的数据类型:hash
。同时 hash 存储结构也做了以下优化
如果 field 数量较小,存储结构优化为类数组结构
如果 field 数量较多,存储结构使用 HashMap 结构
2. hash 类型数据的基本操作修改/添加数据
hsetkeyfieldvalue
查询单个字段/查询所有字段
#查询单个字段数据hgetkeyfield#查询所有数据hgetallkey
删除操作
hdelkeyfield1[field2]
修改/添加多个数据
hmsetkeyfield1value1field2value2
返回 hash 表中,一个或多个给定字段的值
hmgetkeyfield1field2
获取 hash 表中字段的数量
hlenkey
获取 hash 表中是否存在指定的字段
hexistskeyfield3. hash 类型数据的扩展操作
获取 hash 表中所有字段名或字段值
hkeykeyhvalskey
设置指定字符段的数值数据增加指定范围的值
hincrbykeyfieldincrementhincrbyfloatkeyfieldincrement
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件hmset001101100102200#002用户购买ID为102商品1件,ID为104的商品7件hmset00210211047
商品信息加速
当前仅仅是将数量存储到 redis 中,并没有起到加速作用,因为商品信息还需要查询数据库。可以使用以下方案解决:
每条购物车中的商品信息记录保存为两个 field
field1 专门用于保存数量
命名格式:商品 id:nums保存数据:数值
field2 专门用于保存购物车中显示的商品信息,包含文字描述,图片地址,所属商家信息等
命名格式:商品 id:info保存数据:json
示例代码如下:
#001用户购买ID为101的商品2件,商品的信息为:{"name":"goodname"}hmset001101:num2101:info"{\"name\":\"goodsname\"}"#002用户购买ID为101的商品1件,商品的信息为:{"name":"goodname"}hmset002101:num1101:info"{\"name\":\"goodsname\"}"
在上面的101:info
对应的值中,字符串包含了空格,所以用双引号引用起来,达到转义的目的。
商品信息独立保存
由于 field2 可能在多条商品记录中存在,因此 field2 里的数据可保存到独立的 hash。此时,如果每添加一条购物车记录,就保存一次 hash 数据,显然是不合理的,可以通过hsetnx
操作来保存数据,如果数据存在,则不执行保存操作。
命令格式如下
hsetnxkeyfieldvalue
代码示例如下
#将id为101的商品独立存起来hsetnxinfo101"{\"name\":\"goodsname\"}"4.1. 用hash实现抢购
案例:双 11 活动日,销售手机充值卡的商家对移动、联通、电信的 30 元、50 元、100 元商品推出抢购活动,每种商品的抢购上限为 100。
解决方案
以商家 id 作为 key
将参与抢购的商品作为 field
将参与抢购的商品数量作为对应的 value
抢购时使用降值的方式控制产品数量
实际业务中还有超卖等实际问题,这里不做讨论
实现过程
商品初始信息
#p01商家下,c30充值券1000张,c50充值券1000张,c100充值券1000张hmsetp01c301000c501000c1001000
当 c30 售出1件时,值减 1; 当 c100 售出 20 件时,值减 20,如下代码
#p01商家,商品c30售出1件hincrbyp01c30-1#p01商家,商品c100售出20件hincrbyp01c100-205. string 存对象对比 hash 存对象
string 存储 json 字符串:读取方便,在更新的时候会整体进行更新
hash 存对象具体的字段:更新灵活
引入 hash 数据类型之后,我们就解决了 string 存储对象,更新对象时需要整体更新的问题。
以上是“redis中的hash数据类型怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。