zoukankan      html  css  js  c++  java
  • Redis学习笔记#9:缓存穿透、缓存击穿、缓存雪崩解决方案

    缓存穿透

    表示恶意用户模拟请求很多缓存中不存在的数据,由于缓存中都没有,导致这些请求短时间内直接落在了数据库上,导致数据库异常。

    解决方案:

    1.缓存空值,之所以发生穿透,是因为缓存中没有存储这些数据的key,从而每次都查询数据库 我们可以为这些key在缓存中设置对应的值为null,后面查询这个key的时候就不用查询数据库了 当然为了健壮性,我们要对这些key设置过期时间,以防止真的有数据

    2.使用布隆过滤,将所有可能存在的数据缓存放到布隆过滤器中,当访问不存在的缓存时迅速返回避免缓存及DB挂掉。

    public String getByKey(String key) {
     // 通过key获取value
     String value = redisService.get(key);
     if (StringUtil.isEmpty(value)) {
     if (bloomFilter.mightContain(key)) {
     value = userService.getById(key);
     redisService.set(key, value);
     return value;
     } else {
     return null;
     }
     }
     return value;
    }
    

     

    缓存击穿

    在高并发的情况下,大量的请求同时查询同一个key时,此时这个key正好失效了,就会导致同一时间,这些请求都会去查询数据库,这样的现象我们称为缓存击穿

    解决方案:

    采用分布式锁,只有拿到锁的第一个线程去请求数据库,然后插入缓存,当然每次拿到锁的时候都要去查询一下缓存有没有

     

    缓存雪崩

    缓存在同一时间内大量键过期(失效),接着来的一大波请求瞬间都落在了数据库中导致连接异常。

    事前
    ①在设置key的过期时间时,在过期时间上加上一个随机值,防止大量key同时过期。
    ②搭建高可用的缓存架构,比如使用 哨兵+主从 结构或者使用 cluster模式,避免缓存系统出现故障。
    ③可以在系统中使用ehcache做个小缓存,防止redis崩掉之后,还有一部分缓存。
    事中
    ①对系统请求进行降级和限流,防止数据库之间崩掉。
    事后
    赶快使用redis持久化的数据,快速恢复缓存数据
     
    1.采用集群,降低服务宕机的概率
    2.ehcache本地缓存 + Hystrix限流&降级
    ehcache 本地缓存的目的也是考虑在 Redis Cluster 完全不可用的时候,ehcache 本地缓存还能够支撑一阵
    使用 Hystrix进行限流 & 降级 ,比如一秒来了5000个请求,我们可以设置假设只能有一秒 2000个请求能通过这个组件,那么其他剩余的 3000 请求就会走限流逻辑



  • 相关阅读:
    关于读者来信的一些思考
    serializeArray()与serialize()的区别
    懒人代码-顶部栏
    $.ajax()方法详解
    JavaScript(js)对象常用操作,JS操作JSON总结
    js 获取手机浏览器类型,修改css文件的class的值
    阻止在极短的时间重复执行某个函数
    android WebViewClient和WebChromeClient
    java枚举使用详解
    android-async-http
  • 原文地址:https://www.cnblogs.com/sunang/p/11352680.html
Copyright © 2011-2022 走看看