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

字段级原子操作

相关推荐
计算机安禾1 天前
【C语言程序设计】第34篇:文件的概念与文件指针
c语言·开发语言·数据结构·c++·算法·visual studio code·visual studio
czlczl200209251 天前
Redis数据编码
数据库·redis·缓存
Wpa.wk1 天前
pb协议接口测试
数据库·redis·缓存
会编程的土豆1 天前
【数据结构与算法】 二叉树做题
开发语言·数据结构·c++·算法
weixin_456321641 天前
Java架构设计:Redis AOF持久化深度解析(原理+实战+避坑)
java·开发语言·redis
leaves falling1 天前
数据结构-堆学习
java·数据结构·学习
Fcy6481 天前
算法竞赛有关数据结构的补充(2)--- 栈、队列的静态实现和树的实现
数据结构···队列
四谎真好看1 天前
Redis学习笔记(实战篇3)
redis·笔记·学习·学习笔记
Book思议-1 天前
【数据结构实战】链表找环入口的经典问题:快慢指针法
c语言·数据结构·算法·链表
我能坚持多久1 天前
【初阶数据结构11】——链式二叉树知识补充
数据结构·算法