redis基本数据类型之hash
1.存储的困惑
对象类型数据的存储如果具有较频繁的更新需求操作会显得笨重
3.hash类型
- 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
- 需要的内存结构:一个存储空间保存多少个键值对数据
- hash类型:底层使用哈希表结构实现数据存储
3.hash的基本操作
1.添加修改数据
hset key field value
2. 获取数据
hget key fidle
hgetall key
3. 删除数据
hdel key field1 [field2]
4.hash类型数据扩展操作
1. 获取hash中所有的字段名或者字段值
hkeys key
hvals key
2. 设置指定字段的数值整加指定范围的值
hincrby key field increment
hincrbyfloat key field increment
5.hash 类型数据的操作注意事项
- hash类型下的value只能存储字符串,不允许存储其他类型数据,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
- 每个hash类型可以存储2^32 -1个键值对
- hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
- hgetall操作可以获取key对应哈希类型所有的field以及value,如果内部field过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈,所以一般建议用哪个取哪个,不建议hgetall全部获取
6.hash 类型的应用场景
电商网站的购物车设计与实现
解决方案
- 以用户id作为key,每位客户创建一个hash存储的结构存储对应的购物车信息
- 将商品编号作为field,购物数量作为value进行存储
- 添加商品,追加全新的field和value
- 浏览 遍历hash
- 更新数量 自整/自减 设置value
- 删除商品 删除field
- 清空 删除key
当前设计是否加速了购物车的呈现?
- 当前仅仅是将数据存储到redis中,还需要通过磁盘IO查询数据库,用商品id查询出商品的描述信息,然后将得到的数据传给前端显示给用户,并没有起到加速的作用
- 我们用如下方式解决,不经过磁盘IO查询数据库,所有的数据都存放在redis
避免重复存放商品信息
我们将商品描述信息独立存储成一个hash类型,就不会重复存储了,用户存储商品id,就能通过商品id在redis中查找商品信息。商品被购买了,就要到这个hash存储中添加信息
那每次买东西都添加商品信息,这不也会重复吗?我们使用hsetnx,已经添加过的商品(field)就不会再添加,相当于hexists + hset
hsetnx :key对应的hash类型中,有field就不修改value,没有field就设置为value
hset:key对应的hash类型中,无论有没有field,都设置为value
商品信息用
hsetnx key field value
业务场景2
双11活动日,销售手机充值卡的商家对移动、联通、电信的30元、50元、100元商品推出抢购活动,每种商品抢购上限1000张
redis只做数据的修改和保存,尽量不要把业务相关的操作放在redis上,比如判断是否存在等
string存储对象(json)与hash存储对象的区别:string存储对象讲究整体性,要么一次性更新,要么一次性获取,以读为主;hash存储可以把属性用field隔离开,比较灵活,便于修改