xw 2 gün önce
ebeveyn
işleme
ea7c8d9ef9

+ 24 - 11
fs-service/src/main/java/com/fs/course/service/impl/FsUserVideoFavoriteServiceImpl.java

@@ -1,11 +1,13 @@
 package com.fs.course.service.impl;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import lombok.Synchronized;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import com.fs.course.mapper.FsUserVideoFavoriteMapper;
 import com.fs.course.domain.FsUserVideoFavorite;
@@ -23,6 +25,8 @@ public class FsUserVideoFavoriteServiceImpl implements IFsUserVideoFavoriteServi
 {
     @Autowired
     private FsUserVideoFavoriteMapper fsUserVideoFavoriteMapper;
+    @Autowired(required = false)
+    private RedisTemplate<String, Boolean> redisTemplate;
 
     /**
      * 查询课堂视频收藏
@@ -97,30 +101,39 @@ public class FsUserVideoFavoriteServiceImpl implements IFsUserVideoFavoriteServi
     {
         return fsUserVideoFavoriteMapper.deleteFsUserVideoFavoriteByFavoriteId(favoriteId);
     }
+    private static final String FAVORITE_KEY_PREFIX = "favorite:video:";
+    private static final String NO_FAVORITE_KEY_PREFIX = "nofavorite:video:";
+
     @Override
     public R checkFavorite(Long videoId, long userId) {
-        return fsUserVideoFavoriteMapper.checkFavorite(videoId, userId) > 0
-                ? R.ok().put("isFavorite", 1)
-                : R.error().put("isFavorite", 0);
+        String key = FAVORITE_KEY_PREFIX + videoId + ":user:" + userId;
+        Boolean hasFavorite = redisTemplate.opsForValue().get(key);
+        if (hasFavorite != null && hasFavorite) {
+            return R.ok().put("isFavorite", 1);
+        } else {
+            return fsUserVideoFavoriteMapper.checkFavorite(videoId, userId) > 0
+                    ? R.ok().put("isFavorite", 1)
+                    : R.error().put("isFavorite", 0);
+        }
     }
 
     @Override
     @Transactional
     @Synchronized
     public void favoriteVideo(Long videoId, long userId) {
-        if (fsUserVideoFavoriteMapper.checkFavorite(videoId, userId) == 0) {
-            FsUserVideoFavorite favorite = new FsUserVideoFavorite();
-            favorite.setVideoId(videoId);
-            favorite.setUserId(userId);
-            favorite.setCreateTime(DateUtils.getNowDate());
-            fsUserVideoFavoriteMapper.insertFsUserVideoFavorite(favorite);
-        }
+        String unlikeKey = NO_FAVORITE_KEY_PREFIX + videoId + ":user:" + userId;
+        redisTemplate.delete(unlikeKey);
+        String key = FAVORITE_KEY_PREFIX + videoId + ":user:" + userId;
+        redisTemplate.opsForValue().set(key, true, 1, TimeUnit.DAYS);
     }
 
     @Override
     @Transactional
     @Synchronized
     public void deleteFavorite(Long videoId, long userId) {
-        fsUserVideoFavoriteMapper.deleteFavorite(videoId, userId);
+        String key = FAVORITE_KEY_PREFIX + videoId + ":user:" + userId;
+        redisTemplate.delete(key);
+        String unlikeKey = NO_FAVORITE_KEY_PREFIX + videoId + ":user:" + userId;
+        redisTemplate.opsForValue().set(unlikeKey, true, 1, TimeUnit.DAYS);
     }
 }

+ 25 - 11
fs-service/src/main/java/com/fs/course/service/impl/FsUserVideoLikeServiceImpl.java

@@ -1,11 +1,13 @@
 package com.fs.course.service.impl;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import lombok.Synchronized;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import com.fs.course.mapper.FsUserVideoLikeMapper;
 import com.fs.course.domain.FsUserVideoLike;
@@ -24,6 +26,9 @@ public class FsUserVideoLikeServiceImpl implements IFsUserVideoLikeService
     @Autowired
     private FsUserVideoLikeMapper fsUserVideoLikeMapper;
 
+    @Autowired
+    private RedisTemplate<String, Boolean> redisTemplate;
+
     /**
      * 查询课堂视频点赞
      *
@@ -98,30 +103,39 @@ public class FsUserVideoLikeServiceImpl implements IFsUserVideoLikeService
         return fsUserVideoLikeMapper.deleteFsUserVideoLikeByLikeId(likeId);
     }
 
+    private static final String LIKE_KEY_PREFIX = "like:video:";
+    private static final String UNLIKE_KEY_PREFIX = "unlike:video:";
+
     @Override
     public R checkLike(Long videoId, long userId) {
-        return fsUserVideoLikeMapper.checkLike(videoId, userId) > 0
-                ? R.ok().put("isLike", 1)
-                : R.error().put("isLike", 0);
+        String key = LIKE_KEY_PREFIX + videoId + ":user:" + userId;
+        Boolean hasLiked = redisTemplate.opsForValue().get(key);
+        if (hasLiked != null && hasLiked) {
+            return R.ok().put("isLike", 1);
+        } else {
+            return fsUserVideoLikeMapper.checkLike(videoId, userId) > 0
+                    ? R.ok().put("isLike", 1)
+                    : R.error().put("isLike", 0);
+        }
     }
 
     @Override
     @Transactional
     @Synchronized
     public void likeVideo(Long videoId, long userId) {
-        if (fsUserVideoLikeMapper.checkLike(videoId, userId) == 0) {
-            FsUserVideoLike like = new FsUserVideoLike();
-            like.setVideoId(videoId);
-            like.setUserId(userId);
-            like.setCreateTime(DateUtils.getNowDate());
-            fsUserVideoLikeMapper.insertFsUserVideoLike(like);
-        }
+        String unlikeKey = UNLIKE_KEY_PREFIX + videoId + ":user:" + userId;
+        redisTemplate.delete(unlikeKey);
+        String key = LIKE_KEY_PREFIX + videoId + ":user:" + userId;
+        redisTemplate.opsForValue().set(key, true, 1, TimeUnit.DAYS);
     }
 
     @Override
     @Transactional
     @Synchronized
     public void unlikeVideo(Long videoId, long userId) {
-        fsUserVideoLikeMapper.deleteLike(videoId, userId);
+        String key = LIKE_KEY_PREFIX + videoId + ":user:" + userId;
+        redisTemplate.delete(key);
+        String unlikeKey = UNLIKE_KEY_PREFIX + videoId + ":user:" + userId;
+        redisTemplate.opsForValue().set(unlikeKey, true, 1, TimeUnit.DAYS);
     }
 }

+ 54 - 7
fs-service/src/main/java/com/fs/course/service/impl/FsUserVideoServiceImpl.java

@@ -65,6 +65,9 @@ public class FsUserVideoServiceImpl implements IFsUserVideoService {
 
     @Autowired
     private IVodService vodService;
+    private static final String LIKE_KEY_PREFIX = "like:video:";
+    private static final String FAVORITE_KEY_PREFIX = "favorite:video:";
+
     /**
      * 查询课堂视频
      *
@@ -202,18 +205,62 @@ public class FsUserVideoServiceImpl implements IFsUserVideoService {
         return list;
     }
 
-    // 查询点赞、收藏、评论数(仅数据库,便于本地联调线上库)
+    //查询点赞信息和收藏信息
     public List<FsUserVideoListUVO> selectLikesAndFavorites(Long userId, List<FsUserVideoListUVO> list) {
         if (list != null && !list.isEmpty()) {
             List<Long> videoIds = list.stream().map(vo -> Long.parseLong(vo.getId())).collect(Collectors.toList());
-            Map<Long, VideoLikeStatusDTO> likeMap = fsUserVideoLikeMapper.checkLikes(videoIds, userId);
-            Map<Long, VideoFavoriteStatusDTO> favoriteMap = fsUserVideoFavoriteMapper.checkFavorites(videoIds, userId);
-            for (FsUserVideoListUVO vo : list) {
+
+            List<String> likeKeys = videoIds.stream()
+                    .map(videoId -> LIKE_KEY_PREFIX + videoId + ":user:" + userId)
+                    .collect(Collectors.toList());
+            List<Boolean> redisLikes = redisTemplate.opsForValue().multiGet(likeKeys);
+
+            List<String> favoriteKeys = videoIds.stream()
+                    .map(videoId -> FAVORITE_KEY_PREFIX + videoId + ":user:" + userId)
+                    .collect(Collectors.toList());
+            List<Boolean> redisFavorites = redisTemplate.opsForValue().multiGet(favoriteKeys);
+
+            List<Long> missingLikeVideoIds = new ArrayList<>();
+            List<Long> missingFavoriteVideoIds = new ArrayList<>();
+
+            for (int i = 0; i < list.size(); i++) {
+                FsUserVideoListUVO vo = list.get(i);
                 Long videoId = Long.parseLong(vo.getId());
-                vo.setSmsNum(fsUserVideoCommentMapper.selectCommentCountByVideos(videoId));
-                vo.setLike(likeMap.getOrDefault(videoId, new VideoLikeStatusDTO()).getLiked() ? 1 : 0);
-                vo.setFavorite(favoriteMap.getOrDefault(videoId, new VideoFavoriteStatusDTO()).getFavorite() ? 1 : 0);
+                Integer commentCount = fsUserVideoCommentMapper.selectCommentCountByVideos(videoId);
+                vo.setSmsNum(commentCount);
+                if (redisLikes != null && redisLikes.get(i) != null) {
+                    vo.setLike(Boolean.TRUE.equals(redisLikes.get(i)) ? 1 : 0);
+                } else {
+                    missingLikeVideoIds.add(videoId);
+                }
+
+                if (redisFavorites != null && redisFavorites.get(i) != null) {
+                    vo.setFavorite(Boolean.TRUE.equals(redisFavorites.get(i)) ? 1 : 0);
+                } else {
+                    missingFavoriteVideoIds.add(videoId);
+                }
             }
+
+            if (!missingLikeVideoIds.isEmpty()) {
+                Map<Long, VideoLikeStatusDTO> likeMap = fsUserVideoLikeMapper.checkLikes(missingLikeVideoIds, userId);
+                for (FsUserVideoListUVO vo : list) {
+                    Long videoId = Long.parseLong(vo.getId());
+                    if (missingLikeVideoIds.contains(videoId)) {
+                        vo.setLike(likeMap.getOrDefault(videoId, new VideoLikeStatusDTO()).getLiked() ? 1 : 0);
+                    }
+                }
+            }
+
+            if (!missingFavoriteVideoIds.isEmpty()) {
+                Map<Long, VideoFavoriteStatusDTO> favoriteMap = fsUserVideoFavoriteMapper.checkFavorites(missingFavoriteVideoIds, userId);
+                for (FsUserVideoListUVO vo : list) {
+                    Long videoId = Long.parseLong(vo.getId());
+                    if (missingFavoriteVideoIds.contains(videoId)) {
+                        vo.setFavorite(favoriteMap.getOrDefault(videoId, new VideoFavoriteStatusDTO()).getFavorite() ? 1 : 0);
+                    }
+                }
+            }
+
             fillTalentFollowInfo(userId, list);
         }
         return list;