穿透与击穿:缓存世界的两场“攻击”,Java工程师如何见招拆招?

360影视 国产动漫 2025-05-07 06:18 2

摘要:// 初始化100万容量,误判率0.1% BloomFilter filter = BloomFilter.create( Funnels.stringFunnel(StandardCharsets.UTF_8), 1000000, 0.001

今天,我将用真实代码案例+通俗比喻,带你彻底看透这两个“缓存杀手”的本质区别,并分享一线大厂都在用的解决方案。

// 初始化100万容量,误判率0.1% BloomFilter filter = BloomFilter.create( Funnels.stringFunnel(StandardCharsets.UTF_8), 1000000, 0.001); // 预热合法数据 validIds.forEach(filter::put); // 请求拦截 if (!filter.mightContain(requestId)) { return "非法请求!"; } 致命缺陷:误判率存在(可通过增加哈希函数降低)

某支付系统采用三级防御:

Nginx层过滤非法参数(正则匹配ID格式)布隆过滤器拦截90%恶意请求剩余请求若查无数据,缓存空值并触发报警redisson分布式锁实现Rlock lock = Redisson.getLock("product_lock_" + productId); try { if (lock.tryLock(3, 10, TimeUnit.SECONDS)) { // 双重检查锁定 data = cache.get(productId); if (data == null) { data = db.query(...); cache.set(productId, data); } } } finally { lock.unlock; } 代价:部分用户需等待(可配合进度条提升体验)

在2025年的今天,随着硬件成本下降,有人质疑:“还需要抠这些缓存细节吗?”但根据最新测试数据:一套完善的缓存方案,仍能让系统性能提升8-12倍

记住这两个关键公式:

来源:电脑技术汇

相关推荐