缓存三兄弟和布隆过滤器

缓存三兄弟

  1. 缓存穿透:大量的请求查询数据库中不存在的数据,缓存直接从机数据库,导致数据库压力过大甚至宕机

    • 解决方案:

      • 布隆过滤器:在缓存层前加入布隆过滤器,预存合法数据的Key,请求到达时先通过布隆过滤器查看是否存在,查看是否拦截。

      • 缓存空对象:对数据库中不存在的数据,缓存一个短期的空值。需要结合异步线程定期清理无效空值,避免长期占用内存。

        • 缓存空对象

          1. 缓存空对象:是一种解决缓存穿透问题的策略,当查询某个不存在的数据的时候,系统在缓存中存储一个空值,并设置简短的过期时间,避免大量的无效请求直接冲击数据库。

  2. 缓存击穿:热点key突然失效时,大量的请求直接穿透到数据库,导致压力瞬间增大。

    • 解决方案:

      - 分布式锁:使用redis或者redisson实现互斥锁,仅允许一个线程进行重建,其他线程等待或者轮询
      • 逻辑过期:缓存不设置物理过期时间,但在value中村出逻辑过期时间

        • 什么是逻辑过期

          1. 概念:逻辑过期是一种缓存管理策略。通过缓存数据中存储逻辑过期时间戳,实现灵活的缓存更新控制,其核心目标是避免缓存击穿减少物理过期带来的雪崩风险

        • 提前续期:在缓存过期之前,通过定时任务访问触发自动续期,避免集中失效

  1. 缓存雪崩:大量缓存key同时过期或缓存服务宕机,导致所有请求直接访问数据库,引发级联故障

    • 解决方案:

      • 设置随机过期时间:在缓存key的过期时间基础上增加随机值。

      • 缓存高可用框架:Redis Cluster分片集群部署,单节点故障不影响整体服务。

      • 熔断降级:集成Sentinel或Hystrix,当数据库压力查过阙值时,拒绝部分请求返回兜底数据。

    缓存三兄弟和布隆过滤器_第1张图片

布隆过滤器

  1. 布隆过滤器是一个长度为m的数组,用于存储元素的哈希映射结果。布隆过滤器通过多哈希函数映射到二进制位数组,以极小的空间代价实现高效存在性判断。其核心在于容忍一定误判率以换取空间和时间效率,适用于海量数据过滤场景。

    • 比方说:一个长度为m‘的二进制数组,初始位置均为0,有k个独立的哈希函数,每个哈希函数都能将任意的输入映射到位数组的某个位置。

      • 插入k个数据:对元素进行k次的哈希计算,得到k个不同的位置,将位数组中这k个位置的值设计为1

      • 查询元素:对元素进行k'次哈希计算,检查所有对应位置是否均为1.

    • 示例: 添加元素"apple",假设哈希结果为[2,5,7],位数组变为 [0,0,1,0,0,1,0,1]

  2. 操作过程:

    • 添加元素:通过k个哈希函数计算元素哈希值,将对应位置置1.

    • 查询元素:再次计算哈希值,若所有对应为均为1,则判定可能存在,否则一定不存在。

  3. 优缺点分析:

    1. 优点:

      • 空间效率高:相比较相同规模数据仅需少量的内存。

      • 查询速度快:时间复杂度为0,与数据量无关。

      • 保密性:不仅存储原始数据,仅记录哈希结果。

    2. 缺点:

      • 误判率:可能存在假阳性(判断存在但实际不存在),但不会假阴性

      • 不支持删除:直接删除元素会影响其他元素的判断,需要依赖计数布隆过滤器(CBF)或重建过滤器。

      • 扩容困难:传统布隆过滤器无法动态扩容,需要迁移至更大的新过滤器。

  4. 应用场景:

    1. 缓存穿透防护:拦截数据库中不存在的数据请求,减少无效查询。

    2. 海量数据去重:网络爬虫URL去重,黑名单系统,注册昵称判重。

    3. 数据库优化:快速判断数据是否存在,减少磁盘查询次数。

  5. 高频面试问题:

    1. 如何降低误判率?

      • 增加位数组长度和哈希函数数量。

    2. 布隆过滤器如何支持删除

      • 计数布隆过滤器:用计数器代替二进制位,删除时减一

      • 重建过滤器:创建新过滤器并迁移旧数据。

    3. 如何动态库容?

      • 可扩展布隆过滤器(SBF):当容量不足时,创建更大的新过滤器并逐步迁移数据

    4. 布隆过滤器与哈希表的区别?

      • 空间:布隆过滤器更节省空间,但存在误判;哈希表精确但占用更多内存48。

      • 功能:布隆过滤器仅支持存在性判断,哈希表支持完整CRUD操作8。

    5. Redis中如何实现布隆过滤器?

      • RedisBloom插件:提供BF.ADDBF.EXISTS等命令,支持动态扩容37。

      • BitMap模拟:需自行实现多个哈希函数及位操作逻辑

  6. 总结:布隆过滤器通过空间换时间的策略,在容忍一定误判率的场景下表现出色,尤其适合高并发、大数据量的过滤需求。面试中需重点掌握其原理、参数设计、优缺点及与替代方案的对比,并结合实际场景(如缓存穿透)展开论述

你可能感兴趣的:(redis,缓存,哈希算法,算法,java,intellij-idea)