您当前的位置:首页 > 电脑百科 > 数据库 > Redis

达到物理网卡上限,突然几十万的请求访问Redis的某个key如何解决

时间:2019-09-03 14:01:21  来源:  作者:

 

热Key问题

所谓热key问题就是,突然有几十万的请求去访问redis上的某个特定key。那么,这样会造成流量过于集中,达到物理网卡上限,从而导致这台redis的服务器宕机。

那接下来这个key的请求,就会直接怼到你的数据库上,导致你的服务不可用。

怎么发现热key

方法一:凭借业务经验,进行预估哪些是热key

其实这个方法还是挺有可行性的。比如某商品在做秒杀,那这个商品的key就可以判断出是热key。缺点很明显,并非所有业务都能预估出哪些key是热key。

方法二:在客户端进行收集

这个方式就是在操作redis之前,加入一行代码进行数据统计。那么这个数据统计的方式有很多种,也可以是给外部的通讯系统发送一个通知信息。缺点就是对客户端代码造成入侵。

方法三:在Proxy层做收集

有些集群架构是下面这样的,Proxy可以是Twemproxy,是统一的入口。可以在Proxy层做收集上报,但是缺点很明显,并非所有的redis集群架构都有proxy。

达到物理网卡上限,突然几十万的请求访问Redis的某个key如何解决

 

方法四:用redis自带命令

(1)monitor命令,该命令可以实时抓取出redis服务器接收到的命令,然后写代码统计出热key是啥。当然,也有现成的分析工具可以给你使用,比如redis-faina。但是该命令在高并发的条件下,有内存增暴增的隐患,还会降低redis的性能。

(2)hotkeys参数,redis 4.0.3提供了redis-cli的热点key发现功能,执行redis-cli时加上–hotkeys选项即可。但是该参数在执行的时候,如果key比较多,执行起来比较慢。

方法五:自己抓包评估

Redis客户端使用TCP协议与服务端进行交互,通信协议采用的是RESP。自己写程序监听端口,按照RESP协议规则解析数据,进行分析。缺点就是开发成本高,维护困难,有丢包可能性。

以上五种方案,各有优缺点。根据自己业务场景进行抉择即可。那么发现热key后,如何解决呢?

如何解决

目前业内的方案有两种

(1)利用二级缓存

比如利用ehcache,或者一个HashMap都可以。在你发现热key以后,把热key加载到系统的JVM中。

针对这种热key请求,会直接从jvm中取,而不会走到redis层。

假设此时有十万个针对同一个key的请求过来,如果没有本地缓存,这十万个请求就直接怼到同一台redis上了。

现在假设,你的应用层有50台机器,OK,你也有jvm缓存了。这十万个请求平均分散开来,每个机器有2000个请求,会从JVM中取到value值,然后返回数据。避免了十万个请求怼到同一台redis上的情形。

(2)备份热key

这个方案也很简单。不要让key走到同一台redis上不就行了。我们把这个key,在多个redis上都存一份不就好了。接下来,有热key请求进来的时候,我们就在有备份的redis上随机选取一台,进行访问取值,返回数据。

假设redis的集群数量为N,步骤如下图所示

达到物理网卡上限,突然几十万的请求访问Redis的某个key如何解决

 

注:不一定是2N,你想取3N,4N都可以,看要求。

伪代码如下

const M = N * 2
//生成随机数
random = GenRandom(0, M)
//构造备份新key
bakHotKey = hotKey + “_” + random
data = redis.GET(bakHotKey)
if data == NULL {
 data = GetFromDB()
 redis.SET(bakHotKey, expireTime + GenRandom(0,5))
}

业内方案

OK,其实看完上面的内容,大家可能会有一个疑问。

有办法在项目运行过程中,自动发现热key,然后程序自动处理么?

嗯,好问题,那我们来讲讲业内怎么做的。其实只有两步

  1. 监控热key
  2. 通知系统做处理

监控热key

那Hermes-SDK包用来干嘛?

就是做热点发现本地缓存

从监控的角度看,该包对于Jedis-Client的每次key值访问请求,Hermes-SDK 都会通过其通信模块将key访问事件异步上报给Hermes服务端集群,以便其根据上报数据进行“热点探测”。

当然,这只是其中一种方式,有的公司在监控方面用的是方式五:自己抓包评估

具体是这么做的,先利用flink搭建一套流式计算系统。然后自己写一个抓包程序抓redis监听端口的数据,抓到数据后往kafka里丢。

接下来,流式计算系统消费kafka里的数据,进行数据统计即可,也能达到监控热key的目的。

通知系统做处理

在监控到热key后,Hermes服务端集群会通过各种手段通知各业务系统里的Hermes-SDK,告诉他们:"老弟,这个key是热key,记得做本地缓存。"

于是Hermes-SDK就会将该key缓存在本地,对于后面的请求。Hermes-SDK发现这个是一个热key,直接从本地中拿,而不会去访问集群。

除了这种通知方式以外。我们也可以这么做,比如你的流式计算系统监控到热key了,往zookeeper里头的某个节点里写。然后你的业务系统监听该节点,发现节点数据变化了,就代表发现热key。最后往本地缓存里写,也是可以的。

通知方式各种各样,大家可以自由发挥。本文只是提供一个思路。



Tags:Redis   点击:()  评论:()
声明:本站部分内容来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除,谢谢。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
Redis概述Redis的作者Salvatore Sanfilippo在开发一个叫做LLOOGG的网站时,需要实现一个高性能的队列功能,最开始是使用MySQL实现,但是无论怎么优化SQL语句也没办法提高网站的性...【详细内容】
2020-07-05   Redis  点击:(0)  评论:(0)  加入收藏
缓存设计设计Key的注意事项注意以下几点简单、简洁、可读、无特殊符号、分组。简单:不要过长,太长会占更多内存简洁:清晰明了、不拖泥带水可读:可读性良好,知道是什么不使用特殊...【详细内容】
2020-07-04   Redis  点击:(1)  评论:(0)  加入收藏
这几天有幸接到华为二面的面试通知,整个过程大概有九十分钟,面试官真的问的东西很全面的,如果不做足准备是肯定不可以的(当时也问到了多概念的问题)。面试之后,将这些面试题目做了...【详细内容】
2020-06-27   Redis  点击:(0)  评论:(0)  加入收藏
自我介绍我, Redis ,内存数据库,有着比 memcached 更强大的功能。现在已经是这个领域的头把金交椅。常规数据库这里所说的常规数据库是指基于硬盘读写的数据库,比如 Oracle , My...【详细内容】
2020-06-26   Redis  点击:(0)  评论:(0)  加入收藏
来源 | rrd.me/gmRQbRedis 在当前的技术社区里是非常热门的。从来自 Antirez 一个小小的个人项目到成为内存数据存储行业的标准,Redis已经走过了很长的一段路。随之而来的一...【详细内容】
2020-06-25   Redis  点击:(2)  评论:(0)  加入收藏
Redis 主从复制的作用中有这么一句话“主从复制是高可用的基石”,那什么是高可用呢?高可用就是减少系统不能提供的时间,也就是常听到的以 6 个 9 为基准。实现高可用必不可少的...【详细内容】
2020-06-24   Redis  点击:(0)  评论:(0)  加入收藏
小米的Redis使用规模很大,现在有数万个实例,并且每天有百万亿次的访问频率,支撑了几乎所有的产品线和生态链公司。之前所有的Redis都部署在物理机上,也没有做资源隔离,给管理治理...【详细内容】
2020-06-21   Redis  点击:(3)  评论:(0)  加入收藏
redis 主从复制 master 节点提供数据,也就是写。slave 节点负责读。不是说master 分支不能读数据,也能只是我们希望将读写进行分离。slave 是不能写数据的,只能处理读请求主从...【详细内容】
2020-06-21   Redis  点击:(0)  评论:(0)  加入收藏
1.GitHub下载地址: https://github.com/MicrosoftArchive/redis/tags 2.下载后的zip解压到磁盘下改名为redis,我放在D盘根目录下了便于操作,后续dos命令操作 以D盘为例 3.首...【详细内容】
2020-06-20   Redis  点击:(0)  评论:(0)  加入收藏
Hello,Redis!我们相处已经很多年了,从模糊的认识到现在我们已经深入结合,你的好我一直都知道也一直都记住,能否再让我多问你的几个问题,让我更加深入的去了解你。 图片来自包图网...【详细内容】
2020-06-19   Redis  点击:(0)  评论:(0)  加入收藏
这一节我们先简单聊一下redis配置与版本注意事项,涉及到配置,键的过期、32位redis和64位的区别,后续我们再来了解Redis LRU键的驱逐策略以及具体的优化策略。1、配置redis如果...【详细内容】
2020-06-10   Redis  点击:(1)  评论:(0)  加入收藏
一、什么是Redis主从复制?主从复制就是现在有两台redis服务器,把一台redis的数据同步到另一台redis数据库上。前者称之为主节点(master),后者为从节点(slave)。数据是只能master往...【详细内容】
2020-06-02   Redis  点击:(2)  评论:(0)  加入收藏
大家有没有遇到这样的情况?使用Redis很久了,但一直找不到一款合适的Redis桌面客户端。一直在用RedisDeskManager,但只能使用到0.9.0版本,不能继续升级?好了,今天给大家分享一款免...【详细内容】
2020-05-21   Redis  点击:(56)  评论:(0)  加入收藏
项目介绍RedisLettuceClient是一款基于java swing的跨平台的Redis桌面管理工具,该软件支持单机、集群模式连接,RedisLettuceClient遵循GPL-3.0开源协议,禁止二次开发打包发布盈...【详细内容】
2020-05-18   Redis  点击:(2)  评论:(0)  加入收藏
“叮……”,美好的周六就这么被一阵钉钉消息吵醒了。业务组的同学告诉我说很多用户的帐号今天被强制下线。我们的帐号系统正常的逻辑是用户登录一次后,token的有...【详细内容】
2020-05-14   Redis  点击:(2)  评论:(0)  加入收藏
环境: 1、系统:Centos 7 2、Tengine 2.1.2 3、PHP 7.0 4、Mysql 5.7 5、supervisord 6、redis一、安装依赖包yum udateyum -y install gcc gcc-c++ autoconf automakeyum -y i...【详细内容】
2020-05-12   Redis  点击:(13)  评论:(0)  加入收藏
概述今天主要介绍一个Redis内存分析工具--RDR,主要是平时用来分析redis的rdbfile,下面一起来看看吧~github:https://github.com/xueqiu/rdr一、RDR 简介RDR 是解析 redis rdbf...【详细内容】
2020-05-11   Redis  点击:(13)  评论:(0)  加入收藏
点赞功能是目前app开发基本的功能今天我们就来聊聊 点赞、评论、收藏等这些场景的db数据库设计问题, 1. 我们先来看看场景的需求:a. 显示点赞数量b. 判断用户是否点过赞,用于去...【详细内容】
2020-05-11   Redis  点击:(1)  评论:(0)  加入收藏
简介redis 客户端连接限制是指,同时有多少客户端连接 redis 服务。redis连接数限制会受到系统process file的限制, 报错一旦客户端连接数达到最大客户端的限制,就会报错:max nu...【详细内容】
2020-05-08   Redis  点击:(7)  评论:(0)  加入收藏
一、Redis简介Redis作者: 意大利人 Salvatore Sanfilippo(网名 Antirez) 开发。Antirez 不仅帅的不像实力派,也非常有趣。Antirez 今年已经四十岁了,依旧在孜孜不倦地写代码,为 Re...【详细内容】
2020-05-03   Redis  点击:(8)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条