详解redis(8):数据结构Hash

一、Hash 是什么?

逻辑层面

cpp 复制代码
key = user:1
value = {
  name: "xiaolin",
  age: 18,
  city: "beijing"
}

也就是:

bash 复制代码
HSET user:1 name xiaolin age 18 city beijing

Hash vs String

用 String 存对象

bash 复制代码
SET user:1 '{"name":"xiaolin","age":18}'

用 Hash 存对象

bash 复制代码
HSET user:1 name xiaolin age 18
对比点 String(JSON) Hash
修改单个字段 ❌ 需要整体改
读取单字段 ❌ 反序列化
命令语义
内存利用 一般 更优
适合对象 非常适合

二、为什么 Hash 特别适合存对象?

字段级操作

bash 复制代码
HINCRBY user:1 score 10

减少 Key 数量

不用:

user:1:name

user:1:age

user:1:city

而是:

user:1
Key 少,对 Redis 更友好

三、Hash 的内部实现

Redis 的哲学:小数据用紧凑结构,大数据用高效结构

两种底层结构

压缩列表

连续内存

紧凑存储

顺序查找

优缺点

内存占用极低

查找是 O(n)

插入删除可能引发连锁更新

哈希表

触发条件

字段多

或字段值大

特点

查找、更新 O(1)

指针多,内存占用高

Hash 自动转换机制

只升不降,不会再变回 ziplist

四、Redis 7.0 的变化:listpack

ziplist 的问题

连锁更新复杂

代码维护成本高

易产生性能抖动

listpack 是什么?

listpack 是 ziplist 的升级版

ziplist listpack
头尾指针
连锁更新 严重
结构复杂
维护成本

五、什么时候该用 Hash?

适合

用户信息

商品属性

配置项

状态对象

不适合

超大字段(几 MB)

只整体读写的对象(String 更简单)

六、Hash 实现购物车

为什么购物车是 Hash 的"天选场景"?

要素 对应 Hash
用户 key
商品 field
数量 value

为什么不用 List / String?

List

查商品要遍历

改数量不方便

不支持随机访问

String + JSON

改一个商品要整体反序列化

并发下容易冲突

Hash

O(1) 修改

字段级原子操作

相关推荐
用户30745969820715 小时前
Redis 延时队列详解
redis
CSharp精选营15 小时前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
烤代码的吐司君17 小时前
Redis 数据结构 ZSet, BIT, HyperLogLog,Geo 空间数据
redis·后端
leeyi3 天前
Checkpoint 机制:Agent 怎么在断电后接着跑
redis·aigc·agent
刘马想放假4 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
云技纵横4 天前
一个 @Async 让循环依赖暴雷:Spring 代理的暗坑
redis
犯困蛋挞yy5 天前
用Claude快速解决Redis代码报错反复无解的问题
redis
北域码匠5 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
用户31693538118311 天前
Java连接Redis
redis
Darling噜啦啦12 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试