• Redis缓存雪崩、击穿、穿透的问题和解决方式


    雪崩:比如现在redis的失效时间都是12小时,每天0点,12点刷新。某一天公司0点有个秒杀活动,假设当时一秒有1.1W个请求,本来缓存一秒可以抗住1W个请求,但是缓存当时所有的key都失效了,1.1W个请求都落在了数据库上,数据库肯定扛不住,可能DBA还没反应过来数据库就已经挂掉了。同一时间redis大面积失效就跟没有一样,需要使用redis来做缓存的数量级别请求落在数据库是致命的,如果挂掉的是一个用户服务的库,所有依赖这个库的接口都会报错。一旦发生雪崩了重起也是没有用的,因为重启之后redis还是没有缓存,此时还是相同级别的请求落在数据库。

    解决方法: 多级缓存(请求先从2级缓存里取,2级缓存没有就去1级缓存取,1级缓存再没有再访问数据库,1,2级缓存过期时间不一致)/缓存过期时间随机(不要在有大量请求的时候缓存失效)

    穿透:请求的数据在缓存和数据库里都没有,比如请求id为-1或特别大的数字,如果不对参数做校验,数据库id都是大于0的,只要攻击者一直使用小于0的id请求,每次都能绕开缓存打到数据库,数据库也查不到,高并发情况下数据库容易挂掉

    解决方法:参数做基础校验(比如id<=0直接return)/redis的布隆过滤器(Redis自带的,使用高效的数据结构和算法判断key在数据库是否存在,不存在直接return)

    击穿:击穿和雪崩有点类似,缓存雪崩是大面积缓存失效打挂了数据库,击穿是缓存里某个key非常热点,不停的扛着高并发,大并发集中对这一个点进行访问,当这个key失效的瞬间,持续的大并发就击破缓存直接请求数据库,就像一块完好无损的冰上凿开了一个洞(比如某个上新商品用户会不停的访问该商品,该商品就是一个热点)

    解决方法:设置热点数据永不过期/加互斥锁(该热点缓存即将过期前的时间使用互斥锁锁住,其他线程进入就绪队列等待该线程释放锁,查询完毕新数据放入redis之后再放开锁,其他线程此时进行直接走缓存)

    不和别人一样,不复制只真正理解
  • 相关阅读:
    Docker本地镜像管理之Docker Registry
    特征工程(一)数据清理
    特征工程(二)数据转换
    特征工程(三)特征选择
    特征工程(四)特征抽取
    【转】前端jQuery、Bootstrap、Layui和响应式布局
    【ASP.NET Core】配置应用程序地址的N多种方法
    设计模式: 策略模式+工厂模式+模板模式应用实践
    开发者平台
    Azure API Management (4) 配置自托管网关
  • 原文地址:https://www.cnblogs.com/Vinlen/p/13323427.html
Copyright © 2020-2023  润新知