Redis的hash类型的应用场景
一、概述
hash类型是一个string类型的field和value的映射表,每个 hash 可以存储 232 - 1 键值对(40多亿),hash类型主要有以下应用场景。
二、常用命令
- hset user id 1向 user(map) 中添加 key-value 对(id,1):
- hget user id 获取 user 中的 id 所对应的值:
- hmset user name lijun sex man 设置多个key-value对:
- hmget user name sex 获取多个key:
- hgetall user 获取user中所有的key-value对:
- hdel user sex 删除map中的sex:
- hlen user 获取user中的key-value对的个数:
- hexists user id 判断user中是否包含id属性(1:包含,0:不包含)
- hkeys user 返回user中所有的key:
- hvals user 返回user中所有的values:
- hincrby user id 4 给user中的id加4(必须是数字):
- hincrbyfloat user id 2.5 hincrbyfloat可以增加浮点数:
- hsetnx user id 2 如果id不存在才设置,否则失败:
三、应用场景
1、购物车
以用户id为key,商品id为field,商品数量为value,恰好构成了购物车的3个要素,如下图所示。
2、存储对象
hash类型的(key, field, value)的结构与对象的(对象id, 属性, 值)的结构相似,也可以用来存储对象。
在介绍string类型的应用场景时有所介绍,string + json也是存储对象的一种方式,那么存储对象时,到底用string + json还是用hash呢?
两种存储方式的对比如下表所示。
string + json | hash | |
效率 | 很高 | 高 |
容量 | 低 | 低 |
灵活性 | 低 | 高 |
序列化 | 简单 | 复杂 |
当对象的某个属性需要频繁修改时,不适合用string+json,因为它不够灵活,每次修改都需要重新将整个对象序列化并赋值,如果使用hash类型,则可以针对某个属性单独修改,没有序列化,也不需要修改整个对象。比如,商品的价格、销量、关注数、评价数等可能经常发生变化的属性,就适合存储在hash类型里。
当然,不常变化的属性存储在hash类型里也没有问题,比如商品名称、商品描述、上市日期等。但是,当对象的某个属性不是基本类型或字符串时,使用hash类型就必须手动进行复杂序列化,比如,商品的标签是一个标签对象的列表,商品可领取的优惠券是一个优惠券对象的列表(如下图所示)等,即使以coupons(优惠券)作为field,value想存储优惠券对象列表也还是要使用json来序列化,这样的话序列化工作就太繁琐了,不如直接用string + json的方式存储商品信息来的简单。
综上,一般对象用string + json存储,对象中某些频繁变化的属性抽出来用hash存储。