8.1.4 Hash类型与常用命令
Hash类型与常用命令#
Hash用于存储对象的多个字段,键为唯一标识、值为字段集合,适合用户资料、配置项、商品属性等场景。单个Hash下可包含多个field,支持字段级读写与自增,节省内存并降低网络开销。
原理草图#
安装与连接(本节示例前置条件)#
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y redis-server
sudo systemctl enable --now redis-server
# 验证
redis-cli PING
# 预期输出:PONG
常用命令与解释#
HSET key field value [field value ...]:设置一个或多个字段HGET key field:获取单个字段HMGET key field1 field2:获取多个字段HGETALL key:获取所有字段与值HDEL key field [field ...]:删除字段HEXISTS key field:判断字段是否存在HLEN key:字段数量HINCRBY key field increment:字段整数自增HINCRBYFLOAT key field increment:字段浮点自增HKEYS key/HVALS key:获取所有字段/值HSCAN key cursor [MATCH pattern] [COUNT n]:游标遍历,适合大Hash
可执行示例(完整流程)#
# 1) 创建用户对象
redis-cli HSET user:1001 name "alice" age 28 level 3
# 2) 读取字段
redis-cli HGET user:1001 name
# 预期输出:alice
# 3) 批量读取
redis-cli HMGET user:1001 name age level
# 预期输出:1) "alice" 2) "28" 3) "3"
# 4) 计数累加(订单成功数)
redis-cli HINCRBY stats:order success 1
redis-cli HGET stats:order success
# 预期输出:1
# 5) 字段是否存在
redis-cli HEXISTS user:1001 age
# 预期输出:1
# 6) 遍历大Hash(模拟)
redis-cli HSCAN user:1001 0 MATCH * COUNT 10
# 7) 设置过期(对象级别)
redis-cli EXPIRE user:1001 3600
redis-cli TTL user:1001
典型场景示例#
# 用户画像
redis-cli HSET user:1001 name "alice" age 28 level 3 city "shenzhen"
# 业务配置
redis-cli HSET cfg:payment timeout 30 retry 3 mode "safe"
# 统计计数
redis-cli HINCRBY stats:pv home 1
redis-cli HINCRBY stats:pv list 1
排错与常见问题#
HINCRBY报错 “hash value is not an integer”
# 定位字段值
redis-cli HGET stats:order success
# 修正为整数后再自增
redis-cli HSET stats:order success 0
redis-cli HINCRBY stats:order success 1
HGETALL返回数据量过大导致阻塞
# 使用 HSCAN 分批遍历
redis-cli HSCAN big:hash 0 MATCH * COUNT 100
- 误用
HMSET(新版本不推荐)
# 替换为 HSET 多字段
redis-cli HSET user:1002 name "bob" age 30 level 2
最佳实践#
- Hash适合中小型对象,避免单个Hash字段过多导致迁移与遍历成本高。
- 热点字段可拆分为独立键,降低锁竞争与大Key风险。
- 对大Hash使用
HSCAN避免HGETALL阻塞。 - 配合
EXPIRE设置过期,避免对象长期增长。
练习#
- 创建
user:2001,写入name/age/level,并设置1小时过期。 - 统计
stats:pv中home字段访问量自增10次。 - 使用
HSCAN遍历cfg:payment中所有字段并输出。