Redis 键值对和哈希类型二者的关系:
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
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 使用场景
在 Redis 中保存的格式类似对象形式:
相比于使用字符串序列化缓存用户信息, 哈希类型变得更加直观, 并且在更新操作上会更加便捷。
**
哈希类型和关系型数据库的不同之处:
- 哈希类型是稀疏的, 而关系型数据库是完全结构化的, 例如哈希类型每个键可以有不同的 field, 而关系型数据库一旦添加新的列, 所有行都要为其设置值 (即使为 NULL)
- 关系型数据库可以做复杂的关系查询, 而 Redis 去模拟关系型复杂查询开发困难, 维护成本高