• Redis 缓存穿透、雪崩、击穿以及相关解决方案


    缓存流程:

    缓存穿透:

    1. 什么是缓存穿透:是指 redis 和数据库都没有这个数据,大量请求该数据造成数据库挂掉,该请求一般是非正常用户

    2. 解决方案:

      1. 布隆过滤器:将数据库中所有的查询条件放入布隆过滤器中,当大量的请求过来的时候, redis 里面没有,再去布隆过滤器进行查,如果请求存在,则继续查;如果不存在,直接丢弃。
      2. 第一次请求打到数据库,无法是否能查询到数据还是空,都返回给 redis 做缓存,防止二次请求穿透 redis
      3. IP 拉黑
      4. 参数合法性校验,参数不合法,直接返回

    缓存雪崩

    1. 什么是缓存雪崩:redis 缓存中 key 同一时间大量失效,大量的请求(不同key)全部打到数据库,就像雪崩来了一样

    2. 解决方案:

      1. 设置缓存失效时间,不要在同一时间失效,在设置缓存的时候随机初始化有效时间,这样就不会让所有的缓存同时失效
      2. 不设置失效时间,让缓存永远不失效
      3. 跑定时任务,定时刷缓存,然后设置新的失效时间
      4. redis 集群,热点 key 部署到不同节点的 redis 上

    缓存击穿

    1. 什么是缓存击穿:在高并发情况下,如果好多请求都在查询一个 Key ,这个 key 因为某些原因失效了,这样就会导致大量的请求直接打到数据库上了,造成数据库挂掉

    2. 解决方案:

      1. 缓存永远不过期
      2. 分布式锁:第一个请求拿到了锁,到数据库获取数据,并缓存到 redis,其他请求被阻塞,睡眠几毫秒然后再次请求 redis ,这时的 redis 已经有缓存,直接返回
      3. 单体应用使用互斥锁

    什么是布隆过滤器?

    参考:
    https://www.bilibili.com/video/BV1f5411b7ux
    https://mp.weixin.qq.com/s/SlfLgsfbvytxNS46fTFUdA

  • 相关阅读:
    Windows桌面开发之窗口
    imes系统完善
    Dos.ORM简单说明
    C# 调用C++ dll的方法
    Windows10内置Linux子系统(WSL)Vmmem内存占用过大问题
    Docker 常用命令
    Typora 激活
    C# LINQ去重
    Windows10内置Linux子系统(WSL)映射本地盘符
    00-mORMot安装
  • 原文地址:https://www.cnblogs.com/liyiran/p/13832500.html
Copyright © 2020-2023  润新知