redis基本数据类型之hash

1.存储的困惑

对象类型数据的存储如果具有较频繁的更新需求操作会显得笨重

redis hash 嵌套 redis使用hash存储_数据库

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 类型的应用场景

电商网站的购物车设计与实现

redis hash 嵌套 redis使用hash存储_redis_02

解决方案

  • 以用户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 hash 嵌套 redis使用hash存储_数据库_03


redis hash 嵌套 redis使用hash存储_hg_04

redis只做数据的修改和保存,尽量不要把业务相关的操作放在redis上,比如判断是否存在等

string存储对象(json)与hash存储对象的区别:string存储对象讲究整体性,要么一次性更新,要么一次性获取,以读为主;hash存储可以把属性用field隔离开,比较灵活,便于修改