面试官问你什么是Redis缓存雪崩、缓存穿透和缓存击穿?该如何处理?

面试官问你什么是Redis缓存雪崩、缓存穿透和缓存击穿?该如何处理?

缓存雪崩

缓存雪崩,指面对用户突发的大量请求时,出现以下情况:

  • Redis缓存服务器无法处理这么多请求,服务器压力过大宕机
  • Redis缓存服务器大量缓存同一时间内过期

导致大量用户请求,都去访问数据库,数据库面对这么多请求必然扛不住,然后就挂了

面试官问你什么是Redis缓存雪崩、缓存穿透和缓存击穿?该如何处理?_第1张图片

解决方案:

  • Redis 高可用,搭建Redis主从,哨兵,Redis集群。避免全部崩溃
  • Redis持久化,崩溃后重启,从磁盘中加载数据,恢复数据
  • 使用hystrix 限流&降级 ,保证数据库不挂
  • 避免缓存同一时间内失效
    • 方式一:定时缓存,避免大量用户请求时,缓存都失效了
    • 方式而(推荐):将缓存过期时间分散开,避免同一时间内,大量缓存都失效了

缓存穿透

缓存穿透,指用户大量请求,访问Redis,Redis中没有缓存,查询数据,数据库中也没有缓存。导致数据库压力过大,如果不处理严重导致服务宕机

面试官问你什么是Redis缓存雪崩、缓存穿透和缓存击穿?该如何处理?_第2张图片

解决方案:

  • 每次查询数据库,只要没有查到,就写入空值到到缓存,设置一个过期时间。下次有相同的请求,直接返回缓存中的数据

缓存击穿

缓存击穿也叫缓存热点,是指Redis一个key非常热点,非常频繁的访问,不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。导致数据库压力过大,如果不处理严重导致服务宕机

面试官问你什么是Redis缓存雪崩、缓存穿透和缓存击穿?该如何处理?_第3张图片

解决方案:

  • 若缓存数据基本不会发生变化,可以把缓存过期时间设置为永久

  • 若缓存更新不是频繁,且刷新缓存整个流程耗时较少情况下

    • 1.使用本地互斥锁
    • 2.使用Redis中间件实现分布式互斥锁

    保证少量线程请求,能访问数据库,并缓存。其余线程在锁释放后可以访问缓存

  • 若缓存更新频繁,且刷新缓存整个流程耗时较长情况下,可以使用定时任务线程

    • 1.在缓存快要过期时延长过期时间
    • 2.在缓存快要过期时,重新缓存

    保证请求到来时,可访问

你可能感兴趣的:(redis,缓存,数据库,中间件)