Redis学习_2_数据类型_2_hash

关于hash

上一节我们有提到string的一个命名规范:“表名:主键名:主键值:字段名”,用这样一个命名,我们可以较为清晰的知道这个key对应的value是一个什么东西,但是对于实际的应用场景中,我们肯定有多个对象,不同的对象都有不同的的属性,如果全部都采用string来存储,那么key将会很多,而hash则能够避免这种情况。下面看一下hash的结构:
在这里插入图片描述
key是user,右边那一大坨就是我们这次新学的数据类型:hash,hash的内部其实也是一个key-value的结构,只不过hash的key叫“field”,了解Java的话应该可以一眼看出来,这不就是个Map嘛,从redis的角度来看,就像是redis里面套了一个redis(禁止套娃!//手动狗头)

hash的底层是使用hash表结构来存储的数据,当field较少时,存储结构会优化成一个类数组结构,field数量较多时,会用HashMap的结构存储。

hash基本操作介绍

  • 添加/修改数据:hset key field value,如hset user name Jam
  • 获取单条数据:hget key field,如hget user name
  • 获取所有数据:hgetall key,如hgetall user
  • 删除数据:hdel key field1 [field2],如hdel user name
  • 添加/修改多个数据:hmset key field1 value1 field2 value2 ...,如hmset user name Jam age 22
  • 获取多个数据:hmget key field1 field2 ...,如hmget user name age
  • 获取hash中field数量:hlen key,如hlen user
  • 获取hash中是否存在指定field:hexists key field,如hexists user name

hash扩展操作介绍

  • 获取hash中所有field:hkeys key,如hkeys user
  • 获取hash中所有value:hvals key,如hvals user
  • 设置指定field的数值value增加指定的整数值:hincrby key field increment,如hincrby user age 1
  • 设置指定field的数值value增加指定的小数值:hincrbyfloat key field increment,如hincrbyfloat user weight -10.8
  • 不存在数据时才保存:hsetnx key field value,如hsetnx user name Tom

hash注意事项

  • hash类型的value只能存string,不能再存其他数据类型,禁止套娃!如果没有数据,就是nil。
  • 每个hash可以存储223-1个键值对。
  • hash的类型看起来很像对象的存储,但是hash设计的初衷并不是用来存储对象的,不要滥用!!!不能将hash作为对象列表使用!!!
  • hgetall操作可以获取全部的属性,如果内部field过多,整体遍历效率会很低,可能会成为数据访问的瓶颈。

hash的应用_1_购物车

首先我们分析下目前主流购物软件的购物车:

  • 购物车与用户有关,一个用户一个购物车
  • 购物车中有0到多个商品
  • 每个商品的数量是1到多个

根据这3点,我们可以得到一个hash的结构:key是用户id,hash中field是商品id,value是商品对应的数量。在这里插入图片描述

不过这个设计有一个问题,field是商品id,但是我们平常的购物车里还会显示商品信息,而我们这个hash的结构中并没有商品的信息,如果需要看这些信息,我们就需要2次查表,这不得行,那我们就需要把商品信息也存进来,稍微修改一下hash的结构。在这里插入图片描述
这个结构里,我们就可以解决需要2次查表的问题,不过仔细看一下,这个只是对于一个用户来说的购物车,如果还有其他肥宅,他们也喜欢薯片和可乐,那他们的购物车也要存一份商品信息,那这样算下来,商品信息将会有大量的重复。
怎么办呢?当然是把这些公共信息提取出来,做一个专门存商品信息的hash,那这样的话,我们的购物车又只要存商品数量了,又回到了前一个版本。
不过这个专门存商品信息的hash有一点需要注意下,我们是一开始就把所有商品信息都存进来吗?NoNoNo,像淘宝这样的电商平台,这么多商品一下存进来,这不得原地爆炸,我们当然只在加入购物车的时候把对应的商品信息存进来,那这样也有一个地方要注意,你加一个可乐到购物车,我也加一个可乐到购物车,我在你后面把可乐加入购物车的时候,就不应该再存一次可乐的商品信息到redis了(虽然再存一次也只是把前面的覆盖),这里我们就要用到那个扩展操作了,没错,就是他!hsetnx key field value,不存在这个商品的时候才保存。
到这里,模拟购物车的结构就差不多介绍完了,下面介绍下抢购。

hash的应用_2_抢购

上面介绍的购物车是站在消费者的角度,下面我们在商家的角度看一看抢购的问题:
某一个可乐旗舰店准备做一个活动,其中焦糖可乐、樱桃味可乐、香草味可乐参与限量抢购,每种口味限量10000瓶。在这里插入图片描述
其实看到这个应该大概就知道这个hash是个什么结构了:在这里插入图片描述
抢购的操作呢,其实也很简单,用hincrby key field increment就行,当然,要注意数量,买完就没了,这个具体的判断数量的业务逻辑就不再赘述了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值