Redis 键值对和哈希类型二者的关系:

image.png

2.3.1 命令

(1) 设置值

  • hset
  • hsetnx

(2) 获取值

  • hget

(3) 删除 field

  • hdel

(4) 计算 field 个数

  • hlen

(5) 批量设置或获取 field-value

  • hmget
  • hmset

(6) 判断 field 是否存在

  • hexists

(7) 获取所有 field

  • hkeys

(8) 获取所有 value

  • hvals

(9) 获取所有的 field-value

  • hgetall

渐进式遍历哈希: hscan

(10) hincrby hincrbyfloat

(11) 计算 value 的字符串长度 (需要 Redis3.2 以上)

  • hstrlen

image.png

2.3.2 内部编码

哈希类型的内部编码有两种:

  • ziplist

当哈希类型元素个数小于 hash-max-ziplist-entries 配置 (默认512个)、同时所有值都小于 hash-max-ziplist-value配置 (默认64字节)时, Redis 会使用 ziplist 作为哈希的内部实现, ziplist 使用更加紧凑的结构实现多个元素的连续存储, 所以在节省内存方面比 hashtable 更加优秀。

  • hashtable

当哈希类型无法满足 ziplist 的条件时, Redis 会使用 hashtable 作为哈希的内部实现, 因为此时 ziplist 的读写效率会下降, 而 hashtable 的读写时间复杂度为 O(1)。

2.3.3 使用场景

image.png

在 Redis 中保存的格式类似对象形式:

image.png

相比于使用字符串序列化缓存用户信息, 哈希类型变得更加直观, 并且在更新操作上会更加便捷。
**
哈希类型和关系型数据库的不同之处:

  • 哈希类型是稀疏的, 而关系型数据库是完全结构化的, 例如哈希类型每个键可以有不同的 field, 而关系型数据库一旦添加新的列, 所有行都要为其设置值 (即使为 NULL)

image.png

  • 关系型数据库可以做复杂的关系查询, 而 Redis 去模拟关系型复杂查询开发困难, 维护成本高