🔄Update: 布隆过滤器启动时加载历史点赞数据
解决缓存穿透防护的历史数据缺失问题: - 启动时从 DB 加载所有已有点赞记录到布隆过滤器 - 仅查询 userid 和 blogId 两个字段,减少内存开销 - 确保布隆过滤器的'false=一定不存在'语义正确 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user