缓存穿透--一起学习吧之架构

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。在高并发场景下,如果某个key被高并发访问且没有被命中,出于对容错性的考虑,系统会尝试从后端数据库中获取数据,这可能导致大量请求直接打到数据库上。而当该key对应的数据库本身就是空的情况下,就会导致数据库中并发的去执行很多不必要的查询操作,从而对数据库造成巨大的冲击和压力。

缓存穿透可能由用户伪造不存在的数据ID并频繁请求接口导致,也可能由黑客攻击引起。这种攻击会导致服务器响应缓慢,影响用户体验。

缓存穿透带来的危害主要有以下几点:

  1. 后端存储负载加大:由于缓存穿透导致大量请求直接穿透缓存层到达后端存储层,后端存储层需要处理这些额外的请求,从而增加了其负载。如果后端存储不具备高并发处理能力,可能会导致其性能下降,甚至宕机。
  2. 系统性能下降:由于大量请求直接打到后端存储层,可能导致系统整体性能下降,响应时间延长,用户体验变差。
  3. 安全风险:缓存穿透可能被恶意用户或黑客利用,通过伪造不存在的数据ID进行频繁请求,从而攻击系统,导致系统瘫痪或数据泄露。

为了解决缓存穿透问题,可以采取以下几种策略:

  1. 主动方案:

    • 增加ID复杂度:通过提高ID的复杂性和难以预测性,减少被恶意用户或黑客利用的可能性。
    • 数据基础格式校验:对客户端发送的请求进行校验,确保数据格式的合法性,避免非法请求穿透到数据库。
    • 加强用户权限校验:对用户的访问权限进行严格的校验,确保只有合法的用户能够访问数据。
    • 热点参数限流:对热点参数进行限流,防止大量请求同时穿透缓存,对数据库造成过大压力。
  2. 被动方案:

    • 缓存空对象:当查询结果为空时,将一个空对象或默认值缓存起来,并设置一个较短的TTL(Time to Live,生存时间)。当再次遇到相同的查询时,可以直接从缓存中返回空对象或默认值,避免再次查询数据库。需要注意的是,这种方式可能会导致缓存中存储大量的无效数据,占用内存空间。
    • 使用布隆过滤器:布隆过滤器是一种空间效率极高的概率型数据结构,它利用位数组和哈希函数来判断一个元素是否在一个集合中。将所有已存在的数据key放入布隆过滤器中,当新的请求到来时,先通过布隆过滤器判断该key是否存在。如果不存在,则直接返回;如果存在,再到缓存和数据库中进行查询。这种方式可以有效减少不必要的数据库查询,提高系统性能。
    • 限制分页数量:对于需要分页查询的场景,可以通过限制最大分页数来减少缓存穿透的风险。例如,可以设置最大分页数为100页,超过该分页数的请求直接返回空值或错误提示。

需要注意的是,以上方案并非绝对完美,需要根据具体的应用场景和需求进行选择和调整。同时,也需要对缓存和数据库进行监控和调优,确保系统的稳定性和性能。

相关推荐
LT10157974446 分钟前
2026年微服务性能测试平台选型指南:分布式架构适配与服务联动测试
分布式·微服务·架构
若兰幽竹12 分钟前
【HarmonyOS 6.1 全场景实战】《灵犀厨房》实战之补充【架构进化】灵犀厨房四层分层设计:给鸿蒙 App 搭一副坚不可摧的骨架
架构·鸿蒙系统·harmonyos6.1.0·灵犀厨房
fuquxiaoguang25 分钟前
架构模式革新:用“旁路镜像”改造老旧系统——中间件驱动的渐进式AI落地范式
人工智能·中间件·架构
hans汉斯27 分钟前
力学研究|半主动变刚度吸振器设计及减振机理研究
学习·力学
AI科技星42 分钟前
算法联盟·全域数学公理体系下黑洞标量毛发与LVK引力波O4全维理论、求导、证明、计算、验证、分析
人工智能·线性代数·算法·架构·学习方法·量子计算
Shota Kishi1 小时前
ERPC 在 Solana RPC 中集成 Pyth Hermes 兼容的 Price API:从架构到调用的技术解析
网络协议·rpc·架构
風清掦1 小时前
【STM32学习笔记-13】PWR电源控制
笔记·stm32·学习
喵个咪1 小时前
一套Schema,生成全部代码|Kratos高效开发新范式
前端·后端·架构
Anastasiozzzz1 小时前
深入研究Java Agent生态:SpringAI 与 SpringAIAlibaba核心能力、架构演进与全场景对比研究
java·开发语言·架构
不会写程序的未来程序员1 小时前
从快递物流到分布式架构:RocketMQ全栈进阶实战指南——从入门到高手的代码与原理解析
分布式·架构·rocketmq