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+jsonhash
效率很高
容量
灵活性
序列化简单复杂

当对象的某个属性需要频繁修改时,不适合用string+json,因为它不够灵活,每次修改都需要重新将整个对象序列化并赋值,如果使用hash类型,则可以针对某个属性单独修改,没有序列化,也不需要修改整个对象。比如,商品的价格、销量、关注数、评价数等可能经常发生变化的属性,就适合存储在hash类型里。

 综上,一般对象用string + json存储,对象中某些频繁变化的属性抽出来用hash存储。例如用户信息,金额,积分的变化字段,使用hash存储更灵活。