1. 基本概念
什么是Hash
数据结构示例
user:1 = {
name: "张三",
age: 25,
email: "zhangsan@example.com"
}
2. 核心命令
基本操作
| 命令 | 功能 | 示例 |
|---|
| HSET | 设置字段值 | HSET user:1 name "张三" |
| HGET | 获取字段值 | HGET user:1 name |
| HGETALL | 获取所有字段 | HGETALL user:1 |
| HDEL | 删除字段 | HDEL user:1 age |
批量操作
| 命令 | 功能 | 示例 |
|---|
| HMSET | 批量设置 | HMSET user:1 name "张三" age 25 |
| HMGET | 批量获取 | HMGET user:1 name age |
| HKEYS | 获取所有字段名 | HKEYS user:1 |
| HVALS | 获取所有值 | HVALS user:1 |
其他操作
| 命令 | 功能 | 示例 |
|---|
| HEXISTS | 检查字段存在 | HEXISTS user:1 name |
| HINCRBY | 字段值自增 | HINCRBY user:1 age 1 |
| HSETNX | 字段不存在时设置 | HSETNX user:1 email "zs@qq.com" |
3. 实际应用
用户信息存储
HSET user:1 name "zhangsan"
HSET user:1 age 25
HSET USER:1 EMAIL "ZHANGSAN@example.com"
#获取用户信息
HGER user:1 name #返回zhangsan
HGETALL user:1 #返回所有字段-值对
购物车存储
#用户购物车
HSET cart:user:1 product:1 2 #商品1,数量2
HSET cart:user:1 product:2 1 #商品2,数量1
. Hash vs String对比
| 方式 | 示例 | 优点 | 缺点 |
|---|
| String | SET user:1 '{"name":"张三","age":25}' | 简单直接 | 需要序列化/反序列化 |
| Hash | HSET user:1 name "张三" | 结构化存储 | 稍微复杂 |
5. 最佳实践
设计原则
| 原则 | 说明 | 示例 |
|---|
| 合理设计字段名 | 使用有意义的名称 | name 而不是 n |
| 控制字段数量 | 避免过多字段 | 建议<100个字段 |
| 设置过期时间 | 避免数据堆积 | EXPIRE user:1 3600 |
性能优化
| 优化 | 说明 | 示例 |
|---|
| 批量操作 | 减少网络请求 | HMSET 而不是多个 HSET |
| 字段命名 | 使用短字段名 | name 而不是 user_name |
6. 常见错误
| 错误 | 问题 | 正确做法 |
|---|
| 字段名过长 | 浪费内存 | 使用短字段名 |
| 字段过多 | 性能问题 | 拆分Hash |
| 频繁使用HGETALL | 性能问题 | 只获取需要的字段 |
7. 使用场景
| 场景 | 推荐类型 | 原因 |
|---|
| 简单缓存 | String | 性能更好 |
| 对象存储 | Hash | 结构化,便于管理 |
| 频繁更新部分字段 | Hash | 只更新需要的字段 |
总结
Hash类型特点:
使用建议: