哈希类型概述
Redis 哈希是一个键值对集合,特别适合存储对象。哈希类型的值本身又是一个键值对集合,可以看作是一个小型的 Redis 数据库。每个哈希可以存储多达 2^32 - 1 个键值对。
📝 基本操作命令
哈希类型的基础读写操作:
命令 | 描述 | 示例 |
---|---|---|
HSET key field value |
设置哈希字段的值 | HSET user:1001 name "张三" |
HGET key field |
获取哈希字段的值 | HGET user:1001 name |
HEXISTS key field |
检查哈希字段是否存在 | HEXISTS user:1001 email |
HDEL key field [field ...] |
删除哈希字段 | HDEL user:1001 temp_field |
HLEN key |
获取哈希字段数量 | HLEN user:1001 |
HKEYS key |
获取所有哈希字段名 | HKEYS user:1001 |
HVALS key |
获取所有哈希字段值 | HVALS user:1001 |
HGETALL key |
获取所有字段和值 | HGETALL user:1001 |
基本操作示例:
# 创建用户信息 HSET user:1001 name "张三" HSET user:1001 age "25" HSET user:1001 email "zhang@example.com" HSET user:1001 city "北京" # 获取用户信息 HGET user:1001 name # 返回: "张三" HGET user:1001 age # 返回: "25" # 检查字段是否存在 HEXISTS user:1001 email # 返回: 1 (存在) HEXISTS user:1001 phone # 返回: 0 (不存在) # 获取所有信息 HGETALL user:1001 # 返回: 1) "name" 2) "张三" 3) "age" 4) "25" 5) "email" 6) "zhang@example.com" 7) "city" 8) "北京" # 获取字段数量 HLEN user:1001 # 返回: 4
⚡ 批量操作命令
Redis 支持批量操作多个哈希字段,提高操作效率:
命令 | 描述 | 示例 |
---|---|---|
HMSET key field value [field value ...] |
批量设置多个字段 | HMSET user:1002 name "李四" age "30" |
HMGET key field [field ...] |
批量获取多个字段的值 | HMGET user:1002 name age |
HSETNX key field value |
仅当字段不存在时设置 | HSETNX user:1002 phone "13800138000" |
批量操作示例:
# 批量创建用户信息 HMSET user:1002 name "李四" age "30" city "上海" email "li@example.com" # 批量获取用户信息 HMGET user:1002 name age city # 返回: 1) "李四" 2) "30" 3) "上海" # 条件设置字段 HSETNX user:1002 phone "13800138000" # 返回: 1 (设置成功) HSETNX user:1002 phone "13900139000" # 返回: 0 (字段已存在,设置失败)
🔢 数值操作命令
当哈希字段存储数值时,可以进行原子性的数值操作:
命令 | 描述 | 示例 |
---|---|---|
HINCRBY key field increment |
将字段值增加指定整数 | HINCRBY user:1001 login_count 1 |
HINCRBYFLOAT key field increment |
将字段值增加指定浮点数 | HINCRBYFLOAT user:1001 balance 10.5 |
数值操作示例:
# 初始化用户统计信息 HMSET user:1001 login_count 0 balance 100.0 points 0 # 用户登录计数 HINCRBY user:1001 login_count 1 # 登录次数+1 HINCRBY user:1001 login_count 1 # 再次登录,计数+1 # 用户余额操作 HINCRBYFLOAT user:1001 balance 50.5 # 充值50.5元 HINCRBYFLOAT user:1001 balance -20.0 # 消费20元 # 积分操作 HINCRBY user:1001 points 100 # 获得100积分 HINCRBY user:1001 points -50 # 消费50积分 # 查看最终结果 HGETALL user:1001
🔍 字段遍历命令
Redis 提供了安全的字段遍历命令:
命令 | 描述 | 示例 |
---|---|---|
HSCAN key cursor [MATCH pattern] [COUNT count] |
迭代哈希字段 | HSCAN user:1001 0 MATCH "*name*" |
字段遍历示例:
# 遍历所有字段 HSCAN user:1001 0 # 按模式匹配字段 HSCAN user:1001 0 MATCH "*count*" # 限制返回数量 HSCAN user:1001 0 COUNT 2
实际应用场景
👤 用户信息存储
使用哈希存储用户的详细信息:
# 用户基本信息 HMSET user:1001 \ name "张三" \ age "25" \ email "zhang@example.com" \ phone "13800138000" \ city "北京" \ register_time "2024-01-01" \ last_login "2024-01-15" # 用户统计信息 HMSET user:1001:stats \ login_count 0 \ post_count 0 \ comment_count 0 \ like_count 0 # 更新统计 HINCRBY user:1001:stats login_count 1 HINCRBY user:1001:stats post_count 1
🛒 购物车管理
使用哈希存储用户的购物车信息:
# 添加商品到购物车 HSET cart:user:1001 product:101 2 # 商品101,数量2 HSET cart:user:1001 product:102 1 # 商品102,数量1 HSET cart:user:1001 product:103 3 # 商品103,数量3 # 更新商品数量 HINCRBY cart:user:1001 product:101 1 # 商品101数量+1 # 获取购物车所有商品 HGETALL cart:user:1001 # 获取特定商品数量 HGET cart:user:1001 product:101 # 删除商品 HDEL cart:user:1001 product:102 # 清空购物车 DEL cart:user:1001
📊 网站统计
使用哈希存储网站的各种统计数据:
# 页面访问统计 HINCRBY stats:page:views home 1 HINCRBY stats:page:views about 1 HINCRBY stats:page:views contact 1 # 用户行为统计 HINCRBY stats:user:actions login 1 HINCRBY stats:user:actions register 1 HINCRBY stats:user:actions purchase 1 # 获取统计数据 HGETALL stats:page:views HGETALL stats:user:actions # 按日期统计 HINCRBY stats:daily:2024-01-15 page_views 1 HINCRBY stats:daily:2024-01-15 unique_visitors 1
⚙️ 配置管理
使用哈希存储应用的配置信息:
# 数据库配置 HMSET config:database \ host "localhost" \ port "3306" \ username "root" \ database "myapp" \ max_connections "100" # 缓存配置 HMSET config:cache \ redis_host "localhost" \ redis_port "6379" \ default_ttl "3600" \ max_memory "1gb" # 获取配置 HGET config:database host HGET config:cache default_ttl # 更新配置 HSET config:database max_connections "200"
性能优化建议
- 批量操作:使用 HMSET/HMGET 减少网络往返次数
- 字段数量:单个哈希的字段数量不宜过多(建议小于1000)
- 内存优化:Redis 对小哈希有特殊的内存优化
- 避免大字段:单个字段值不宜过大
- 使用 HSCAN:遍历大哈希时使用 HSCAN 而不是 HGETALL
- 合理设计:根据访问模式设计哈希结构
哈希 vs 字符串
存储对象的两种方式对比:
# 方式1:使用字符串存储JSON SET user:1001 "{\"name\":\"张三\",\"age\":25,\"city\":\"北京\"}" # 优点:简单直接 # 缺点:更新单个字段需要序列化/反序列化整个对象 # 方式2:使用哈希存储 HMSET user:1001 name "张三" age 25 city "北京" # 优点:可以单独操作字段,内存效率高 # 缺点:不能设置单个字段的过期时间