Redis 入门到精通(一)数据类型(2)
一、redis 数据类型–hash 类型介绍与基本操作
1、hash 类型
- 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息。
- 需要的存储结构:一个存储空间保存多个键值对数据。
- hash 类型:底层使用哈希表结构实现数据存储。
2、hash 存储结构优化
- 如果 field 数量较少,存储结构优化为类数组结构。
- 如果 field 数量较多,存储结构使用HashMap结构。
3、hash 类型数据的基本操作
# 1)添加/修改数据
hset key field value
# 获取数据
hget key field
hgetall key
# 删除数据
hdel key fieldl [field2]
# 范例:
127.0.0.1:6379> hset zsf name zhangsanfeng
(integer) 1
127.0.0.1:6379> hset zsf age 101
(integer) 1
127.0.0.1:6379> hset zsf weight 80
(integer) 1
127.0.0.1:6379> hget zsf age
"101"
127.0.0.1:6379> hgetall zsf
1) "name"
2) "zhangsanfeng"
3) "age"
4) "101"
5) "weight"
6) "80"
127.0.0.1:6379>
# 2)添加/修改多个数据
hmset key fieldl valuel field2 value2
# 获取多个数据
hmget key fieldl field2...
# 获取哈希表中字段的数量
hlen key
# 获取哈希表中是否存在指定的字段
hexists key field
# 范例:
127.0.0.1:6379> hmget zsf name age
1) "zhangsanfeng"
2) "101"
127.0.0.1:6379> hmset zsf name lixiaolong age 38
OK
127.0.0.1:6379> hgetall zsf
1) "name"
2) "lixiaolong"
3) "age"
4) "38"
5) "weight"
6) "80"
127.0.0.1:6379>
127.0.0.1:6379> hlen zsf
(integer) 3
127.0.0.1:6379> hexists zsf age
(integer) 1
127.0.0.1:6379> hexists zsf hight
(integer) 0
127.0.0.1:6379>
二、redis 数据类型–hash 扩展操作与使用注意事项
1、hash 类型数据扩展操作
# 获取哈希表中所有的字段名或字段值
hkeys key
hvals key
# 设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment
# 范例:
127.0.0.1:6379> hkeys zsf
1) "name"
2) "age"
3) "weight"
127.0.0.1:6379> hvals zsf
1) "lixiaolong"
2) "38"
3) "80"
127.0.0.1:6379> hset zsf weight 38
(integer) 0
127.0.0.1:6379> hvals zsf
1) "lixiaolong"
2) "38"
3) "38"
127.0.0.1:6379> hincrby zsf age 2
(integer) 40
127.0.0.1:6379>
2、hash 类型数据操作的注意事项
- hash 类型下的 value 只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到对应的值为(nil)。
- 每个 hash 可以存储 232 - 1 个键值对。
- hash 类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用。
- hgetal 操作可以获取全部属性,如果内部 field 过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈。
三、redis 数据类型–hash 实现购物车
1、hash 类型应用场景:业务场景–电商网站购物车设计与实现
1)业务分析
- 仅分析购物车的 redis 存储模型添加、浏览、更改数量、删除、清空。
- 购物车于数据库间持久化同步(不讨论)。
- 购物车于订单间关系(不讨论 )。
提交购物车:读取数据生成订单。
商家临时价格调整:隶属于订单级别。 - 未登录用户购物车信息存储(不讨论)。
cookie 存储。
2)解决方案
- 以客户 id 作为 key,每位客户创建一个 hash 存储结构存储对应的购物车信息。
- 将商品编号作为 field,购买数量作为 value 进行存储。
- 添加商品:追加全新的 field 与 value。
- 浏览:遍历 hash。
- 更改数量:自增/自减,设置 value 值。
- 删除商品:删除 field。
- 清空:删除 key。
- 此处仅讨论购物车中的模型设计。
- 购物车与数据库间持久化同步、购物车与订单间关系、未登录用户购物车信息存储不进行讨论。
2、redis 实际模拟操作:
# 如:用户01,购买商品g01, 100个,购买商品g02,200个
127.0.0.1:637