• Redis—问题(1)


    写在前面

    Redis 是一种 NoSQL 数据库,包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,在我们的日常开发中会经常使用 Redis 来解决许多问题,比如排行榜、消息队列系统、计数器 以及 缓存系统等。

    在作为缓存使用时,不可避免的会遇到缓存穿透、缓存雪崩、缓存击穿(热点 key) 的问题,那么究竟这些问题具体值的是什么,又该如何解决呢?

    什么是缓存穿透

    缓存穿透是指客户端请求的数据在缓存和数据库中都不存在,引起缓存失效,并会对数据库造成极大的压力。
    常见的解决方案有两种:

    • 缓存空对象
      • 优点:实现简单,维护方便
      • 缺点:
        • 额外的内存消耗
        • 可能造成短期的不一致
    • 布隆过滤
      • 优点:内存占用少,没有多余的key
      • 缺点:
        • 实现复杂
        • 可能存在误判
    • 增加 id 的复杂度,避免被猜到 id 规律。
    • 做好数据的基础格式校验。
    • 加强用户的权限校验。
    • 做好热点参数的限流(sentinel)。

    什么是缓存雪崩

    缓存雪崩是指在同一时间段大量的缓存 key 同时失效或者 Redis 服务宕机,导致大量请求到达数据库,对数据库造成极大的压力。
    常见的解决方案有:

    • 给不同的 key 的 TTL添加随机值。
    • 利用 Redis 集群提高服务的可用性。(Redis 主从,哨兵)
    • 给缓存业务添加降级限流策略(sentinel)。
    • 给业务添加多级缓存。

    什么是缓存击穿

    缓存击穿也叫热点 key 问题,是指一个被高并发访问并且缓存重建业务比较复杂的key 突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。
    常见的解决方案有:

    • 互斥锁
      • 优点:
        • 没有额外的内存消耗
        • 保证一致性
        • 失效简单
      • 缺点:
        • 线程需要等待,性能收到影响
        • 可能有死锁的风险
    • 逻辑过期
      • 优点:
      • 线程无需等待,性能较好
      • 缺点:
        • 不保证一致性
        • 具有额外内存消耗
        • 实现复杂

    总结

    以上就是对缓存穿透、缓存雪崩、缓存击穿问题的简单介绍和解决办法,更加具体的实现方法,正在整理中...

  • 相关阅读:
    jquery操作DOM对象
    Spring目录结构和基础JAR包介绍
    Mysql集群及高可用-Mysql高可用MHA9
    “Can‘t open workbook - unsupported file type: XML“
    结构体字节对齐
    SPark学习笔记:13 Spark Streaming 的Transform算子和Action算子
    MybatisPlus的操作
    特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试
    设计模式-----观察者模式
    Pytorch:BatchNorm1d、BatchNorm2d、BatchNorm3d
  • 原文地址:https://www.cnblogs.com/xin666/p/16816351.html