• 面试系列Redis:缓存穿透、击穿、雪崩的解决方案


    问题1:缓存穿透

    缓存穿透是指缓存和数据库上都没有的数据,导致所有请求都落到数据库上,造成数据库短时间内承受大量的请求而导致宕机

    解决:

    1. 使用布隆过滤器:将查询的参数都存储到一个 bitmap 中,在查询缓存前,如果 bitmap 存在则进行底层缓存的数据查询,如果不存在则进行拦截,不再进行缓存的数据查询
    2. 缓存空对象:如果数据库查询的为空,则依然把这个数据缓存并设置过期时间,当多次访问的时候可以直接返回结果,避免造成多次访问数据库,但要保证当数据库有数据时及时更新缓存。

    问题2:缓存击穿

    缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),就会导致所有请求都落到数据库上,造成数据库段时间内承受大量的请求而宕机

    解决:

    1. 设置热点数据永不过期
    2. 可以使用互斥锁更新,保证同一进程中针对同一个数据不会并发请求到 DB,减小DB的压力
    3. 使用随机退避方式,失效时随机 sleep 一个很短的时间,再次查询,如果失败再执行更新

    问题3:缓存雪崩

    缓存雪崩是指大量缓存同一时间内大面积失效,后面的请求都会落到数据库上,造成数据库段时间无法承受大量的请求而宕掉

    解决:

    1. 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个Key只允许一个线程查询和写缓存,其他线程等待
    2. 通过缓存 reload 机制,预先去更新缓存,在即将发生高并发访问前手动触发加载缓存
    3. 对于不同的key设置不同的过期时间,让缓存失效的时间点尽量均匀,比如我们可以在原有的失效时间基础上增加一个随机值,比如1~5分钟随机,这样每一个缓存的过期时间的重复率就会降低。
    4. 设置二级缓存,或者双缓存策略。
  • 相关阅读:
    数据结构—线性表(下)
    kubernetes资源管理
    WPF由文本框输入的内容动态渲染下拉框
    Mysql 的高可用详解
    内卷下的智能投影行业,未来何去何从?
    如何停止一个线程?
    11. 盛最多水的容器
    复现Multi-Adapter RGBT Tracking(二)——Tracking
    Tomcat:部署及优化
    漏洞复现--蓝凌EIS智慧协同平台任意文件上传
  • 原文地址:https://blog.csdn.net/CancerKing/article/details/128045479