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 请求就会走限流逻辑



  • 相关阅读:
    commons-fileupload源码学习心得
    commons-io源码阅读心得
    java反射机制
    构建简单的socket连接池
    maven主仓库中找不到restlet的解决办法
    修改eclipse中web项目的server部署路径
    Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project '项目名'
    JVM中的Stack和Heap
    JVM工作原理和特点
    spring mvc 3.1的自动注入参数遇到的问题
  • 原文地址:https://www.cnblogs.com/sunang/p/11352680.html
Copyright © 2011-2022 走看看