详解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) 修改

字段级原子操作

相关推荐
m0_5474866620 小时前
《数据结构教程》全套 PPT课件2026
数据结构
IT大白鼠21 小时前
Redis 系列 · 第 01 篇——认知入门:Redis 是什么
redis·nosql
彧azz21 小时前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
another heaven21 小时前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
lbb 小魔仙1 天前
OpenClaw + cpolar 实战:远程 NAS、分享小游戏、RDP,再配置公网 AI 入口
数据库·人工智能·redis·oracle·prometheus
夕除1 天前
redis--018
redis
两锭子1 天前
Redis基础
redis
烟沙九洲1 天前
Redis 缓存穿透、缓存击穿、缓存雪崩
数据库·redis
字节探索1 天前
Redis 只会当缓存用?这 10 大实战场景,让你的系统快到飞起
redis·后端
tryxr1 天前
矩阵的几种基础变换
java·数据结构·算法·矩阵