2023-06-29:redis中什么是热点Key?该如何解决?

答案2023-06-29:

在Redis中,经常被访问的key被称为热点key。

产生原因和危害

原因

热点key问题产生的原因可以归纳为以下两种情况:

用户对于某些数据的访问频率远大于数据的生产频率,这类数据包括热门商品、热点新闻、热点评论以及明星直播等。

在日常工作生活中,突发事件(如双十一期间商品降价促销)可能导致某些热门商品被大量点击浏览或购买,产生了巨大的需求量。类似地,热点新闻、热点评论和明星直播等引起大量刊发和浏览的情况也是典型的读多写少场景,它们会产生热点问题。

请求集中在分片集群中,超过单个服务器的性能极限。在服务端进行数据访问时,通常会对数据进行分片切分,其中某个服务器上的热点Key访问量超过了其承载能力的极限,从而导致热点Key问题的出现。

危害

1、流量集中,超过物理网卡的处理能力上限。

2、请求过多,导致缓存分片服务崩溃。

3、数据库击穿,引发业务雪崩。

发现热点key

预估发现

针对业务,可以提前预估出访问频繁的热点Key,例如在秒杀商品业务中,秒杀商品就是热点Key的典型案例。

然而,并非所有业务都容易预估出热点Key,有时可能会出现对热点Key的遗漏或预估错误的情况。

客户端发现

客户端实际上是离"热点Key"最近的位置,因为Redis命令是由客户端发送的。以Jedis为例,在核心命令入口处使用Google Guava中的AtomicLongMap可以方便地记录热点Key的访问情况,示例如下:

然而,使用客户端进行热点Key的统计也存在一些问题:

(1) 无法预知热点Key的数量,可能存在内存泄露的风险。

(2) 在不同的客户端代码中需要维护此逻辑,可能增加维护成本。

(3) 在规模化汇总方面的实现相对复杂。

Redis发现

monitor命令

使用Redis的monitor命令,可以监控到Redis执行的所有命令。通过解析monitor的结果,我们可以统计一段时间内的热点Key排行榜、命令排行榜以及客户端分布等数据。这种方法能够提供更详细的信息,帮助我们深入了解Redis的使用情况。需要注意的是,在生产环境中使用monitor命令可能对性能产生一定的影响,因此应该谨慎使用,并注意网络开销和输出缓冲区的消费速度。

Redis-Faina是Facebook开源的一款使用Python语言实现的工具。它利用上述原理可以获取最近10万条命令的热点Key、热点命令以及命令执行的耗时分布等数据。为了减少网络开销并提高输出缓冲区的消费速度,Redis-Faina会尽可能地在本机执行monitor命令。使用Redis-Faina可以更详细地了解Redis的使用情况。需要注意,在生产环境中使用该工具时应考虑性能影响和安全性。

此种方法存在两个问题:

1、在高并发条件下,使用monitor命令会导致内存暴增,同时可能影响Redis的性能。因此,这种方法适合在短时间内使用,而不适合长时间或高并发的监控。

2、monitor命令只能统计单个Redis节点的热点key,对于Redis集群,需要进行汇总统计才能获取全集群的热点key信息。

可以参考的框架:Facebook开源的redis-faina正是利用上述原理使用Python语言实现的

hotkeys

Redis在版本4.0.3中为redis-cli提供了--hotkeys选项,用于方便地找到热点key。通过使用该选项,我们可以快速获取到Redis中的热点key信息。这个功能的引入为我们在分析和优化Redis性能时提供了更方便和直接的工具。需要注意的是,确保Redis版本符合要求,并使用适当的命令行选项来获得所需的热点key信息。

如果发生错误,确保先将内存逐出策略设置为allkeys-lfu或者volatile-lfu,否则可能会返回错误。

然而,如果键值非常多,执行此操作可能会变得相对较慢,这与热点的概念有些相悖。此外,热度的定义可能不够准确。

抓取TCP包发现热点key

Redis客户端使用TCP协议与服务端进行交互,通信协议采用RESP。可以通过对机器上所有Redis端口的TCP数据包进行抓取来完成热点key的统计。这种方法对Redis客户端和服务端没有侵入,是一种较完美的方案。然而,存在以下三个问题:

1.需要进行一定的开发工作。

2.对于高流量的机器抓包,可能会对机器网络产生干扰,并可能丢包。

3.维护成本较高。

为了解决这些问题,有一些开源方案如ELK(ElasticSearch, Logstash, Kibana)体系下的packetbeat插件可以实现Redis、MySQL等服务的数据包抓取、分析和报表展示。

处理热点key

发现热点key后,可以采取以下方法进行处理:

  1. 使用二级缓存:使用Guava Cache或HCache将热点key加载到JVM中作为本地缓存。访问这些key时,直接从本地缓存获取数据,避免直接访问Redis层,有效保护缓存服务器。

  2. key分散:将热点key分散为多个子key,并分别存储在缓存集群的不同机器上。这些子key的值与热点key相同。当通过热点key查询数据时,通过某种哈希算法随机选择一个子key,然后再访问缓存机器,将热点key分散到多个子key上。

请注意,以上只是几种处理热点key的方法,根据实际需求和系统情况,可能还会有其他适合的解决方案。

2023-06-29:redis中什么是热点Key?该如何解决?的更多相关文章

  1. 经典面试题:分布式缓存热点KEY问题如何解决--有赞方案

    有赞透明多级缓存解决方案(TMC) 一.引子 1-1. TMC 是什么 TMC ,即"透明多级缓存( Transparent Multilevel Cache )",是有赞 Paa ...

  2. 爬坑系列----Redis查询key报空指针异常,而redis中确实存在该key

    现象: 1.在A方法中根据key查询一个list,可以获取到相应的值 2.在B方法中同样调用此方法,传入相同的key,查询不到值,为null,报空指针异常 起初我也一脸懵逼,到现在虽然解决了,还是不知 ...

  3. Redis热点Key发现及常见解决方案!

    一.热点Key问题产生的原因 1.用户消费的数据远大于生产的数据(热卖商品.热点新闻.热点评论.明星直播). 在日常工作生活中一些突发的的事件,例如:双十一期间某些热门商品的降价促销,当这其中的某一件 ...

  4. 如何发现 Redis 热点 Key ,解决方案有哪些?

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 来源:http://t.cn/EAEu4to 一.热点问题产生原因 热点问题产生的原因大致有以下两种: 1.1 用户消费的数 ...

  5. 热点Key问题的发现与解决

    热点问题概述 产生原因 热点问题产生的原因大致有以下两种: 用户消费的数据远大于生产的数据(热卖商品.热点新闻.热点评论.明星直播). 在日常工作生活中一些突发的的事件,例如:双十一期间某些热门商品的 ...

  6. Redis 中的原子操作(3)-使用Redis实现分布式锁

    Redis 中的分布式锁如何使用 分布式锁的使用场景 使用 Redis 来实现分布式锁 使用 set key value px milliseconds nx 实现 SETNX+Lua 实现 使用 R ...

  7. Redis 中的事务分析,Redis 中的事务可以满足ACID属性吗?

    Redis 中的事务 什么是事务 1.原子性(Atomicity) 2.一致性(Consistency) 3.隔离性(Isolation) 4.持久性(Durability) 分析下 Redis 中的 ...

  8. redis中的key设置过期时间

    EXPIRE key seconds 为给定  key  设置生存时间,当  key  过期时(生存时间为  0  ),它会被自动删除. 在 Redis 中,带有生存时间的  key  被称为『易失的 ...

  9. Redis中在程序中的应用

    1.导入redis的配置文件,因为要交给web容器管理,所以直接命名为ApplicationContext-redis.xml,具体配置如下: <beans xmlns="http:/ ...

  10. redis中key的归类

    redis中可以使用前缀对key进行归类: 例如:key: ITEM_INFO:123456:BASE ITEM_INFO:123456:DESC 作用:方便进行管理 如果把二维表保存到redis中: ...

随机推荐

  1. [JavaScript]JS屏蔽浏览器右键菜单/粘贴/复制/剪切/选中 [转载]

    前两天在解决一个项目缺陷时,突发感兴趣,了解一下~ 1 JS事件 document.oncontextmenu // 右键菜单 document.onpaste //粘贴 document.oncop ...

  2. DeFi-DEX-借贷

    不知道为什么上课的笔记没保存上55555 看看ppt和视频吧(

  3. 极速进化,光速转录,C++版本人工智能实时语音转文字(字幕/语音识别)Whisper.cpp实践

    业界良心OpenAI开源的Whisper模型是开源语音转文字领域的执牛耳者,白璧微瑕之处在于无法通过苹果M芯片优化转录效率,Whisper.cpp 则是 Whisper 模型的 C/C++ 移植版本, ...

  4. python介绍、32位与64位系统的区别、python安装、pip管理安装包

    一.python的介绍 * python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为 ...

  5. elSelect点击空白处无法收起下拉框(失去焦点并隐藏)

    学习记录,为了以后有同样的问题,省得再百度了,方便自己也方便你们element 中多选的select 有个问题,就是点击空白或者关闭弹窗,下拉还会一直展示出来百度了好一会,觉得下面两位大佬说的最合理, ...

  6. ubuntu20安装nginx支持多站点及代理配置

    上文说到安装mysql.redis.net6及部署应用  GO 接着本次配置通过域名访问站点,站点总共分为两个,前端.后端 项目为前后端分离,管理包括服务+管理UI,为一个站点,管理UI,放到服务某个 ...

  7. vue【解决方案】页面/路由跳转后,滚动条消失,页面无法滚动

    原因解析: vue项目中,页面/路由跳转后,body 的内联样式变成 overflow:hidden 解决方案: 使用路由守卫,在页面/路由跳转后,将body 的overflow设置为auto src ...

  8. 2021-03-31:给定一个数组arr,给定一个值v。求子数组平均值小于等于v的最长子数组长度。

    2021-03-31:给定一个数组arr,给定一个值v.求子数组平均值小于等于v的最长子数组长度. 福大大 答案2021-03-31: 这道题是昨天每日一题的变种.数组每个元素减v,然后求<=0 ...

  9. 2021-09-04:加油站。在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost

    2021-09-04:加油站.在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升.你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost ...

  10. SRE方法论之拥抱风险

    一.系统不可能100%可靠 系统不可能100%可靠,人都不可能100%健康,更何况我们人类创造的系统?所以,任何软件系统都不应该一味地追求 100%可靠.事实证明,可靠性超过一定值后,再提高可靠性对于 ...