Redis什么是热Key问题以及如何解决热Key问题
目录
- 一、什么是热Key?
- 二、热Key产生的原因?
- 三、热点Key的危害?
- 四、如何识别热点Key?
- 五、如何解决热Key问题?
一、什么是热Key?
在Redis中,我们把访问频率高的Key,称为热Key。
比如突然又几十万的请求去访问redis中某个特定的Key,那么这样会造成redis服务器短时间流量过于集中,很可能导致redis的服务器宕机。
那么接下来对这个Key的请求,都会直接请求到我们的后端数据库中,数据库性能本来就不高,这样就可能直接压垮数据库,进而导致后端服务不可用。
二、热Key产生的原因?
1、用户消费的数据远大于生产的数据,如商品秒杀、热点新闻、热点评论等读多写少的场景。
双十一秒杀商品,短时间内某个爆款商品可能被点击/购买上百万次,或者某条爆炸性新闻等被大量浏览,此时会造成一个较大的请求Redis量,这种情况下就会造成热点Key问题。
2、请求分片集中,超过单台Redis服务器的性能极限。
在服务端读数据进行访问时,往往会对数据进行分片切分,例如采用固定Hash分片,hash落入同一台redis服务器,如果瞬间访问量过大,超过机器瓶颈时,就会导致热点 Key 问题的产生。
三、热点Key的危害?
1、缓存击穿,压垮redis服务器,导致大量请求直接发往后端服务,并且DB本身性能较弱,很可能进一步导致后端服务雪崩。
四、如何识别热点Key?
1、凭借个人经验,结合业务场景,判断哪些是热Key。
比如,双十一大促的时候,苹果手机正在秒杀,那么我们可以判断苹果手机这个sku就是热Key。
2、使用redis之前,在客户端写程序统计上报。
修改我们的业务代码,在操作redis之前,加入Key使用次数的统计逻辑,定时把收集到的数据上报到统一的服务进行聚合计算,这样我们就可以找到那些热点Key。缺点就是对我们的业务代码有一定的侵入性。
3、服务代理层上报。
这个要看具体公司redis集群架构是怎么样的,如果是在redis前面有一个代理层,那么我们可以在代理层进行收集上报,也是可以找到热点Key。如下这种架构:
这种方式确定也很明显, 每个公司的架构不一样,并非都有Proxy代理这一层。
4、使用redis自带的命令。
例如monitor、redis-cli加上--hotkeys选项等,不过这种方式执行起来很慢,可能会降低redis的处理请求的性能,慎用。
monitor命令:可以实时抓取出redis服务器接收到的命令,然后写代码统计出热Key,也有现成的分析工具可以使用。
5、redis节点抓包分析。
自己写程序监听端口,解析数据,进行分析。
五、如何解决热Key问题?
1、Redis集群扩容:增加分片副本,分摊客户端发过来的读请求;
2、使用二级缓存,即JVM本地缓存,减少Redis的读请求。
例如使用Caffeine+redis 实现二级缓存,先从本地缓存中取,取不到再去redis中去取。当然也可以使用其它框架,如ehcache、甚至一个HashMap都可以。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
redis监听key过期事件的详细步骤
目录 1.配置redis.conf文件 2. 配置一个key过期事件的监听器 3.订阅key过期事件 4.发起订阅 1.配置redis.conf文件 配置文件默认是#注释了的,改为notify-keyspace-events Ex 重启redis,记住指定redis.conf配置文件启动 如果是阿里云的redis,进入redis管理页面==>>左边导航栏的参数设置 2. 配置一个key过期事件的监听器 package com.shinedata.config.redis; import
-
Redis keys命令的具体使用
keys命令: DEL KEY:该命令用于在key存在时删除key DUMP KEY:序列化给定key,并返回被序列化的值 序列化:把对象转化为可传输的字节的序列过程称为序列化 反序列化:把字节序列还原为对象的过程称为反序列化 为什么需要序列化? 序列化的最终目的是为了对象可以跨平台传输,和进行网络传输.而我们进行跨平台存储和网络传输的方式就是IO,而IO支持的数据格式就是字节数组. 因为我们单方面的只把对象转成字节数组还不行,因为没有规则的字节数组我们是没办法把对象的本来面目还原回来的,所以我
-
redis删除指定key的实现步骤
1.打开redis目录并打开redis-cli.exe 如果直接输入get key会出现以下问题,表示需要认证,也就是需要登录用户 使用auth password登录即可 然后使用get key获取键的值 确认后,使用del key删除键中的值,可多个删除 到此这篇关于redis删除指定key的实现步骤的文章就介绍到这了,更多相关redis删除指定key内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
-
Redis key-value乱码的解决
redis 配置类 import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.
-
Redis什么是热Key问题以及如何解决热Key问题
目录 一.什么是热Key? 二.热Key产生的原因? 三.热点Key的危害? 四.如何识别热点Key? 五.如何解决热Key问题? 一.什么是热Key? 在Redis中,我们把访问频率高的Key,称为热Key. 比如突然又几十万的请求去访问redis中某个特定的Key,那么这样会造成redis服务器短时间流量过于集中,很可能导致redis的服务器宕机. 那么接下来对这个Key的请求,都会直接请求到我们的后端数据库中,数据库性能本来就不高,这样就可能直接压垮数据库,进而导致后端服务不可用. 二.热
-
Redis中什么是Big Key(大key)问题?如何解决Big Key问题?
目录 一.什么是Big Key? 二.Big Key产生的场景? 三.Big Key的危害? 四.如何识别Big Key? 五.如何解决Big Key问题? 补充知识:key设计 总结 一.什么是Big Key? 通俗易懂的讲,Big Key就是某个key对应的value很大,占用的redis空间很大,本质上是大value问题.key往往是程序可以自行设置的,value往往不受程序控制,因此可能导致value很大. redis中这些Big Key对应的value值很大,在序列化/反序列化过程中花
-
redis中热key问题该如何解决
引言 讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完...(以下省略一万字). 今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决. 其实热key问题说来也很简单,就是瞬间有几十万的请求去访问redis上某个固定的key,从而压垮缓存服务的情情况. 其实生活中也是有不少这样的例子.比如XX明星结婚.那么关于XX明星的Key就会瞬间增大,就会出现热数据问题. ps: hot key和big key问题,大家一定要有所了解. 本文预计分为如下几个部分 热key问题 如何发
-
Redis使用元素删除的布隆过滤器来解决缓存穿透问题
目录 前言 缓存雪崩 解决方案 缓存击穿 解决方案 缓存穿透 解决方案 布隆过滤器(Bloom Filter) 什么是布隆过滤器 位图(Bitmap) 哈希碰撞 布隆过滤器的2大特点 fpp 布隆过滤器的实现(Guava) 布隆过滤器的如何删除 带有计数器的布隆过滤器 总结 前言 在我们日常开发中,Redis使用场景最多的就是作为缓存和分布式锁等功能来使用,而其用作缓存最大的目的就是为了降低数据库访问.但是假如我们某些数据并不存在于Redis当中,那么请求还是会直接到达数据库,而一旦在同一时间大
-
Redis中缓存穿透/击穿/雪崩问题和解决方法
目录 缓存问题 1. 缓存穿透---查不到 解决方案 2. 缓存击穿---量太大,缓存过期 解决方案 3. 缓存雪崩 解决方案 缓存问题 1. 缓存穿透---查不到 缓存穿透是指用户想查询一个数据,发现Redis中没有,也就是缓存没有命中,就向持久性数据库发起查询,发现数据库也没有这个数据,于是查询失败了. 当用户请求很多的情况下,缓存没有命中,数据库也没有数据,会给数据库造成很大的压力,这就是缓存穿透. 解决方案 第一种解决方案:使用布隆过滤器 使用布隆过滤器之后,将存储的数据放入布隆过滤器中
-
Redis击穿穿透雪崩产生原因分析及解决思路面试
目录 1.前言 2.问题起因 3.应对击穿的处理思路 4.穿透 5.雪崩 结束 1.前言 大家都知道,计算机的瓶颈之一就是IO,为了解决内存与磁盘速度不匹配的问题,产生了缓存,将一些热点数据放在内存中,随用随取,降低连接到数据库的请求链接,避免数据库挂掉.需要注意的是,无论是击穿还是后面谈到的穿透与雪崩,都是在高并发前提下,比如当缓存中某一个热点key失效. 2.问题起因 有两个主要原因: 1.Key过期: 2.Key被页面置换淘汰. 对于第一个原因是因为在Redis中,Key有过期时间,如果某
-
linux系统重装导致免密码key登录失败的解决方法
在一台linux机器上ssh远程另外一台linux服务器时候出现: [root@server .ssh]# ssh 192.0.50.80 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-
Redis 中spark参数executor-cores引起的异常解决办法
Redis 中spark参数executor-cores引起的异常解决办法 报错信息 Unexpected end of stream 16/10/11 16:35:50 WARN TaskSetManager: Lost task 63.0 in stage 3.0 (TID 212, gzns-arch-spark04.gzns.iwm.name): redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end
-
关于Webpack dev server热加载失败的解决方法
利用Webpack dev server作为热加载服务器时,出现以下错误: XMLHttpRequest cannot load http://localhost:8080/dist/06854fc8988da94501a9.hot-update.json. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not
-
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
本文实例讲述了Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法.分享给大家供大家参考,具体如下: ①在项目根目录放置.env文件 .env APP_NAME=Laravel APP_ENV=local APP_KEY= APP_DEBUG=true APP_LOG_LEVEL=debug APP_URL=http://localhost DB_CONNECTION=mysql
随机推荐
- 获取字符串数组的最后一段字符
- Thinkphp微信公众号支付接口
- “按键精灵” 轻松解放你的双手
- 使用正则表达式的格式化与高亮显示json字符串
- JavaScript数据类型之基本类型和引用类型的值
- iOS遍历集合(NSArray、NSDictionary、NSSet)的方法总结
- Java字母大小写转换的方法
- 使用Java进行Json数据的解析(对象数组的相互嵌套)
- 删除DataTable重复列,只删除其中的一列重复行的解决方法
- phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
- PHP 字符截取 解决中文的截取问题,不用mb系列
- Java学习之反射机制及应用场景介绍
- MyBatis入门介绍(超简单)
- JS中showModalDialog 的使用解析
- sql with as用法详解
- jquery插件pagination实现无刷新ajax分页
- Android编程实现TCP、UDP客户端通信功能示例
- Spring MVC下 bootStrap服务器分页代码
- JavaScript数据操作_浅谈原始值和引用值的操作本质
- 基于C++ Lambda表达式的程序优化