This commit is contained in:
2025-09-11 22:56:20 +08:00
parent 7b4b1169ca
commit 7567aced74
5 changed files with 51 additions and 0 deletions

View File

@@ -0,0 +1,51 @@
---
title: Redis的Hash是什么
published: 2025-09-11
description: ''
image: ''
tags: ['Redis']
category: '中间件 > Redis'
draft: false
lang: ''
---
# Redis的Hash是什么
Redis的Hash是一种键值对集合可以把多个字段和值存储在同一个键中便于管理一些关联数据
比如一个用户信息可以存储在Hash中key为user:1value为name:张三,age:18,gender:男
命令: HSET user:1 name 张三 age 18 gender 男
适合存储小数据,能够在内存中高效存储和操作
支持快速字段操作,比如增删改查,适合存储对象属性
![](https://blog.meowrain.cn/api/i/2025/09/11/111qad1-1.webp)
![](https://blog.meowrain.cn/api/i/2025/09/11/111rxfa-1.webp)
# Hash底层
Hash是Redis中的一种数据基础数据结构类似于数据结构中的哈希表一个Hash可以存储2的32次方-1个键值对差不多40亿。底层结构按照Redis版本分成两种情况
- Redis6.0之前Hash的底层是压缩列表加上哈希表的数据结构ziplist + hashtable
- Redis7之后Hash的底层是紧凑列表(Listpack)加上哈希表的数据结构Listpack + hashtable
ziplist和listpack的效率差不多时间复杂度都是O(n)
但是listpack解决了ziplist的级联更新问题
![](https://blog.meowrain.cn/api/i/2025/09/11/114aurs-1.webp)
hash-max-ziplist-entries 512这是 Hash 类型使用 ziplist压缩列表编码的最大条目数阈值。当 Hash 的字段-值对数量 ≤ 512 时Redis 会优先使用 ziplist 进行内存高效存储,以减少开销。
hash-max-ziplist-value 64这是每个字段名key和值value的最大字节长度阈值。当所有字段名和值的字节长度均 ≤ 64 字节时结合条目数阈值Hash 会被编码为 ziplist。
优化目的ziplist 是一种紧凑的序列化存储方式,能显著降低内存使用(平均节省 5 倍,最高 10 倍但当超过阈值时Redis 会自动转换为标准哈希表hashtable以保证性能。
Redis 版本注意:在 Redis 7.0 中ziplist 被 listpack 取代(后者是其改进版),配置参数也相应更新为 hash-max-listpack-entries 和 hash-max-listpack-value但默认值和行为保持一致。为了向后兼容旧参数仍被支持作为别名。你的描述适用于 7.0 及更早版本。
# Hashtable
当Hash的键值对数量超过hash-max-ziplist-entries或者键和值的长度大于hash-max-ziplist-value时Redis会自动转换为Hashtable
Hashtable其实就是哈希表实现查询时间复杂度是O1效率很快
# rehash
![](https://blog.meowrain.cn/api/i/2025/09/11/11b5y0t-1.webp)