Redis什么是热Key问题以及如何解决热Key问题

 更新时间:2022年11月18日 15:30:16   作者:每天都要进步一点点  
这篇文章主要介绍了Redis什么是热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都可以。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL的InnoDB存储引擎的数据页结构详解

    MySQL的InnoDB存储引擎的数据页结构详解

    这篇文章主要为大家详细介绍了MySQL的InnoDB存储引擎的数据页结构,,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • MySQL主从搭建(多主一从)的实现思路与步骤

    MySQL主从搭建(多主一从)的实现思路与步骤

    通过MySQL主从配置,可以实现读写分离减轻数据库压力,最近正好遇到这个功能,所以这篇文章主要给大家介绍了关于MySQL主从搭建(多主一从)的实现思路与步骤,需要的朋友可以参考下
    2021-05-05
  • SQL去重方法汇总

    SQL去重方法汇总

    这篇文章主要给大家分享了SQL去重方法汇总,在使用SQL提数的时候,常会遇到表内有重复值的时候,比如我们想得到 uv (独立访客),就需要做去重。下面我们就来看看去重都有哪些方法吧
    2022-01-01
  • MySQL语句中的主键和外键使用说明

    MySQL语句中的主键和外键使用说明

    本文主要介绍了简述MySQL主键和外键使用及说明,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2023-04-04
  • mysql学习笔记之完整的select语句用法实例详解

    mysql学习笔记之完整的select语句用法实例详解

    这篇文章主要介绍了mysql学习笔记之完整的select语句用法,结合实例形式详细分析了mysql select语句各种常见参数、使用方法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • MySQL中where 1=1方法的使用及改进

    MySQL中where 1=1方法的使用及改进

    这篇文章主要介绍了MySQL中where 1=1方法的使用及改进,文章主要通对where 1 = 1的使用及改进展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • 图文并茂地讲解Mysql索引(index)

    图文并茂地讲解Mysql索引(index)

    在关系数据库中,索引是一种单独的、物理的数对数据库表中一列或多列的值进行排序的一种存储结构,下面这篇文章主要给大家介绍了关于Mysql索引(index)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • mysql中锁机制的最全面讲解

    mysql中锁机制的最全面讲解

    大概几个月之前项目中用到事务,需要保证数据的强一致性,期间也用到了mysql的锁,所以本文打算总结一下mysql的锁机制,这篇文章主要给大家介绍了关于mysql中锁机制的相关资料,需要的朋友可以参考下
    2021-09-09
  • MySQL中关于超键和主键及候选键的区别

    MySQL中关于超键和主键及候选键的区别

    这篇文章主要介绍了MySQL中关于超键和主键及候选键的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • ubuntu下设置mysql自动备份的例子

    ubuntu下设置mysql自动备份的例子

    ubuntu下设置mysql自动备份的例子,供大家学习参考
    2013-01-01

最新评论