目录
一.hash数据类型
1.存储的困惑
对象类数据的存储如果具有较频繁的更新需求,如果用String类型操作会比较笨重
相比于存储json字符串hash表更容易更改
2.hash类型
新的储存需求:对一系列储存数据进行编组,方便管理 典型的应用是:存储对象信息
需要的存储结构:一个存储空间保存多个键值对数据
redis存储空间
3.hash 存储结构的优化
如果field数量较少,存储结构优化为数组结构
如果field数量较多,存储结构优化使用hashmap结构
二.hash类型数据的相关操作
(一)hash类型数据的基础操作
1.添加/修改数据
hset key field value
2.获取数据
hget key field
hgetall key
3.删除数据
hdel key field1 [field2]
4.批量增加/修改数据
hmset key field1 value1 field2 value2
5.获取多个数据
hmget key field1 field2
6.获取哈希表中的字段数量
hlen key
(二)hash类型数据扩展操作
1.获取哈希表种所有的字段名或者字段值
hkeys key
hvals key
2.设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment
指定字段数值增加或减少
(三)hash类型数据操作的注意事项
1.hash类型下的value只能存储字符串,不能存储其他数据类型,不存在嵌套类型,如果数据未获取到,对应的值为nil
(1)value 只是存储字符串,不要想着能够嵌套再放进去一个哈希表进去
(2)数据未取到对应值为nil
2.每个hash表都可以存储2^32 -1个键值对
3.hash类型十分贴近对象的数据类型,并且可以灵活的添加删除对象的属性,但hash设计的初衷不是为了储存大量对象
切不可滥用,更不可将hash作为对象列表使用
4.hgetall操作可以获得全部 属性,如果内部field过多,遍历整体效率过低,可能成为数据瓶颈
三.hash类型的电商网站购物车应用场景
1.业务场景
电商网站购物车的设计与实现
取值:hget
增加:hincrby
添加:hset
全选:hget
删除:hdel
总量:hlen
2.业务分析:
1.仅分析购物车的redis存储模型
添加,浏览,更改,删除,清空
解决方案:
1.以客户id作为key,每位客户创建一个hash存储结构存储对应的购物车信息
2.将商品编号作为field,购买数量作为value进行存储
3.添加商品:追加新的field和value
4.浏览:遍历hash
5.更改数量:自增自减设置value值
6.删除商品:删除field
7.情况:删除key
3.存在问题:
当前仅仅是将数据存储到了redis中,并没有起到加速作用,商品信息还需要再一次查询数据库
1.每条购物车中的商品记录保存成两条field
2.field 1专门用于保存购买数量 命名格式:商品id:nums
3.field 2 专用于保存购物车中显示的信息,包含文字描述,图片地址,所属商家的信息
命名格式: 商品id :info
保存数据 json
根据商品id 在redis中建立关联关系
4. hsetnx key field value
Redis Hsetnx 命令用于为哈希表中不存在的的字段赋值 。
如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
如果字段已经存在于哈希表中,操作无效。
如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令
四.hash实现抢购的业务场景
1.业务场景
双十一活动,销售手机充值卡的商家,对移动联通,电信的30元,50元,100元商品推出抢购活动,每种商品抢购上线1000张
2.模型设计
1.以商家id为key
2.将参与抢购的商品id作为field
3.将参与抢购的商品数量作为对应的value
4.抢购时通过降值的方式控制产品数量
实际业务中还存在超卖等问题,这里不做特别讨论
原则上 :redis 只是作为数据存储,不要将redis 加入业务逻辑层会导致不合理
比如判断key是否存在
tips 5 :
redis应用于抢购,限购类,限量发放优惠券,**码等业务上的数据存储设计
String存储对象 | Java存储对象 |
json格式 | key value形式 |
讲究整体性一读取为主,修改需要全部取出 | 隔离性好,更新操作比较好 |
面对hash模型.将一系列数据包装成一个群组,对外通过一个key
hash 中也可以存储json格式,可以做成表的概念,主要考虑业务模式