首页 > 数据库 >2023-06-29:redis中什么是热点Key?该如何解决?

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

时间:2023-06-29 21:02:40浏览次数:45  
标签:06 Key Redis redis 29 monitor key 热点 客户端

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命令可能对性能产生一定的影响,因此应该谨慎使用,并注意网络开销和输出缓冲区的消费速度。

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

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信息。

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

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

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

2023-06-29:redis中什么是热点Key?该如何解决?_客户端_04

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

抓取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的方法,根据实际需求和系统情况,可能还会有其他适合的解决方案。

标签:06,Key,Redis,redis,29,monitor,key,热点,客户端
From: https://blog.51cto.com/moonfdd/6585339

相关文章

  • 亿级用户实时互动,GaussDB(for Redis)带您沉浸式体验迷你世界
    摘要:GaussDB(forRedis)助您聊天不卡顿,畅玩更痛快爱冒险是人的天性,游戏创造的虚拟世界充分满足了人们这一需求,玩游戏也成为人们闲暇时光的重要放松方式之一。作为国内头部沙盒创意平台,《迷你世界》目前月活用户超过1亿,用户创作的场景地图超过2亿。持续增加的用户数,层出不穷的游戏地......
  • 2023年6月29日,测评机试题,Iterator底层,ListIterator底层,LinkedList底层
    1.机试题1、输入一个字符串,判断判断这个字符串是否对称例如abcba算对称abccba也算对称packagecom.wz.test01;importjava.util.Scanner;publicclasstest01{/***输入一个字符串,判断判断这个字符串是否对称*例如abcba算对称abccba也算对称*/......
  • 【SpringBoot】redis keys命令被禁用,spring缓存 @CacheEvict报异常
     背景项目使用springboot整合redis做缓存,代码中使用spring的缓存注解配置缓存策略。在jarvis上部署时接入了公司分布式redis平台代替本地的redis。结果测试的时候,新增一条记录时报了错,提示  ERRunknowncommand'keys' 。经排查发现问题原因:新增记录的函数上有@C......
  • redis
    目录一、Redis介绍和安装1.关系型数据库和非关系型数据库2.redis特点:3.安装redis二、redis普通链接和连接池二、redis普通链接和连接池2.1普通链接2.2连接池链接三、操作之String操作四、操作之Hash操作五、操作之List操作六redis管道七、django中使用redis八、django缓存补充......
  • redis cluster集群搭建
    redis6.2使用docker搭建rediscluster集群(3主3从)所有的操作都在根目录~/Developer/docker-compose/redis-cluster-6.2执行创建配置文件为了方便,写了个shell脚本,懒人必备createConfig.shforportin$(seq63816386);doconf_dir=./${port}/confconf_file=$......
  • Java基础-Day06
    Java基础-Day06多维数组如何理解二维数组?数组属于引用数据类型数组的元素也可以是引用数据类型一个一维数组A的元素如果还是一个一维数组类型的,则次数组称为二维数组二维数组的属性:int[][]arr3=newint[][]{{1,2,3,4},{4,5,6,7,8},{9,10}};Syste......
  • DVWA(0629)
    DVWA靶场搭建将文件拷入虚拟机修改数据库配置文件/dvwa_2.0.1/config/config.inc.php。$_DVWA['db_server']='127.0.0.1';$_DVWA['db_database']='dvwa_201';$_DVWA['db_user']='root';$_DVWA['db_pa......
  • XSS(0628)
    xss盲打#搜索框中搜索<script>alert(/xss/)</script><script>confirm(/xss/);</script><script>confirm('xss');</script><script>prompt('xss');</script>固定会话攻击进入xss平台创建项目项目配置完成后打开项目代码将代码插入......
  • 6月29日得物一面
    一、Object.prototype.toString()的调用对于Object.prototype.toString()方法,会返回一个形如"[objectXXX]"的字符串。如果对象的toString()方法未被重写,就会返回如上面形式的字符串。({}).toString();//=>"[objectObject]"Math.toString();//=>"[obj......
  • 「路飞项目10」redis
    1redis列表操作importredisconn=redis.Redis(decode_responses=True)1lpush(name,values)#在name对应的list中添加元素,每个新的元素都添加到列表的最左边#rpush(name,values)表示从右向左操作#如果name不存在的话会新增nameconn.lpush('hobbys','篮球')conn......