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

排错与常见问题#

  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
  1. HGETALL 返回数据量过大导致阻塞
# 使用 HSCAN 分批遍历
redis-cli HSCAN big:hash 0 MATCH * COUNT 100
  1. 误用 HMSET(新版本不推荐)
# 替换为 HSET 多字段
redis-cli HSET user:1002 name "bob" age 30 level 2

最佳实践#

  • Hash适合中小型对象,避免单个Hash字段过多导致迁移与遍历成本高。
  • 热点字段可拆分为独立键,降低锁竞争与大Key风险。
  • 对大Hash使用HSCAN避免HGETALL阻塞。
  • 配合EXPIRE设置过期,避免对象长期增长。

练习#

  1. 创建 user:2001,写入 name/age/level,并设置1小时过期。
  2. 统计 stats:pvhome 字段访问量自增10次。
  3. 使用 HSCAN 遍历 cfg:payment 中所有字段并输出。