我们先来看这个例子
在上一节我们一起了解了 string 存储类型。但是如果是对象数据的存储具有较频繁的更新需求,操作会显得笨重。例如:user:id:100 -> {"id":100,"name":"春晚","fans":12355,"blogs":99,"focus:83}
,如果需要更新一个对象中的局部数据,就需要替换掉所有数据,于是有了以下的需求
新的需求:对一系列存储的数据进行编组,方便管理,比如存储一个对象的信息 需要的存储结构:一个存储空间保存多个键值对数据
如下图:
为了解决这个问题,我们引入新的数据类型:hash
。同时 hash 存储结构也做了以下优化
本文是该系列文章的第五篇,你可以通过下列链接阅读往期的篇章:
redis入门知识第4篇-redis中的string数据类型与数据存取操作
hash 类型数据操作注意事项
概述
在这里我们不讨论购物车与数据库间的持久化同步,也不讨论购物车与订单之间的关系,同时忽略未登录用户购物车信息存储。我们仅仅用 redis 的存储模型来 对购物车 的条目进行 添加、浏览、更改数量、删除、清空
实现方案
示例代码如下:
商品信息加速
当前仅仅是将数量存储到 redis 中,并没有起到加速作用,因为商品信息还需要查询数据库。可以使用以下方案解决:
每条购物车中的商品信息记录保存为两个 field
命名格式:商品 id:nums 保存数据:数值
命名格式:商品 id:info 保存数据:json
示例代码如下:
在上面的101:info
对应的值中,字符串包含了空格,所以用双引号引用起来,达到转义的目的。
商品信息独立保存
由于 field2 可能在多条商品记录中存在,因此 field2 里的数据可保存到独立的 hash。此时,如果每添加一条购物车记录,就保存一次 hash 数据,显然是不合理的,可以通过hsetnx
操作来保存数据,如果数据存在,则不执行保存操作。
命令格式如下
代码示例如下
案例:双 11 活动日,销售手机充值卡的商家对移动、联通、电信的 30 元、50 元、100 元商品推出抢购活动,每种商品的抢购上限为 100。
解决方案
实现过程
商品初始信息
当 c30 售出1件时,值减 1;当 c100 售出 20 件时,值减 20,如下代码
引入 hash 数据类型之后,我们就解决了 string 存储对象,更新对象时需要整体更新的问题。