From bb44cd3d23fd4f44851862e9e90f8e05933434ab Mon Sep 17 00:00:00 2001 From: Hanserwei <2628273921@qq.com> Date: Fri, 17 Oct 2025 22:20:20 +0800 Subject: [PATCH] =?UTF-8?q?bugFix:=20(note)=20-=20Bloom=20=E5=B8=83?= =?UTF-8?q?=E9=9A=86=E8=BF=87=E6=BB=A4=E5=99=A8=E4=B8=8D=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E6=9C=AA=E6=A0=A1=E9=AA=8C=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E7=82=B9=E8=B5=9E=E5=85=B6=E4=BB=96=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biz/service/impl/NoteServiceImpl.java | 56 ++++++++++--------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/han-note-note/han-note-note-biz/src/main/java/com/hanserwei/hannote/note/biz/service/impl/NoteServiceImpl.java b/han-note-note/han-note-note-biz/src/main/java/com/hanserwei/hannote/note/biz/service/impl/NoteServiceImpl.java index bed1ad2..a0b31f0 100644 --- a/han-note-note/han-note-note-biz/src/main/java/com/hanserwei/hannote/note/biz/service/impl/NoteServiceImpl.java +++ b/han-note-note/han-note-note-biz/src/main/java/com/hanserwei/hannote/note/biz/service/impl/NoteServiceImpl.java @@ -598,10 +598,13 @@ public class NoteServiceImpl extends ServiceImpl implement // 目标笔记已经被点赞 if (count > 0) { // 异步初始化布隆过滤器 - asynBatchAddNoteLike2BloomAndExpire(userId, expireSeconds, bloomUserNoteLikeListKey); + threadPoolTaskExecutor.submit(() -> batchAddNoteLike2BloomAndExpire(userId, expireSeconds, bloomUserNoteLikeListKey)); throw new ApiException(ResponseCodeEnum.NOTE_ALREADY_LIKED); } + // 若笔记未被点赞,查询当前用户是否点赞其他用户,有则同步初始化布隆过滤器 + batchAddNoteLike2BloomAndExpire(userId, expireSeconds, bloomUserNoteLikeListKey); + // 若数据库中也没有点赞记录,说明该用户还未点赞过任何笔记 // Lua 脚本路径 script.setScriptSource(new ResourceScriptSource(new ClassPathResource("/lua/bloom_add_note_like_and_expire.lua"))); @@ -764,34 +767,35 @@ public class NoteServiceImpl extends ServiceImpl implement } /** - * 异步批量添加笔记点赞记录到布隆过滤器中,并设置过期时间 - * - * @param userId 用户 ID - * @param expireSeconds 过期时间(秒) - * @param bloomUserNoteLikeListKey 布隆过滤器 Key + * 异步初始化布隆过滤器 + * @param userId 用户ID + * @param expireSeconds 过期时间(秒) + * @param bloomUserNoteLikeListKey 布隆过滤器 KEY */ - private void asynBatchAddNoteLike2BloomAndExpire(Long userId, long expireSeconds, String bloomUserNoteLikeListKey) { - threadPoolTaskExecutor.submit(() -> { - try { - List noteLikeDOS = noteLikeDOService.list(new LambdaQueryWrapper<>(NoteLikeDO.class) - .eq(NoteLikeDO::getUserId, userId)); - if (CollUtil.isNotEmpty(noteLikeDOS)) { - DefaultRedisScript script = new DefaultRedisScript<>(); - // Lua 脚本路径 - script.setScriptSource(new ResourceScriptSource(new ClassPathResource("/lua/bloom_batch_add_note_like_and_expire.lua"))); - // 返回值类型 - script.setResultType(Long.class); + private void batchAddNoteLike2BloomAndExpire(Long userId, long expireSeconds, String bloomUserNoteLikeListKey) { + try { + // 异步全量同步一下,并设置过期时间 + List noteLikeDOS = noteLikeDOService.list(new LambdaQueryWrapper<>(NoteLikeDO.class) + .select(NoteLikeDO::getNoteId) + .eq(NoteLikeDO::getUserId, userId) + .eq(NoteLikeDO::getStatus, LikeStatusEnum.LIKE.getCode())); - // 构建 Lua 参数 - List luaArgs = Lists.newArrayList(); - noteLikeDOS.forEach(noteLikeDO -> luaArgs.add(noteLikeDO.getNoteId())); // 将每个点赞的笔记 ID 传入 - luaArgs.add(expireSeconds); // 最后一个参数是过期时间(秒) - redisTemplate.execute(script, Collections.singletonList(bloomUserNoteLikeListKey), luaArgs.toArray()); - } - } catch (Exception e) { - log.error("异步批量添加笔记点赞记录到布隆过滤器中,并设置过期时间失败...", e); + if (CollUtil.isNotEmpty(noteLikeDOS)) { + DefaultRedisScript script = new DefaultRedisScript<>(); + // Lua 脚本路径 + script.setScriptSource(new ResourceScriptSource(new ClassPathResource("/lua/bloom_batch_add_note_like_and_expire.lua"))); + // 返回值类型 + script.setResultType(Long.class); + + // 构建 Lua 参数 + List luaArgs = Lists.newArrayList(); + noteLikeDOS.forEach(noteLikeDO -> luaArgs.add(noteLikeDO.getNoteId())); // 将每个点赞的笔记 ID 传入 + luaArgs.add(expireSeconds); // 最后一个参数是过期时间(秒) + redisTemplate.execute(script, Collections.singletonList(bloomUserNoteLikeListKey), luaArgs.toArray()); } - }); + } catch (Exception e) { + log.error("## 异步初始化布隆过滤器异常: ", e); + } } /**