This commit is contained in:
2026-09-15 16:02:45 +08:00
parent 112c5f8e46
commit ade2453083
70 changed files with 1441 additions and 707 deletions
+19 -10
View File
@@ -2,6 +2,7 @@ package service
import (
"context"
"log/slog"
"git.lzcwy.cn/zhengchiliu/zt-closet-backend/global"
"git.lzcwy.cn/zhengchiliu/zt-closet-backend/internal/dto"
@@ -87,19 +88,27 @@ func (s *LikeService) GetByTargetID(ctx context.Context, userID int64, request *
}
targetID := outfit.ID
// 是否已点赞:Redis 优先,回落 MySQL。
isLiked, err := redisdao.LikeIsMember(ctx, LikeTypeOutfit, targetID, userID)
if err != nil {
if rec, derr := s.likeDao.LikeGetByTargetAndUser(ctx, LikeTypeOutfit, targetID, userID); derr == nil {
isLiked = rec.Status == InteractStatusOn
// 是否已点赞:以 MySQL 为权威。
// Redis 集合带 TTL,过期后会被后续写入重建为「仅含新成员」,导致 SIsMember/SCard 长期低估,
// 因此只在 DB 异常时用 Redis 兜底(降级可用性优先于精确性)。
isLiked := false
if rec, derr := s.likeDao.LikeGetByTargetAndUser(ctx, LikeTypeOutfit, targetID, userID); derr == nil {
isLiked = rec.Status == InteractStatusOn
} else if !isNotFound(derr) {
slog.WarnContext(ctx, "query like record failed, fallback to redis",
"target_id", targetID, "user_id", userID, "error", derr)
if v, rerr := redisdao.LikeIsMember(ctx, LikeTypeOutfit, targetID, userID); rerr == nil {
isLiked = v
}
}
// 点赞总数:Redis 优先,回落 MySQL。
count, err := redisdao.LikeCount(ctx, LikeTypeOutfit, targetID)
if err != nil || count == 0 {
if dbCnt, derr := s.likeDao.LikeCountByTarget(ctx, LikeTypeOutfit, targetID); derr == nil {
count = dbCnt
// 点赞总数:以 MySQL 为权威(同上,Redis 仅在 DB 异常时兜底)。
count, derr := s.likeDao.LikeCountByTarget(ctx, LikeTypeOutfit, targetID)
if derr != nil {
slog.WarnContext(ctx, "count like failed, fallback to redis",
"target_id", targetID, "error", derr)
if rcnt, rerr := redisdao.LikeCount(ctx, LikeTypeOutfit, targetID); rerr == nil {
count = rcnt
}
}