用高并发技巧解决redis热key问题

Redis 热 key 是什么问题,如何导致的?有什么解决方案? 做一些C端业务,不可避免的要引入一级缓存来代替数据库的压力并且减少业务响应时间,其实每次引入一个中间件来解决问题的同时,必然会带来很多新的问题需要注意,比如缓存一致性问题。那么其实还会有一些其他问题比如使用Redis作为一级缓存时可能带来的热key、大key等问题,本文我们就热key(hot key)问题来讨论,如何合理的解决热key问题。以上就是笔者大概了解或实践过的的如何应对热key的一些方案,从发现热key到解决热key的两个关键问题的应对。 阅读详情

​

这篇文章我将介绍工作中处理热key问题的常用手段,可能介绍的不是很全,毕竟不同的业务场景可能有不同的解决方案,但是相信通过这部分的介绍能提供一个热key问题的思路。

热key问题,简单来说就是对某一资源的访问量过高问题,再简单一点来说就是对某个资源访问的qps过高,而解决访问量高的问题通常我们使用分布式缓存,最常见的就是redis,这个资源对应redis的一个key简称热key。热key在开发中是非常常见的,比如各种app的榜单,活动页面上的一些资源。

虽然redis号称单节点能扛住10Wqps,但是开发中肯定不能这样去估计,毕竟安全第一,比如5000似乎就可能就可以作为上限。如果超过5000该怎么处理呢?下面将提供几种常见的解决方案。

冗余写/随机读

假设在做活动,活动总金额为amount,用户每次完成任务会得到一笔奖金,每天结算一次,在页面会展示剩余金额restAmount。我们将剩余金额存到redis中,{key: pool, value: restAmount}

由于每天统一结算,所以写的qps不会很高,毕竟我们能自己控制流量,比如用户完成后发个延迟结算消息到mq,然后由消费者来处理计算剩余金额最后更新到redis中。

但是在页面的读的qps是很高的。显然奖池pool就是个热key。

既然单节点扛不住,那么显然可以将数据写到N个节点上,也就是将奖池存到多个节点,在页面读取的时候随机选一个节点去读。假如有10W的qps,N=10,那么每个节点的流量就成了1W的qps。

​

大key问题与分shard处理

上面介绍的奖池问题显然不是大key问题,工作中常见的大key问题通常涉及到批量用户存储在set或者map中。举个不恰当的例子(之所以说不恰当是因为大量数据判存完全可以使用布隆过滤器)。假如同时存在若干个活动,对于每个活动,如果用户完成了,需要记录下用户完成情况,在后续页面进行对应的完成情况展示。这里可以使用map来处理,{key:activityId, value:{field:userId, value:完成情况}}

那么这显然是一个大key问题,同时也是个热点问题。但是用上面介绍的办法能解决热key问题,解决不了大key问题。

解决这个问题其实也可以采用分而治之的思路,就是将大key拆分为若干小key,并且尽量让若干小key存在不同的redis节点中。

比如对于一个活动id我可以分为10个shard,{shard_1,...,shard_10},使用userId%10得到归属的shard。

这样每次判断取出用户完成情况,就先找到对应活动的shard然后拿出该用户即可。如果要拿出活动下的所有用户来做榜单,则只需要将所有shard都拿出来排序即可;

由于不同的shard在不同的redis节点,这样就又解决了热点问题。

​

本地缓存

如果条件允许的话,也就是本地缓存够用,或者说数据量不是很大,同时能够接受一定的延迟的话,那么可以直接使用本地缓存。这里就以guava的LoadingCache为例。

以奖池的例子来说,数据量小的忽略不计,因为结算时同一结算并更新奖池,也就是说一天中23个多小时数据都不会变,变动的时间也很短,所以我们可以接受一定的延迟,只要记得讲本地缓存过期时间设置短一点,比如10分钟。

此外需要有个地方供过期后的本地缓存读取,可以使用db或者redis,这样每次更新数据的时候就得更新db或者redis。为了防止击穿,记得使用load-miss方法。

LoadingCache<String, String> cache = CacheBuilder.newBuilder() .maximumSize(1000L) .expireAfterAccess(Duration.ofSeconds(600L)) .expireAfterWrite(Duration.ofSeconds(600L)) .build(new CacheLoader<String, String>() { @Override public String load(String key) throws Exception { // load from db } }); String restAmount = cache.get("pool"); 复制代码

使用Memcached

这在公司基础架构用的会更多一点,为什么可以使用memcached,看下面两段话的介绍就知道了.

  1. Redis是单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题;性能受限于CPU,单实例QPS在4-6w。Memcached是多线程,可以利用多核优势,单实例在正常情况下,可以达到写入60-80w qps,读80-100w qps。

  2. Redis的big key与热key类操作,如果qps较高则容易造成redis阻塞,影响整体请求。Memcached因为是多线程,与redis相比,在big key与热key类操作上支持较好。

大厂面试官问我:Redis中热key和大key是怎么解决的?【后端八股文五:Redis热key和大key八股文合集】 本文为【Redis热key和大key八股文合集】初版,后续还会进行优化更新,欢迎大家大家第一眼看到这个标题,不知道心中是否有答案了?在面试当中,面试官经常对项目亮点进行深挖,来考察你对这个项目亮点的理解以及思考!这个时候,你如果可以回答出面试官的问题,甚至是,那在面试中是大大加分的~ 阅读详情

相关推荐

架构- Redis热key的发现与解决

现在假设,你的应用层有50台机器,OK,你也有jvm缓存了。热key问题就是某个瞬间有大量的请求去访问redis上某个固定的key,导致缓存击穿,请求都打到了DB上,压垮了缓存服务和DB服务,从而影响到应用服务可用的可用性。当缓存服务崩溃后,此时再有请求产生,会缓存到后台 DB 上,由于DB 本身性能较弱,在面临大请求时很容易发生请求穿透现象,会进一步导致雪崩现象,严重影响设备的性能。如果热点过于集中,热点 Key 的缓存过多,超过目前的缓存容量时,就会导致缓存分片服务被打垮现象的产生。

wjianwei666的专栏 1447

Redis——热点key问题

本篇主要介绍Redis中的热点Key问题,包括热点Key产生的原因、如何监控发现热点key以及热点Key的解决方案;

娜娜米的博客 1万+

Redis热键问题的探究与应对策略

Redis 作为一个高性能的键值存储系统,在处理大量并发访问时可能会遇到热键(hot key)问题,即某个或某些键异常频繁地被访问,导致缓存服务器压力集中,影响整体性能。本文将探讨Redis热键的识别方法和应对措施。

fudaihb的博客 1012

Redis热Key问题解决方案汇总

Redis热Key问题解决方案汇总

loseyourself94的博客 1102

一个键拖慢整条街:Redis大Key的认定标准、阻塞机理、拆分压缩与在线治理解析

大 Key 会让一次全量读、一次删除、一次过期或一次迁移拖慢同一实例上的所有请求。本文基于 Redis 8.8.0 实测,先给出字节与元素数、总内存双维度的认定口径,再拆解单线程排队、网络带宽、同步释放、集群倾斜与持久化放大五条阻塞路径;随后实测对比 redis-cli 三种扫描工具与自建 SCAN 体检,讲清楚清单加版本的切块协议、listpack 分桶甜区、Zstd 与 LZ4 压缩取舍,以及双写、原子回填、校验切换的在线迁移和 UNLINK 下线方法,并逐项标注各能力的适用版本与边界。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 11万+

使用.NET 免费开源包ViewFaceCore做一个人脸识别并注册的功能,没有比我更全的

本文介绍了一个基于WinForm的免费人脸识别系统实现方案。系统使用AForge和ViewFaceCore库,支持从USB或电脑自带摄像头采集图像,具备人脸注册和快速识别功能。硬件方面仅需普通摄像头,软件依赖多个NuGet包(如AForge.Video、ViewFaceCore等)。界面包含视频显示、图像预览和功能按钮控件,后台采用SQLServer存储用户面部特征数据。核心代码展示了人脸检测、特征提取和多线程处理逻辑,通过ViewFaceCore实现高效识别。系统具有识别速度快、准确率高的特点,适合Win

一个靠“吃代码”长大的程序猿,专治各种“Bug 饥饿症”。 817

【面试题】redis大key问题怎么解决?(key访问的次数比较多,key存的数据比较大)

针对 Redis 中大 Key(数据量大且访问频繁)的问题,需从 数据拆分、访问优化、架构设计 等多维度综合解决。

m0_73731267的博客 1281

物流系统集成实战:从零开始用Java对接国际快递(DHL/FedEx/UPS)

本文详细介绍了如何使用Java技术栈对接DHL、FedEx和UPS三大国际快递巨头的API,构建高效、稳定的物流集成解决方案。内容涵盖认证机制、报文标准、多语言支持等关键点,并提供实战代码示例和最佳实践,帮助开发者快速实现国际快递系统集成。

efc1234567的博客 695

热Key问题及其解决方案:Redis高并发场景下的性能优化

在分布式缓存系统中,你是否曾遇到过某个Key突然成为"明星",吸引大量流量而导致系统负载失衡、响应缓慢甚至宕机的情况?这就是典型的"热Key"问题——一个在高并发系统架构中不可忽视的性能瓶颈。本文深入剖析Redis热Key的本质、识别方法与多维度解决方案,从技术原理到实战策略,全方位提升你应对高并发挑战的能力。你将了解为何一个微不足道的热Key可能导致电商促销损失数百万销售额,以及像网易游戏如何通过五级缓存策略将数据库压力降低100倍的精妙实践。无论你是正在构建高并发系统的开发者,还是面临性能优化挑战的架构

猫步轻移,以学求知。余于此方寸之地,如猫观鼠,细察技艺所得,思维所悟。灵思如猫之警觉,日积月累,终成智海; 1876

双屏DPI缩放问题全解析:从原理到实战解决窗口大小突变

DPI(每英寸点数)缩放是现代操作系统在多显示器环境下实现界面适配的核心技术。其原理是通过虚拟分辨率映射,在不同物理像素密度的屏幕上维持一致的视觉尺寸。这项技术的价值在于解决了高分辨率屏幕显示内容过小的问题,保障了跨屏工作流的视觉连续性。然而,在混合DPI环境(如4K屏与1080p屏组合)中,显卡驱动逻辑与应用程序DPI感知的协同问题,常导致窗口跨屏时出现剧烈缩放、尺寸错乱。这直接影响多屏办公、设计协作等需要频繁拖拽窗口的应用场景。本文聚焦于**显卡驱动**配置与**应用程序兼容性**设置,提供一套从系统底

weixin_34364071的博客 388

SpringCloud2025+SpringBoot3.5.0+gateway+webflux子服务路由报503

本来昨天就应该也记录下,免得忘记的,但是有点晚了,酒没写,真的是被坑惨了。当然这也是追求最新的代价,也是对新技术、老知识点的重温。依赖更粒度让架构的知识面更高,需要非常清楚另外说不定是有新的负载均衡要出现了,就想当初loadbalancer取代Ribbon一样好了,真是坑了半夜,昨晚都没有写,今天才复盘,希望能帮到大家,让更多在坑里的技术人爬出来。

zwrlj527的专栏 1998

Redis线上问题排查:从小白到面试高手

本文提供Redis线上问题排查的面试速查指南,主要包含三部分内容:1) 常见压力测试题解析,包括内存增长、热key访问和大key发现的解决方案;2) 关键排查工具速查表,如bigkeys和monitor的使用注意事项;3) 典型问题处理模板与预防措施,如大key拆分和热key多副本方案。文中还给出了监控告警设置建议和面试加分话术,强调"先监控发现、再工具定位、最后业务解决"的排查思路,并提示在从节点执行扫描操作等实战技巧。全文以简明实用的风格帮助面试者快速掌握Redis问题排查的核心要点

小坏说Java,一个专注Java微服务架构的实战,Java全栈教程,SpringBoot, SpringCloud微服务到分布式、高并发架构,大数据开发,运维实战,K8S、Docker容器为一体的教程,结合企业级内部的技术栈学习 463

Uniapp+Vue3+Monorepo:如何优化你的前端开发流程(附完整配置代码)

本文详细介绍了如何利用Uniapp+Vue3+Monorepo技术栈优化前端开发流程,提升代码可维护性和团队协作效率。通过Monorepo架构实现依赖管理智能化、代码复用最大化和构建流程统一化,结合完整配置代码和实战指南,帮助开发者快速构建高性能跨端应用。

weixin_29011993的博客 453

高并发性能优化随笔

本文介绍了多种高并发性能优化技巧,包括 MySQL 的索引和分库分表、缓存的使用、消息队列与流量聚合、线程池的优化等。这些技巧在实际开发中非常有用,可以帮助我们更好地应对高并发场景,提升系统的性能和稳定性。

2401_85373732的博客 1287

Cadence PCB仿真 使用Allegro PCB SI为BRD文件创建通用型IBIS模型的方法图文教程

本文简单介绍使用Allegro PCB SI软件为BRD PCB设计文件中的元器件创建IBIS模型的方法。

fydar的博客 2170

pytest学习和使用19-pytest断言失败后,怎样保持后续的断言继续执行?(pytest-assume)

【代码】pytest学习和使用19-pytes断言失败后,怎样保持后续的断言继续执行?

虫无涯的博客 1391

Redis中什么是热Key问题?如何解决热Key问题?

目录 一、什么是热Key?二、热Key产生的原因?三、热点Key的危害?四、如何识别热点Key?五、如何解决热Key问题?在Redis中,我们把访问频率高的Key,称为热Key。比如突然又几十万的请求去访问redis中某个特定的Key,那么这样会造成redis服务器短时间流量过于集中,很可能导致redis的服务器宕机。那么接下来对这个Key的请求,都会直接请求到我们的后端数据库中,数据库性能本来就不高,这样就可能直接压垮数据库,进而导致后端服务不可用。双十一秒杀商品,短时间内某个爆款商品可能被点击/购买上百

weixiaohuai的博客 1万+

手把手教你学 Simulink (1.3):探索Simulink模块库的奇妙世界

Simulink模块库按照功能分为多个类别,每个类别包含专门用于特定任务的模块。% 打开Simulink库浏览器% 或者以编程方式获取库列表disp('可用的库列表:');end常用模块(Simulink):最基础和最常用的模块信号处理模块(DSP System Toolbox):专业信号处理工具通信模块(Communications Toolbox):通信系统设计控制系统模块(Control System Toolbox):控制系统设计与分析% 创建自定义模块库。

QQ_778132974的博客 385

Redis 热key问题怎么解决?

热 Key(Hot Key)是指被高频访问的某个或多个 Key,导致单个 Redis 节点负载过高,可能引发性能瓶颈甚至服务崩溃。

qq_36929638的博客 1520

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Redis缓存热key问题常用解决方案

前言        做一些C端业务,不可避免的要引入一级缓存来代替数据库的压力并且减少业务响应时间,其实每次引入一个中间件来解决问题的同时,必然会带来很多新的问题需要注意,比如上篇文章《数据库与缓存一致性实战》中提到的如何做缓存的一致性。那么其实还会有一些其他问题比如使用Redis作为一级缓存时可能带来的热key、大key等问题,本文我们就热key(hot key)问题来讨论,如何合理的解决热key问题。 正文 背景       &nbs

拾忆的博客 9262

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

谈谈Redis的热key问题如何解决

点击上方“Java之间”,选择“置顶或者星标”你关注的就是我关心的!作者:孤独烟微信公众号:孤独烟(zrj_guduyan) 引言讲了几天的数据库系列的文章,大家一定看烦...

Java之间 3582

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Redis 的热 Key(Hot Key)问题及解决方法

Redis 热 Key(Hot Key)指的是访问频率极高的 Key,通常会造成以下问题: - 单 Key 访问量过大:热点 Key 可能被高并发请求频繁访问,导致单点压力集中,影响 Redis 的性能和稳定性。 - CPU 负载过高:Redis 需要处理大量对同一 Key 的请求,导致 CPU 使用率急剧上升。 - 网络 IO 瓶颈:请求量过大可能会导致 Redis 服务器的网络流量激增,影响整体响应速度。 - 缓存穿透、缓存击穿风险:如果热 Key 过期或者未命中,可能导致大量请求直接打到数据库,引发雪

maply的博客 2489

Redis的大key和热key如何解决

字符串类型(String):单个Key的Value特别大,一般认为在普通业务场景下,如果单个String类型的value大于1MB,或者在高并发低延迟场景中大于10KB,就可能被视为大Key集合数据类型:如Hash、Set、ZSet、List等,其中的元素数量过多或总体数据量过大。例如,一个Hash类型Key的成员数量虽只有1000个,但这些成员的Value总大小达到100MB,或者一个ZSet类型的Key成员数量达到10000个内存占用过高。

我的博客 2168

Redis 中热 Key 的判定及其解决方案

热 Key是指在 Redis 中被频繁访问的某些 Key。热 Key 的访问量远高于其他 Key,可能集中在少数几个 Key 上,导致 Redis 单节点的资源过度消耗,造成服务的性能瓶颈。举个例子,假设一个电商平台有多个商品,但某个爆款商品的访问量远高于其他商品。此时,爆款商品的 Redis Key 就可能成为热 Key。热 Key 是 Redis 中常见的性能瓶颈问题之一,它的存在可能导致系统性能下降、响应时间变慢甚至宕机。

lssffy的博客 3167

Redis如何解决热Key问题

热 Key(Hot Key)是指访问频率极高的键,在高并发场景下可能会造成:针对不同场景,解决方案主要包括 “分散请求” 和 “降低 Redis 负载” 两个方向。核心思路:在 Redis 之前增加一级缓存,减少 Redis 访问压力。本地缓存(L1 Cache)CDN 缓存(L0 Cache)示例:使用 Guava 本地缓存 2. 进行 Key 预分片(Key Sharding) 核心思路:将单个热 Key 拆分成多个 Key,让不同的 Redis 节点存储不同的副本,从而分散压力。示例 适用场景核心思

人心有反复,好在山水有重逢。 1301

高并发场景下的热点key问题探析与应对策略

当今高并发场景下,热点key问题成为影响系统性能和稳定性的关键挑战。本文探讨了热点key问题的定义及其在分布式系统中的常见表现,如流量集中、缓存分片打垮等。针对这些问题,本文提出了多级缓存策略、多副本策略和热点key拆分与动态分散策略作为有效应对措施。这些策略不仅能显著减轻单点负载压力,还能提升系统的并发处理能力和整体稳定性,从而保障系统在高负载和复杂业务场景下的可靠性。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 9万+
上一篇: 看完你才知道什么是Redis的持久化机制
下一篇: 说一说那些Java框架技术是可以放弃了
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值