🔄Update: 布隆过滤器启动时加载历史点赞数据

解决缓存穿透防护的历史数据缺失问题:
- 启动时从 DB 加载所有已有点赞记录到布隆过滤器
- 仅查询 userid 和 blogId 两个字段,减少内存开销
- 确保布隆过滤器的'false=一定不存在'语义正确

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
2026-09-09 22:04:27 +08:00
parent 1dda7e80b9
commit 5b4dc46b08
@@ -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<Thumb> 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);
}