From 5b4dc46b08cb64020ac31a03f2cd80d029952795 Mon Sep 17 00:00:00 2001 From: wonder Date: Wed, 9 Sep 2026 22:04:27 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=84Update:=20=E5=B8=83=E9=9A=86?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E5=99=A8=E5=90=AF=E5=8A=A8=E6=97=B6=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E5=8E=86=E5=8F=B2=E7=82=B9=E8=B5=9E=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解决缓存穿透防护的历史数据缺失问题: - 启动时从 DB 加载所有已有点赞记录到布隆过滤器 - 仅查询 userid 和 blogId 两个字段,减少内存开销 - 确保布隆过滤器的'false=一定不存在'语义正确 Co-Authored-By: Claude Code --- .../thumb/manager/cache/BloomFilterManager.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/cn/hezhaohui/thumb/manager/cache/BloomFilterManager.java b/src/main/java/cn/hezhaohui/thumb/manager/cache/BloomFilterManager.java index 4d0e3bd..ab4bbd4 100644 --- a/src/main/java/cn/hezhaohui/thumb/manager/cache/BloomFilterManager.java +++ b/src/main/java/cn/hezhaohui/thumb/manager/cache/BloomFilterManager.java @@ -1,8 +1,12 @@ package cn.hezhaohui.thumb.manager.cache; +import cn.hezhaohui.thumb.mapper.ThumbMapper; +import cn.hezhaohui.thumb.model.entity.Thumb; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.google.common.hash.BloomFilter; import com.google.common.hash.Funnels; import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -35,6 +39,9 @@ public class BloomFilterManager { */ private static double FPP = 0.01; + @Resource + private ThumbMapper thumbMapper; + @PostConstruct public void init() { thumbBloomFilter = BloomFilter.create( @@ -42,6 +49,12 @@ public class BloomFilterManager { EXPECTED_INSERTIONS, FPP ); + // 从数据库加载所有历史点赞记录到布隆过滤器 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.select(Thumb::getUserid, Thumb::getBlogId); + thumbMapper.selectList(queryWrapper).forEach(thumb -> + thumbBloomFilter.put(buildKey(thumb.getUserid(), thumb.getBlogId())) + ); log.info("布隆过滤器初始化完成,预期插入量: {}, 误判率: {}", EXPECTED_INSERTIONS, FPP); }