Hash数据结构与对象存储
Redis的Hash是一个键值对集合,特别适合存储对象。一个Hash可以存储多达2^32-1个字段(超过40亿)。Hash在内存占用和查询性能上都有很好的表现,是存储结构化数据的首选。
# 设置单个字段
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"
# 获取单个字段
HGET user:1001 name
# 返回: "张三"
# 获取不存在的字段
HGET user:1001 phone
# 返回: (nil)
# 获取多个字段
HMGET user:1001 name age city
# 返回:
# 1) "张三"
# 2) "26"
# 3) "北京"
# 获取Hash的所有字段和值
HGETALL user:1001
# 返回:
# 1) "name"
# 2) "张三"
# 3) "age"
# 4) "26"
# 删除单个字段
HDEL user:1001 email
# 返回: (integer) 1
# 删除多个字段
HDEL user:1001 phone address
# 返回: (integer) 0
# 检查字段是否存在
HEXISTS user:1001 name
# 返回: (integer) 1
HEXISTS user:1001 phone
# 返回: (integer) 0
# 获取Hash字段数量
HLEN user:1001
# 返回: (integer) 4
# 获取所有字段名
HKEYS user:1001
# 返回:
# 1) "name"
# 2) "age"
# 3) "city"
# 获取所有字段值
HVALS user:1001
# 返回:
# 1) "张三"
# 2) "26"
# 3) "北京"
# 增加整数值
HINCRBY user:1001 age 1
# 返回: (integer) 27
# 减少整数值(使用负数)
HINCRBY user:1001 age -2
# 返回: (integer) 25
# 实际应用:增加用户积分
HINCRBY user:1001 points 100
# 实际应用:商品库存扣减
HINCRBY product:2001 stock -1
# 增加浮点数
HINCRBYFLOAT user:1001 balance 10.5
# 返回: "10.5"
HINCRBYFLOAT user:1001 balance 5.25
# 返回: "15.75"
# 实际应用:用户余额变动
HINCRBYFLOAT user:1001 wallet 99.99
# 字段不存在时设置
HSETNX user:1001 nickname "小张"
# 返回: (integer) 1
# 字段已存在时不设置
HSETNX user:1001 name "李四"
# 返回: (integer) 0
# 存储用户完整信息
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"
# 存储商品详情
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
# 添加商品到购物车
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
# 存储应用配置
HSET app:config max_connections "1000" timeout "30" cache_enabled "true"
# 获取单个配置
HGET app:config timeout
# 获取所有配置
HGETALL app:config
# 网站访问统计
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) |
Redis的Hash数据结构是存储对象的最佳选择,它提供了高效的字段级操作,内存占用也比使用多个String键更优。掌握Hash的各种操作命令,可以轻松实现用户信息存储、商品管理、购物车、配置管理等常见功能。