hash

基本操作

(1)存入数据 hmset key field1 value1 field2 value2…

(2)读取数据 hmget key field1 fisld2…

(3)获取哈希表中的字段 hlen key

(4)判断是否含有某个字段 hexist key field

(2)获取所有的字段名或字段值 hkeys key

hvals key

(3)设置指定字段的数值数据增加指定范围的值

hincrby key field increment

hincrbyfloat key field increment

注意事项:

hash类型下的value只能存储字符串,不允许再存储其他的数据结构,不能再嵌套

每个hash也是有存储上限的,为2的32次方-1个键值对

hash虽然与存储类对象类似,但是切不可将hash等于类对象的存储,更不可将hash作为对象列表来使用

hgetall可以查询某个键的全部值,但是如果内部的field过多的话,还是建议一个一个的取出来,因为遍历整体数据效率十分低下

应用场景实例:

1.电商购物车

很容易想到的就是将用户的id作为我们存储数据时的key并将商品的数量以hash的数据形式存储进来,大致是如下的结构hmset user:id001 good1:num 100 good2:num 200…

这样我们就能将购物车的信息存储但是如果我们再仔细检查思考之后就能发现其实仍然不完整,这其中我们只存储了商品的数量,但是商品信息并没有存储进来,所以我们还需要改进可以通过json的数据形式而非数据结构来存储商品的信息大致结构如下

hmset user:id001 good1:num 100 good1:info {name:water,size:600ml} good2:num 200 good2:info {name:shirt,size:XL}…

这样的形式来进行存储,但是这样真的使得查询变得高效了吗,假设每个用户都购买了good1,只是商品数量不一样而已,但是每次都会将商品的信息都查询一次,显然这样也是不行的,所以我们可以选择将商品信息单独列成一个库来进行存储,这样每次查询的时候,如果内存中已经有了相应商品的信息,就不会在重复查询了

2.商家的抢购活动

这里比方说有很多商家分别推出多种商品来供顾客进行抢购。

我们可以考虑将商家作为key,将商品作为其中的field,将商品的数量作为value来进行实现大致结构如下:

hmset shangjia1 good1 100 good2 200…之后我们通过hincrby指令来实现商品的抢购,比如;

hincrby shangjia1 good1 -1这样即实现商品的抢购操作。其实还应该考虑货已经卖完了,不能再卖的情况,但是这种业务逻辑一般在编程的时候实现,不应在数据层进行编写。