Hash是一个键值对的集合。Hash 是一个 String 类型的 field(字段) 和 value(值) 的映射表,hash特别适合用于存储对象。
- hash⽤于存储对象,对象的结构为属性、值
- 值的类型为string
Hash存储结构优化:
- 如果field数量较少,存储结构优化为类数组结构
- 如果field数量较多,存储结构使用HashMap结构
使用场景:
- 购物车
- 存储对象
【应用:如购物车内某个宝贝的所有属性】 【help hset】
1、增加、修改
1.1 设置单个属性
给key集合中的field赋值value。
hset key field value
设置键 user
的属性name
为dgw
hset user name dgw
注意:
- 如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
- 如果字段已经存在于哈希表中,旧值将被重写。
1.2 设置多个属性
批量设置哈希的字段及值。
hmset key field1 value1 field2 value2 ...
设置键u2
的属性name
为zhangsan、属性age
为35
hmset u2 name zhangsan age 35
【再用 hset u2 name lisi --> 即为更新】
2、获取
2.1 获取指定键所有的属性
hkeys key
获取键userinfo的所有属性:
2.2 获取⼀个属性的值
从key哈希中,取出field字段的值。
hget key field
获取键u2
属性name
的值
hget u2 name
2.3 获取多个属性的值
hmget key field1 field2 ...
例5:获取键u2
属性name
、age
的值
hmget u2 name age
2.4 获取所有属性的值
获取该哈希中所有的value。
hvals userinfo
2.5 获取所有的键和值:
hgetall userinfo
2.6 获取键值对的个数
hlen userinfo
2.7 判断key中是否包含field(包含:1,不包含:0)
hexists key field
注意:
- 如果哈希表含有给定字段,返回 1 。 如果哈希表不含有给定字段,或 key 不存在,返回 0 。
2.8 hincrby用法
为哈希表key中的field字段的值加上增量increment。
给userinfo中的age加3(必须是数字):
hincrby userinfo age 3
注意:
- 增量也可以为负数,相当于对指定字段进行减法操作。
- 如果哈希表的 key 不存在,一个新的哈希表被创建并执行 hincrby 命令。
- 如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。
- 对一个储存字符串值的字段执行 hincrby 命令将造成一个错误。
2.9 hincrbyfloat用法
给userinfo中的age加2.5(可以加浮点数):
hincrbyfloat userinfo age 2.5
2.10 hsetnx用法
给key哈希表中不存在的的字段赋值 。
如果 field 不存在才设置,否则失败。
hsetnx user id 2
注意:
- 如果哈希表不存在,一个新的哈希表被创建并进行 hsetnx 操作。
- 如果字段已经存在于哈希表中,操作无效。
- 如果 key 不存在,一个新哈希表被创建并执行 hsetnx 命令。
3、删除
- 删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。
- 删除整个hash键及值,使⽤hdel命令
-
删除属性,属性对应的值会被⼀起删除
hdel key field1 field2 ...
删除键userinfo中的属性sex:
hmset userinfo name dgw age 26 sex '男'
hdel userinfo sex
hkeys userinfo
4、可能出现的错误
MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
Redis被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用
- 原因:
- 强制关闭Redis快照导致不能持久化。
- 解决方案:
- 运行config set stop-writes-on-bgsave-error no 命令后,关闭配置项stop-writes-on-bgsave-error解决该问题。