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. Luogu P4114 Qtree1

    树剖一好题.我心水了ww 题目描述 给定一棵n个节点的树,有两个操作: CHANGE i ti 把第i条边的边权变成ti QUERY a b 输出从a到b的路径中最大的边权,当a=b的时候,输出0 输 ...

  2. 让代码变得优雅简洁的神器:Java8 Stream流式编程

    原创/朱季谦 本文主要基于实际项目常用的Stream Api流式处理总结. 因笔者主要从事风控反欺诈相关工作,故而此文使用比较熟悉的三要素之一的[手机号]黑名单作代码案例说明. 我在项目当中,很早就开 ...

  3. day31:socketserver&hashlib&hmac&TCP登录

    目录 1.socketserver:实现TCP协议下Server端的并发 2.hashlib模块 3.hashlib应用:文件校验 4.hmac应用:服务器的合法性校验 5.TCP登录程序 1.soc ...

  4. 基于RL(Q-Learning)的迷宫寻路算法

    强化学习是一种机器学习方法,旨在通过智能体在与环境交互的过程中不断优化其行动策略来实现特定目标.与其他机器学习方法不同,强化学习涉及到智能体对环境的观测.选择行动并接收奖励或惩罚.因此,强化学习适用于 ...

  5. 第7章. 部署到GiteePages

    Gitee Pages 是一个免费的静态网页托管服务,您可以使用 Gitee Pages 托管博客.项目官网等静态网页.如果您使用过 Github Pages 那么您会很快上手使用 Gitee 的 P ...

  6. [Pytorch框架] 3.1 logistic回归实战

    文章目录 3.1 logistic回归实战 3.1.1 logistic回归介绍 3.1.2 UCI German Credit 数据集 3.2 代码实战 import torch import to ...

  7. 解决v-html渲染HTML标签展示信息有误问题

    后端返回的数据内容为: // html反转义 HTMLDecode(text) { var reg = /<[^>]+>/g; if (reg.test(text)) { retur ...

  8. 2023-02-20:小A认为如果在数组中有一个数出现了至少k次, 且这个数是该数组的众数,即出现次数最多的数之一, 那么这个数组被该数所支配, 显然当k比较大的时候,有些数组不被任何数所支配。 现在

    2023-02-20:小A认为如果在数组中有一个数出现了至少k次, 且这个数是该数组的众数,即出现次数最多的数之一, 那么这个数组被该数所支配, 显然当k比较大的时候,有些数组不被任何数所支配. 现在 ...

  9. 2022-10-06:以下go语言代码输出什么?A:[1 2 3] [1 2 3] ;B:[1 2 3] [3 4 5]; C:[1 2 3] [3 4 5 6 7 8 9];D:[1 2 3] [3

    2022-10-06:以下go语言代码输出什么?A:[1 2 3] [1 2 3] :B:[1 2 3] [3 4 5]: C:[1 2 3] [3 4 5 6 7 8 9]:D:[1 2 3] [3 ...

  10. 2022-09-04:以下go语言代码输出什么?A:不能编译;B:45;C:45.2;D:45.0。 package main import ( “fmt“ ) func main() {

    2022-09-04:以下go语言代码输出什么?A:不能编译:B:45:C:45.2:D:45.0. package main import ( "fmt" ) func main ...