暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

缓存失效问题

293

缓存击穿:

    某个热点数据的缓存key过期了,在key在缓存过期的⼀刻,同时有⼤量的请求到来,这些请求都会击穿到DB,造成瞬时DB请求过⼤。


解决思路:

    设置热点数据不过期,定时任务定时更新缓存,或者设置互斥锁(第一个请求发现缓存不存在,先加锁去数据库中查找,并且将查到的数据放入缓存以后再将锁释放)


定时任务更新缓存的解决思路:


设置互斥锁解决思路:


互斥锁伪代码:

    input: 访问热点数据的请求到来
    process:
    Object value = get(key) from redis缓存
    if(value!=null){
    return value;
    }else{
    int lock = get(lock) from redis分布式锁
    if(lock != null){
    //加锁成功
    try{
    //最大程度保证数据库访问的请求尽可能少
    Object value = get(key) from redis缓存
    if(value != null)
    return value
    value = get(key) from 数据库
    set(value,timeout) to redis缓存
    return value
    }finally{
    release(lock) in redis分布式锁
    }
    }else{
    //加锁不成功
    解法1:立即返回空置,即允许部分用户请求失败
    解法2: 阻塞等待
    }
    }


    缓存穿透:

        查询显然不可能存在的key,比如缓存了优惠券id,攻击者总是查询优惠券id=-1的数据,显然是不可能存在的,造成请求直接打到了数据库。

    解决思路:

        增加过滤校验的功能,在网关层如果发现数据显然不存在那么就直接拒绝方法。


    缓存雪崩:

        ⼤量的key设置了相同的过期时间,导致在缓存在同⼀时刻全部失效,造成瞬时DB请求增⼤、压⼒骤增,引起雪崩

    解决思路:

        存数据的过期时间设置随机,防⽌同⼀时间⼤量数据过期现象发⽣,设置热点数据永远不过期,定时任务定时更新


    文章转载自梁霖编程工具库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论