hash

存储的困惑

对象类数据的存储如果具有较频繁的更新需求操作会显得笨重

graph LR
        subgraph JSON格式
        user:0079-->id:0079,blogs:34,fans:2234,focuss:56
        end
        subgraph 主键和属性值作为key
        id1[unser:id:0079]-->fans:2337
        id2[unser:id:0079]-->blogs82
        id3[unser:id:0079]-->focuss32
        end

因为当为$JSON$时,虽然创建与删除信息较简单,但修改信息会很困难,而为主键值时,修改虽然很简单,但创建与删除却很麻烦,所以我们就像对其进行一下修改

graph LR
        subgraph key
        id1[unser:id:0079]
        end
        id1-->id2
        subgraph hash存储空间
        subgraph field
        ida[name]
        id2[fans]
        id3[blogs]
        end
        subgraph value
        YQHP-YuKi
        2236
        35
        end
        ida-->YQHP-YuKi
        id2-->2236
        id3-->35
        end
hash类型
  • 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
  • 需要的存储结构:一个存储空间保存多个键值对数据
  • $hash$类型:底层使用哈希表结构实现数据存储

$hash$存储结构优化

  • 如果$field$数量较少,存储结构优化为类数组结构
  • 如果$field$数量较多,存储结构使用$HashMap$结构
hash数据类型的基本操作
  • 添加/修改数据
hset key field value

例:

127.0.0.1:6379> hset user name YQHP-YuKi
(integer) 1
127.0.0.1:6379> hset user age 20
(integer) 1
127.0.0.1:6379> hset user weight 83
(integer) 1
  • 获取数据
hget key field
hgetall key

例:

127.0.0.1:6379> hget user name
"YQHP-YuKi"
127.0.0.1:6379> hget user weight
"83"
127.0.0.1:6379> hgetall user
1) "name"
2) "YQHP-YuKi"
3) "age"
4) "20"
5) "weight"
6) "83"
  • 删除数据
hdel key field1 [field2]...

例:

127.0.0.1:6379> hdel user weight
(integer) 1
127.0.0.1:6379> hgetall user
1) "name"
2) "YQHP-YuKi"
3) "age"
4) "20"
  • 添加/修改多个数据
hmset key field1 value1 field2 value2 ...

例:

127.0.0.1:6379> hmset user name XP age 20 weight 70
OK
  • 获取多个数据
hmget key field1 field2...

例:

127.0.0.1:6379> hmget user name weight
1) "XP"
2) "70"
  • 获取哈希表中字段的数量
hlen key

例:

127.0.0.1:6379> hlen user
(integer) 3
  • 获取哈希表中是否存在指定的字段
hexists key filed

例:

127.0.0.1:6379> hexists user name
(integer) 1
127.0.0.1:6379> hexists user height
(integer) 0
hash数据类型的扩展操作
  • 获取哈希表中所有的字段名或字段值
hkeys key
hvals key

例:

127.0.0.1:6379> hgetall user
1) "name"
2) "XP"
3) "age"
4) "20"
5) "weight"
6) "70"
127.0.0.1:6379> hkeys user
1) "name"
2) "age"
3) "weight"
127.0.0.1:6379> hvals user
1) "XP"
2) "20"
3) "70"
  • 设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment

例:

127.0.0.1:6379> hincrby user age 1
(integer) 21
hash数据类型操作的注意事项
  • $hash$类型下的$value$只能存储字符串,不允许存储其他数据类型,不存在嵌套现象,如果数据未获取到,对应的值为(nil)
  • 每个$hash$可以存储$2^32-1$个键值对
  • $hash$类型十分贴近对象的数据存储形式,并且可以灵活添加或删除对象属性,但$hash$设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将$hash$作为对象列表使用
  • $hgetall$操作可以获取全部属性,如果内部$field$过多,遍历整体数据效率就会很低,有可能成为数据访问的瓶颈
Last modification:March 28th, 2021 at 11:33 am