Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 – 1 键值对(40多亿)。
127.0.0.1:6379> HSET user:1 name chris age 20 mobile 13000000000 //可以set 一个或多个 field-value
(integer) 3
127.0.0.1:6379> HSETNX user:1 name hah //不存在则设置,存在则不成功
(integer) 0
127.0.0.1:6379> hget user:1 name //get一个field
"chris"
127.0.0.1:6379> hmget user:1 name age mobile //get多个field
1) "chris"
2) "20"
3) "13000000000"
127.0.0.1:6379> HGETALL user:1 //获取所有数据 field-value
1) "name"
2) "chris"
3) "age"
4) "20"
5) "mobile"
6) "13000000000"
127.0.0.1:6379> HKEYS user:1 //获取key所有的field
1) "name"
2) "age"
127.0.0.1:6379> HVALS user:1 //获取key所有的value
1) "chris"
2) "20"
======================================
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "chris"
3) "age"
4) "20"
5) "mobile"
6) "13000000000"
127.0.0.1:6379> hdel user:1 mobile //删除一个field
(integer) 1
======================================
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "chris"
3) "age"
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "chris"
3) "age"
4) "20"
127.0.0.1:6379> HINCRBY user:1 age 1 //加
(integer) 21
127.0.0.1:6379> HINCRBY user:1 age -2 //负数会减
(integer) 19
======================================
HSCAN key cursor [MATCH pattern] [COUNT count]//迭代哈希表中的键值对。
cursor - 游标。
pattern - 匹配的模式。
count - 指定从数据集里返回多少元素,默认值为 10 。
127.0.0.1:6379> HSCAN user:1 0
1) "0"
2) 1) "name"
2) "chris"
3) "age"
4) "20"
127.0.0.1:6379> HSCAN user:1 0 match "a*"
1) "0"
2) 1) "age"
2) "20"
总结:
是一个 string 类型的 field(字段) 和 value(值) 的映射表
适合用于存储经常变更的数据, 对象信息等存储(用户信息等)。
应用场景
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类型里。
综上,一般对象用string + json存储,对象中某些频繁变化的属性抽出来用hash存储。例如用户信息,金额,积分的变化字段,使用hash存储更灵活。