bugFix: (note)

- Bloom 布隆过滤器不存在时,未校验是否点赞其他笔记
This commit is contained in:
2025-10-17 22:20:20 +08:00
parent 7c92bd91f6
commit bb44cd3d23

View File

@@ -598,10 +598,13 @@ public class NoteServiceImpl extends ServiceImpl<NoteDOMapper, NoteDO> 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,17 +767,19 @@ public class NoteServiceImpl extends ServiceImpl<NoteDOMapper, NoteDO> implement
}
/**
* 异步批量添加笔记点赞记录到布隆过滤器中,并设置过期时间
*
* @param userId 用户 ID
* 异步初始化布隆过滤器
* @param userId 用户ID
* @param expireSeconds 过期时间(秒)
* @param bloomUserNoteLikeListKey 布隆过滤器 Key
* @param bloomUserNoteLikeListKey 布隆过滤器 KEY
*/
private void asynBatchAddNoteLike2BloomAndExpire(Long userId, long expireSeconds, String bloomUserNoteLikeListKey) {
threadPoolTaskExecutor.submit(() -> {
private void batchAddNoteLike2BloomAndExpire(Long userId, long expireSeconds, String bloomUserNoteLikeListKey) {
try {
// 异步全量同步一下,并设置过期时间
List<NoteLikeDO> noteLikeDOS = noteLikeDOService.list(new LambdaQueryWrapper<>(NoteLikeDO.class)
.eq(NoteLikeDO::getUserId, userId));
.select(NoteLikeDO::getNoteId)
.eq(NoteLikeDO::getUserId, userId)
.eq(NoteLikeDO::getStatus, LikeStatusEnum.LIKE.getCode()));
if (CollUtil.isNotEmpty(noteLikeDOS)) {
DefaultRedisScript<Long> script = new DefaultRedisScript<>();
// Lua 脚本路径
@@ -789,9 +794,8 @@ public class NoteServiceImpl extends ServiceImpl<NoteDOMapper, NoteDO> implement
redisTemplate.execute(script, Collections.singletonList(bloomUserNoteLikeListKey), luaArgs.toArray());
}
} catch (Exception e) {
log.error("异步批量添加笔记点赞记录到布隆过滤器中,并设置过期时间失败...", e);
log.error("## 异步初始化布隆过滤器异常: ", e);
}
});
}
/**