★ Redis系列文章

Redis系列1:深刻理解高性能Redis的本质

Redis系列2:数据持久化提高可用性

Redis系列3:高可用之主从架构

Redis系列4:高可用之Sentinel(哨兵模式)

Redis系列5:深入分析Cluster 集群模式

追求性能极致:Redis6.0的多线程模型

追求性能极致:客户端缓存带来的革命

Redis系列8:Bitmap实现亿万级数据计算

Redis系列9:Geo 类型赋能亿级地图位置计算

Redis系列10:HyperLogLog实现海量数据基数统计

Redis系列11:内存淘汰策略

Redis系列12:Redis 的事务机制

Redis系列13:分布式锁实现

Redis系列14:使用List实现消息队列

Redis系列15:使用Stream实现消息队列

Redis系列16:聊聊布隆过滤器(原理篇)

Redis系列17:聊聊布隆过滤器(实践篇)

Redis系列18:过期数据的删除策略

Redis系列19:LRU内存淘汰算法分析

Redis系列20:LFU内存淘汰算法分析

Redis系列21:缓存与数据库的数据一致性讨论

Redis系列22:Redis 的Pub/Sub能力

Redis系列23:性能优化指南

Redis系列24:Redis使用规范

1 什么是Redis HotKey?

分布式系统绕不开的核心点之一的就是数据缓存,有了缓存的支撑,系统的整体吞吐量会有很大的提升。我们通过使用缓存,我们把频繁查询的数据由磁盘调度到高速缓存中,保证数据的高效率读写。

在互联网的大流量场景下,我们经常会遇到一些热点的信息需要存储到Redis中,而这种访问频率高的Key,称为 Hot Key。

Hot Key 处理不好,会产生一些问题。比如短时间的群蜂效应(群蜂请求),大量请求会在短时间内朝着Redis服务冲击,很可能会导致被访问的Redis服务器压力剧增,甚至可能将Redis服务器击垮。

Redis服务关了之后,那对这个Key的请求,都会直接透过缓存层请求到我们的数据库中,数据库性能远低于高速缓存,这样的结果就是直接压垮数据库,进而导致后端服务不可用,造成整体雪崩。

关于缓存雪崩、缓存击穿,我们在之前的的文章 『一次缓存雪崩的灾难复盘』、『 架构与思维:再聊缓存击穿』中详细讨论过,可以回头看看。

2 Hot Key出现的场景

Hot Key的主要场景包括如下:

  • 电商商品秒杀、活动积分竞拍、热点惊爆新闻等

    • 双十一、618 的商品秒杀,造成短时间内某宝或者夕夕上的爆款商品被浏览百万次
    • 某博上的惊爆新闻等引发大量围观,造成一个redis缓存信息被群蜂冲击,热点Key问题造成服务雪崩,某博研发同学被迫加班修复
  • 请求分片集中,调度不合理,超过单台Redis服务的吞吐瓶颈和性能极限

    Redis缓存会采用分片进行数据管理和性能提升。服务端对数据进行访问时,会通过一些负载均衡策略进行访问平衡,但是类似hash计算,也有可能会落入同一台redis服务器,如果瞬间访问量过大,超过主机吞吐极限时,就会导致热点 Key 现象发生。

  • 突发事件

    系统故障、黑客攻击、自然灾害等,导致大量的用户访问某个特定的Redis Key。

3 Hot Key产生的危害

在Redis中,Hot Key的危害主要体现在以下几个方面:

  1. 单点访问频率过高:Hot Key会导致大部分的访问流量集中在某一个Redis实例上,使得该实例的负载过高,可能会导致该实例崩溃,影响线上业务。
  2. 分片服务瘫痪:Redis集群会分很多个分片,每个分片有其要处理的数据范围。当某一个分片被频繁请求,该分片服务就可能会瘫痪。
  3. Redis分布式集群优势弱化:如果请求不够均衡,过于单点,那么Redis分布式集群的优势也必然被弱化。
  4. 可能造成资损:在极端场景下,容易发生边界数据处理不及时,在订单等场景下,可能造成资损。
  5. 引发缓存击穿:如果缓存请求不到,就会去请求数据库。如果请求过于集中,Redis承载不了,就会有大量请求打到数据库。此时,可能引发数据库服务瘫痪,进而引发系统雪崩。我们在之前的文章中,大量讨论到 缓存击穿、缓存雪崩、缓存穿透
  6. CPU占用高,影响其他服务:单个分片CPU占用率过高,其他分片无法拥有CPU资源,从而被影响。

4 如何监测并分析Hot Key

  1. 容量评估

    联网的业务场景具备一定规律的,根据一些决策树,结合业务场景,可以分析出哪些是热点场景,哪些信息可能是Hot Ke,比如

    • 双11、618的秒杀商品、积分竞拍商品,那么这个商品信息、竞拍/购买操作都是热操作,关联的Redis信息都可能是HotKey。
    • 比如突发的新闻热点,依照画像识别,数据不断攀升,在某个时间点有概率会成为HotKey新闻,需要提前干预
  2. 业务埋点上报

    这种方式low一点,需要切入我们的业务代码进行埋点,加入对Redis Key 调用次数的统计,并把收集到的数据上报到统一的服务进行聚合计算,缺点就是对业务有一定的侵入性。

  3. 使用Redis自带命令

    可以使用INFO命令获取关于Redis服务器的各种信息,包括键的读写次数。通过定期执行INFO命令并分析返回的信息,可以判断哪些键是Hot Key。另外,Redis 4.0.3提供了redis-cli的热点key发现功能,执行redis-cli时加上–hotkeys选项即可。

  4. 使用第三方工具

    如redis-faina是一个现成的分析工具,可以用来分析Redis中的Hot Key。

  5. 使用Redis监控工具

    如使用Redis Exporter可以导出Redis服务器的各种信息,包括键的访问频率等,方便进行监控和分析。

以上是Redis监测并分析Hot Key的几种常见方法,可以根据实际需求选择适合的方法进行操作。

5 如何避免Hot Key引发线上故障

解决Redis中的热key问题,可以采取以下几种解决方案:

  1. 缓存预热

    既然是可预见的HotKey,那么缓存预热是一个好办法,比如双11开启活动前,热点新闻爆出之后,预先加载一些热key的数据到缓存中,以减少对数据库的冲击

  2. 缓存击穿处理

    根据上面的监测预判一些可能会成为HotKey的信息,对缓存击穿进行一些应对处理。详细可以参考『 架构与思维:再聊缓存击穿』的4.5、4.6、4.7节。

    大概如下:

  • 短暂降级之备选缓存

  • 短暂降级之客户端缓存(Redis 6.0)

  • 短暂降级之空初始值

  1. 分布式缓存

    通过分布式缓存系统来分散请求负载,避免单一节点压力过大。现在的Redis高可用部署模式最常见的是主从和Cluster,无论哪一种,都会降低单点带来的影响。

  2. 限流和降级

    可以使用 Hystrix进行限流 + 降级 ,比如一下子来了1W个请求,不是当前系统的吞吐能力能够承受的,假设单秒TPS的能力只能是 5000个,那么剩余的 5000 请求就可以走限流逻辑。

    可以设置一些默认值,然后调用我们自己降级逻辑去FallBack,保护最后的 MySQL 不会被大量的请求挂起。 除了Hystrix之外,阿里的Sentinel 和 Google的RateLimiter 都是不错的选择。

Sentinel 漏桶算法

RateLimiter 令牌桶算法

  1. 优化数据结构和算法

    通过优化数据结构和算法来减少对热key的访问和更新操作。

  2. 定期清理过期数据

    定期清理过期数据可以避免过多的热key占用缓存空间,从而减少缓存分片服务的压力。

  3. 使用二级缓存

    如JVM本地缓存来实现二级缓存,减少Redis的读请求,可以先从本地缓存中取,取不到再去redis中去取,Redis再取不到采取数据库中取。

    提供了多层保障。

6 总结

本文主要介绍了Redis中的热Key(Hot Key)产生的原因,讨论监测和排查Hot Key的方法,以及采用哪些解决方案来避免Hot Key引发线上故障。

架构与思维:如何应对Redis热Key?的更多相关文章

  1. 如何快速定位 Redis 热 key?

    背景 在 Redis 中,热 key 指的是那些在一段时间内访问频次比较高的键值,具体到业务上,商品的限时抢购.瞬时的新闻热点或某个全局性的资源,都极有可能产生热点 key. 热点 key 的出现可能 ...

  2. 京东热 key 探测框架新版发布,单机 QPS 可达 35 万

    https://mp.weixin.qq.com/s/3URAvUF6zwxeF5Kkc1aWHA 京东热 key 探测框架新版发布,单机 QPS 可达 35 万 原创 Hollis Hollis 2 ...

  3. 【原创】谈谈redis的热key问题如何解决

    引言 讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完...(以下省略一万字). 今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决. 其实热key问题说来也很简单,就是瞬间 ...

  4. 谈谈redis的热key问题如何解决

    引言 讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完...(以下省略一万字).今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决.其实热key问题说来也很简单,就是瞬间有几 ...

  5. BAT经典面试题之redis的热KEY问题怎么解决

    引言 讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完...(以下省略一万字).今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决.其实热key问题说来也很简单,就是瞬间有几 ...

  6. 浅谈Redis大Key与热Key

    如何定义大 Key 和 热 Key 如何定义大 Key 如何定义热 Key 大 Key 和 热 Key 产生的原因 大 Key 和 热 Key 有哪些危害 大 Key 的危害 热 Key 的危害 如何 ...

  7. 7.redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?

    作者:中华石杉 面试题 redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗? 面试官心理分析 在前几年, ...

  8. Redis大 key的发现与删除方法全解析

    个推作为国内第三方推送市场的早期进入者,专注于为开发者提供高效稳定的推送服务,经过9年的积累和发展,服务了包括新浪.滴滴在内的数十万APP.由于我们推送业务对并发量.速度要求很高,为此,我们选择了高性 ...

  9. Redis大key的发现与删除方法全解析

    个推作为国内第三方推送市场的早期进入者,专注于为开发者提供高效稳定的推送服务,经过9年的积累和发展,服务了包括新浪.滴滴在内的数十万APP.由于我们推送业务对并发量.速度要求很高,为此,我们选择了高性 ...

  10. 深度评测丨 GaussDB(for Redis) 大 Key 操作的影响

    本文分享自华为云社区<墨天轮评测:GaussDB(for Redis)大Key操作的影响>,作者: 高斯 Redis 官方博客. 在前一篇文章<墨天轮评测:GaussDB(for R ...

随机推荐

  1. CodeForces 1332D Walk on Matrix

    题意 \(Bob\)想解决一个问题:一个\(n\cdot m\)的矩阵,从\((1,1)\)出发,只能走右和下,问从\((1,1)\)到\((n,m)\)的最大\(\&\)和 他的算法如下(\ ...

  2. WPF学习 - 用鼠标移动、缩放、旋转图片(2)- 使用MatrixTransform

    在上一篇文章中,提到了以鼠标控制变换图片的方法. 这种方法在某种情况下可以,例如,直接在windows窗体上.但我发现,当把它封装到一个控件中的时候,它就不行了. 经过不断的尝试,我找到了一种更简单的 ...

  3. 《Python魔法大冒险》005 魔法挑战:自我介绍机器人

    魔法师和小鱼坐在图书馆的一扇窗户旁,窗外的星空闪烁着神秘的光芒.魔法师轻轻地拍了拍小鱼的肩膀. 魔法师: 小鱼,你已经学会了编写简单的魔法程序,现在我要教你如何创造一个有自己思想的机器人,让它能够和我 ...

  4. 《Python魔法大冒险》002 编程是什么?

    魔法师:在这个充满魔法和奇迹的数字时代,你是否好奇过计算机是如何运作的?当你用手机玩游戏.在电脑上浏览网页.看动画电影,你是否想过这背后的秘密是什么?别担心,今天我们将揭开这神秘的面纱,一起来探索编程 ...

  5. Linux下MySQL备份指定数据库命令

    比如我们要备份mysql中已经存在的名为linux的数据库,要用到命令mysqldump 命令格式如下: [root@linuxsir01 root]# mysqldump -u root -p li ...

  6. 每日一库:lumberjack -- 日志轮换和管理

    在开发应用程序时,记录日志是一项关键的任务,以便在应用程序运行时追踪问题.监视性能和保留审计记录.Go 语言提供了灵活且强大的日志记录功能,可以通过多种方式配置和使用.其中一个常用的日志记录库是 gi ...

  7. MySQL运维2-主从复制

    一.主从复制概念 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从服务器中,然后在从服务器上对这些日志重新执行也叫重做,从而使得从数据库和主库的数据保持同步. MySQL支持一台主库同时 ...

  8. MySQL PXC集群大事务提交超限

    研发人员在测试大事务提交时遇见了错误: Got error 5 - 'Transaction size exceed set threshold' during COMMIT 测试了几次都是1200S ...

  9. 【Unity3D】UI Toolkit容器

    1 前言 ​ UI Toolkit简介 中介绍了 UI Builder.样式属性.UQuery.Debugger,UI Toolkit元素 中介绍了 Label.Button.TextField.To ...

  10. Python 利用pandas和mysql-connector获取Excel数据写入到MySQL数据库

    如何将Excel数据插入到MySQL数据库中 在实际应用中,我们可能需要将Excel表格中的数据导入到MySQL数据库中,以便于进行进一步的数据分析和处理.本文将介绍如何使用Python将Excel表 ...