如何处理Redis Hash中字段热点访问引发的单分片性能瓶颈

落萱姑娘_5211

落萱姑娘_5211

2026-10-10

252人浏览

原创

hgetall或频繁hget会卡住整个slot,因redis按key名哈希固定分配slot,单个hash所有字段共用同一slot,高频访问导致该节点cpu和带宽打满;应改用hmget、hscan分批或拆分为多key分散slot。

如何处理redis hash中字段热点访问引发的单分片性能瓶颈

为什么HGETALL或HGET频繁访问某个hash字段会卡住整个slot?

Redis的hash结构底层是压缩列表(ziplist)或哈希表(hashtable),但无论哪种,单个hash key始终落在**同一个slot**里——它由整个key名决定,不看字段名。所以哪怕你只读user:{1001}:profile里的nickname字段,整个hash仍被锁在slot 2345上。当这个hash被高频读写(比如每秒几千次HGET user:{1001}:profile nickname),该slot所在节点的CPU和网络带宽就会打满,而其他slot完全空闲。

别用HGETALL查热点字段,改用HMGET + 字段预筛

很多业务习惯先HGETALL再用代码过滤字段,这等于把整个hash从内存拖到网络再丢弃90%数据。对热点hash来说,这是灾难性的带宽浪费和序列化开销。

  • 只读固定字段时,直接HMGET user:{1001}:profile nickname avatar updated_at,避免传输冗余字段
  • 字段名有规律(如ext_*),且数量可控,可提前在应用层维护白名单,禁止动态拼接HGETALL
  • 若必须遍历,改用HSCAN + COUNT 100分批,但注意:HSCAN仍走同一slot,仅缓解单次阻塞,不解决根本倾斜

把热点字段拆成独立string key并做slot分散

真正治本的方法是打破“一个hash全绑死在同一个slot”的约束。核心思路:让高频访问的字段拥有自己的key名,并通过高基数tag控制其slot分布。

抖音实时热点榜
抖音实时热点榜

每小时追踪抖音热榜,抖音实时热点榜从创作者视角拆爆款、挖选题、预判趋势。

下载
  • 原结构:user:{1001}:profile(含nickname、avatar等20个字段)
  • 改造后:user:{1001 % 8}:nickname:{1001}、user:{1001 % 8}:avatar:{1001},其中1001 % 8生成0~7共8个tag,把原来挤在1个slot的请求打散到最多8个slot
  • 注意:不要用{1001}直接取模,要确保模数足够大(建议≥16),否则仍可能扎堆;更稳妥的是用hash(1001) % N(如MurmurHash3)
  • 双写过渡期:新逻辑写拆分key,读逻辑先查拆分key,未命中再回源hash,避免数据断层

客户端缓存+本地LRU绕过Redis单点压力

如果字段内容变更不频繁(如用户昵称一天改不到一次),最省资源的方式是把读请求挡在Redis之前。

  • 在应用层加一层本地缓存(如Caffeine),key为user_nickname_{uid},TTL设为比Redis中实际过期时间多5秒,防击穿
  • 更新时走双删:先删本地缓存,再更新Redis拆分key,最后异步刷新本地缓存(避免更新期间短暂不一致)
  • 慎用Redis 6.0+的CLIENT TRACKING:它依赖连接状态和广播机制,在集群+分片下易失效,且增加proxy负担,不如本地缓存可控

最难的不是算出哪个字段该拆、怎么取模,而是所有调用方(包括定时任务、后台管理接口、离线脚本)都得同步切换key路径——漏掉一个,那个角落里的Lua脚本就会在凌晨三点突然把整个slot拖垮。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

redis 热点 性能瓶颈

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4369

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3875

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

7072

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

623

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

756

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6782

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1160

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1056

6

redis主要作用有哪些
redis主要作用有哪些

redis 的主要作用包括:1. 缓存数据,提高访问速度;2. 充当消息队列,实现消息传递;3. 存储各种数据类型,如字符串、散列和集合;4. 管理会话信息,确保可靠性和可用性;5. 限制请求速率,防止服务器超载等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

5998

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习