【Redis】hash类型
目录
- 1、介绍
- 2、底层实现
- 【1】压缩列表
- 【2】哈希表
- 【3】压缩列表和哈希表对比
- 【4】listpack(Redis7.0+使用)
- 3、常用指令
- 4、使用场景
1、介绍
Redis的hash是一种键值对集合类型,用于存储对象或结构化数据。其核心特点就是将多个字段(field)与值(value)映射到同一个键(key)下,适用于存储具有多个属性的实体。
2、底层实现
【1】压缩列表
适用条件
1、字段数量 ≤ hash-max-ziplist-entries(默认512)
2、每个字段名和值的字符串长度 ≤ hash-max-ziplist-value(默认64字节)
【2】哈希表
适用条件
任一字段或值超过长度限制,或字段总数超过阈值时
【3】压缩列表和哈希表对比
特性 | 压缩列表 | 哈希表 |
---|---|---|
内存占用 | 极低(连续存储、无指针开销) | 较高(需存储指针、链表节点等元数据) |
查询效率 | 平均O(n)(需遍历) | 平均O(1)(直接哈希定位) |
插入/删除效率 | 平均O(n)(需移动后续元素) | 平均O(1)(链表操作或扩容) |
适用场景 | 字段数少且值小 | 字段数多或值较大时自动切换 |
扩容开销 | 无需显示扩容 | 需渐进式rehash(可能短暂阻塞) |
内存碎片 | 几乎无碎片(连续内存) | 可能会产生碎片(平凡增删时) |
【4】listpack(Redis7.0+使用)
在Redis 7.0中,压缩列表数据结构被替换成listpack数据结构来实现。
3、常用指令
命令 | 语法 | 作用 |
---|---|---|
HSET | HSET key field value | 设置哈希表中字段的值 |
HGET | HGET key field | 获取哈希表中字段的值 |
HMSET | HMSET key field1 value1 [field2 value2 …] | 批量设置哈希表的字段(redis4.0中HSET支持批量) |
HMGET | HMGET key field1 [field2 …] | 批量获取哈希表的字段值 |
HGETALL | HGETALL key | 获取哈希表中所有字段和值 |
HDEL | HDEL key field1 [field2 …] | 删除哈希表中的一个或多个字段 |
HEXISTS | HEXIST key field | 检查哈希表中字段是否存在 |
HKEYS | HKEYS key | 获取哈希表中所有字段名 |
HVALS | HVALS key | 获取哈希表中所有字段值 |
HLEN | HLEN key | 获取哈希表中字段数量 |
HINCRBY | HINCRBY key field increment | 对哈希表中的字段值进行整数增量操作 |
HINCRBYFLOAT | HINCRBYFLOAT key field increment | 对哈希表中的字段值进行浮点数增量操作 |
HSETNX | HSETNX key field value | 仅当字段不存在时设置值 |
4、使用场景
特性 | 适用命令 | 使用场景 |
---|---|---|
对象存储 | HSET/HGET/HGETALL | 存储结构化对象(如用户、商品信息),避免为每个属性创建独立key |
批量读写 | HMSET/HMGET/新版HSET | 批量初始化或更新对象属性,减少网络请求次数 |
计数器 | HINCRBY/ HINCRBYFLOAT | 原子性增减数值(如用户积分、库存、点赞) |