Redis本身就是使用哈希表来进行KV存储,Value的类型为哈希的话就相当于哈希表的嵌套,即:哈希表的每个位置又是一个哈希表。
为了与Redis本身的键值对名字冲突,哈希类型的value中的键不叫key而叫field。
添加字段
sql
HSET key [f1 v1 f2 v2 ...] //创建一个hash类型的键值对并在其中添加/修改若干个字段
字段不存在则新增
字段已存在会覆盖
key 不存在会自动创建
返回值:本次新增字段个数
HSETNX [key] [f] [v] //如果key不存在才设置,不支持一次性添加若干个field
获取字段值
sql
HGET [k] [f] //获取哈希表中单个字段的值
k指明是哪个键值对中的value
f指明是value中的哪个field对应的值
key 不存在或字段不存在,返回 nil
判断字段是否存在
sql
HEXISTS key field //判断哈希表中的某字段是否存在
存在返回 1
不存在或 key 不存在返回 0
删除字段
sql
HDEL key f1 f2 ... //删除key对应的哈希表的若干个字段
不存在的字段自动忽略
返回值:成功删除字段个数
删除完所有字段后,key 自动消失
查询字段
sql
HMGET [key] [f1,f2 ... ...] //查询key对应的value中的若干个field对应的value
HKEYS [key] //查询key对应的value的所有field
HVALS [key] //查询key对应的value的所有field对应的value
hgetall [key] //查询key对应的value的所有键值对
获取字段的数量
sql
HLEN [key] //返回key对应的value中的键值对的数量
key 不存在返回 0
字段值整数递增
sql
HINCRBY [key] [f] [n] //把key对应的value中的field对应的value增/减 n
字段不存在自动初始化为 0 再计算
必须是整数,返回计算后的结果
HINCRBYFLOAT 字段值浮点数递增
sql
HINCRBYFLOAT [key] [f] [n] //把key对应的value中的field对应的value增/减 n
字段不存在自动初始化为 0
返回计算后的浮点结果
哈希类型的应用场景
对于存储关联信息来说,哈希类型比较好。如果用String存Json对象,每次差某个值还需要反序列化,效率比较低;如果一个信息对应一个映射关系,耗费内存并且内聚性差。
