<返回目录     Powered by claud/xia兄

第6课: 哈希操作

Hash数据结构与对象存储

一、Hash简介

Redis的Hash是一个键值对集合,特别适合存储对象。一个Hash可以存储多达2^32-1个字段(超过40亿)。Hash在内存占用和查询性能上都有很好的表现,是存储结构化数据的首选。

Hash的特点

二、基本操作命令

1. HSET - 设置字段值

# 设置单个字段
HSET user:1001 name "张三"
# 返回: (integer) 1

# 设置多个字段(Redis 4.0+)
HSET user:1001 age 25 city "北京" email "zhang@example.com"
# 返回: (integer) 3

# 更新已存在的字段
HSET user:1001 age 26
# 返回: (integer) 0

# 实际应用:存储用户信息
HSET user:1001 username "zhangsan" password "hashed_pwd" status "active"

2. HGET - 获取字段值

# 获取单个字段
HGET user:1001 name
# 返回: "张三"

# 获取不存在的字段
HGET user:1001 phone
# 返回: (nil)

3. HMGET - 批量获取字段

# 获取多个字段
HMGET user:1001 name age city
# 返回:
# 1) "张三"
# 2) "26"
# 3) "北京"

4. HGETALL - 获取所有字段

# 获取Hash的所有字段和值
HGETALL user:1001
# 返回:
# 1) "name"
# 2) "张三"
# 3) "age"
# 4) "26"
注意:HGETALL会返回Hash的所有字段,对于大Hash可能造成阻塞。生产环境建议使用HSCAN遍历大Hash。

5. HDEL - 删除字段

# 删除单个字段
HDEL user:1001 email
# 返回: (integer) 1

# 删除多个字段
HDEL user:1001 phone address
# 返回: (integer) 0

6. HEXISTS - 判断字段是否存在

# 检查字段是否存在
HEXISTS user:1001 name
# 返回: (integer) 1

HEXISTS user:1001 phone
# 返回: (integer) 0

7. HLEN - 获取字段数量

# 获取Hash字段数量
HLEN user:1001
# 返回: (integer) 4

8. HKEYS - 获取所有字段名

# 获取所有字段名
HKEYS user:1001
# 返回:
# 1) "name"
# 2) "age"
# 3) "city"

9. HVALS - 获取所有字段值

# 获取所有字段值
HVALS user:1001
# 返回:
# 1) "张三"
# 2) "26"
# 3) "北京"

三、数值操作

1. HINCRBY - 整数增减

# 增加整数值
HINCRBY user:1001 age 1
# 返回: (integer) 27

# 减少整数值(使用负数)
HINCRBY user:1001 age -2
# 返回: (integer) 25

# 实际应用:增加用户积分
HINCRBY user:1001 points 100

# 实际应用:商品库存扣减
HINCRBY product:2001 stock -1

2. HINCRBYFLOAT - 浮点数增减

# 增加浮点数
HINCRBYFLOAT user:1001 balance 10.5
# 返回: "10.5"

HINCRBYFLOAT user:1001 balance 5.25
# 返回: "15.75"

# 实际应用:用户余额变动
HINCRBYFLOAT user:1001 wallet 99.99

3. HSETNX - 字段不存在时设置

# 字段不存在时设置
HSETNX user:1001 nickname "小张"
# 返回: (integer) 1

# 字段已存在时不设置
HSETNX user:1001 name "李四"
# 返回: (integer) 0

四、实际应用场景

1. 用户信息存储

# 存储用户完整信息
HSET user:1001 username "zhangsan" email "zhang@example.com" phone "13800138000"

# 获取用户基本信息
HMGET user:1001 username email phone

# 更新最后登录时间
HSET user:1001 last_login "2024-02-04 12:00:00"

2. 商品信息管理

# 存储商品详情
HSET product:2001 name "iPhone 15 Pro" price "7999" stock "100" sales "0"

# 商品售出,库存减1,销量加1
HINCRBY product:2001 stock -1
HINCRBY product:2001 sales 1

# 获取商品信息
HGETALL product:2001

3. 购物车实现

# 添加商品到购物车
HSET cart:user:1001 product:2001 2
HSET cart:user:1001 product:2002 1

# 修改商品数量
HSET cart:user:1001 product:2001 3

# 增加商品数量
HINCRBY cart:user:1001 product:2001 1

# 删除商品
HDEL cart:user:1001 product:2002

# 获取购物车所有商品
HGETALL cart:user:1001

4. 配置管理

# 存储应用配置
HSET app:config max_connections "1000" timeout "30" cache_enabled "true"

# 获取单个配置
HGET app:config timeout

# 获取所有配置
HGETALL app:config

5. 统计计数器

# 网站访问统计
HINCRBY stats:2024-02-04 page_views 1
HINCRBY stats:2024-02-04 unique_visitors 1

# 获取当天统计
HGETALL stats:2024-02-04

# 用户行为统计
HINCRBY user:1001:stats login_count 1
HINCRBY user:1001:stats post_count 1

五、常用命令对照表

命令 功能 时间复杂度
HSET 设置字段值 O(1)
HGET 获取字段值 O(1)
HMGET 批量获取字段 O(N)
HGETALL 获取所有字段 O(N)
HDEL 删除字段 O(N)
HEXISTS 判断字段存在 O(1)
HLEN 获取字段数量 O(1)
HINCRBY 整数增减 O(1)
HINCRBYFLOAT 浮点数增减 O(1)
HSCAN 迭代Hash字段 O(1)
性能优化建议:

六、实践练习

练习任务:
  1. 创建一个用户Hash,包含用户名、邮箱、手机号、注册时间等字段
  2. 使用HMGET批量获取用户的姓名、邮箱和手机号
  3. 实现一个简单的购物车功能,支持添加、修改、删除商品
  4. 使用Hash存储商品信息,实现库存扣减和销量增加
  5. 实现一个配置管理系统,支持读取和更新配置项
  6. 使用Hash实现网站访问统计,记录PV、UV、API调用次数
  7. 对比Hash和String存储对象的内存占用差异
  8. 使用HSCAN遍历一个包含1000个字段的大Hash

七、总结

Redis的Hash数据结构是存储对象的最佳选择,它提供了高效的字段级操作,内存占用也比使用多个String键更优。掌握Hash的各种操作命令,可以轻松实现用户信息存储、商品管理、购物车、配置管理等常见功能。