美文网首页
缓存穿透和缓存雪崩问题

缓存穿透和缓存雪崩问题

作者: 砌月东谷 | 来源:发表于2021-07-04 15:07 被阅读0次

    1、缓存穿透

    缓存穿透是指大量查询一些数据库中不存在的数据,从而影响数据库的性能,例如,redis等AKV存储结构的中间件可以作为MySQL等数据库的缓存组件,但如果某些数据没有被redis缓存却被大量查询,就会给mysql带来巨大压力,单机MySQL最大能够承受的并发连接数只有一千左右,因此无论是设计失误(如某个高频访问的缓存对象过期)、恶意攻击(如频繁查询某个不存在的数据),还是偶然时间(如由于社会新闻导致某个热点的搜索量大增)等,都可能让MySQL遭受缓存穿透,从而宕机。

    理解了缓存穿透的原因后,解决思路就已经明确了,举例如下

    1. 拦截非法的查询请求,仅将合理的请求发送给mysql。例如,可以使用验证码,ip限制等手段限制恶意攻击,并用敏感词过滤器等拦截不合理的非法查询
    2. 缓存空对象。例如,假设在苹果13上市后,可能会导致大量用户搜索苹果13,但此时redis和MySQL还没有苹果13这个词,一种解决方法就是将数据库中不存在的苹果13也缓存在redis中,如key=苹果13,value="",之后,当用户再次搜索苹果13时,就可以直接从redis中拿到结果,从而避免对MySQL的访问,同时为了减少redis对大量空对象的缓存,可以适当减少空对象的过期时间
    3. 建立数据标识仓库。将MySQL中的所有数据的name值都映射成Hash值,例如,可以将“商品表”中的商品名“苹果13”映射成MD5计算出来的Hash值,然后再将全部name的hash值放入redis中,从而构建出一个“数据库中所有可查数据的Hash仓库”,之后,每次在查询MySQL之前都会先查询这个hash仓库,如果要查询数据的hash值存在于仓库中,再进入MySQL做真实的查询,如果不存在则直接返回,需要注意的是,由于不同数据的hash值在概率上可能相同,因此可能会漏掉对个别数据的拦截

    2、缓存雪崩

    除了缓存穿透外,在使用缓存时还需要考虑缓存雪崩的情况,缓存雪崩是指由于某种原因造成redis突然失效,造成MySQL瞬间压力剧增,进而严重影响MySQL性能,甚至造成MySQL服务宕机,以下是造成缓存雪崩的两个常见原因

    ·1 redis重启

    2 redis大量缓存对象都设置了相同的过期时间

    为避免缓存雪崩的发送,可参考以下解决方案

    1. 搭建redis集群,保证高可用
    2. 避免大量缓存对象的key集中失效,尽量让过期时间分配均匀一点,例如,可以将各个缓存的过期时间乘以一个随机数
    3. 通过队列、锁机制等控制并发访问MySQL的线程数

    相关文章

      网友评论

          本文标题:缓存穿透和缓存雪崩问题

          本文链接:https://www.haomeiwen.com/subject/qzimultx.html