xw 1 päivä sitten
vanhempi
commit
c70a44af86

+ 20 - 74
fs-admin/src/main/java/com/fs/course/task/VideoTask.java

@@ -30,10 +30,6 @@ public class VideoTask {
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
     private static final String YL_SECRET_ID = "AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT";
     private static final String YL_SECRET_KEY = "u5SuS80342xzx8FRBukza9lVNHKNMSaB";
-    private static final String LIKE_KEY_PREFIX = "like:video:";
-    private static final String UNLIKE_KEY_PREFIX = "unlike:video:";
-    private static final String FAVORITE_KEY_PREFIX = "favorite:video:";
-    private static final String NO_FAVORITE_KEY_PREFIX = "nofavorite:video:";
     private static final String COMMENT_KEY_PREFIX = "comment:video:";
     private static final String COMMENT_REPLY_COUNT_KEY_PATTERN = "reply:count:comment:*";
     @Autowired
@@ -68,86 +64,36 @@ public class VideoTask {
         }
     }
 
-    //同步点赞到数据库
+    /**
+     * 同步点赞到数据库。
+     * 已停用全库 SCAN:点赞/收藏现已实时写库,定时任务再扫 Redis 只会徒增 CPU。
+     */
     public void syncLikesToDatabase() {
-        Collection<String> keys = redisCache.scanKeys(LIKE_KEY_PREFIX + "*:user:*");
-        if (keys != null && !keys.isEmpty()) {
-            for (String key : keys) {
-                String[] parts = key.split(":");
-                Long videoId = Long.parseLong(parts[2]);
-                long userId = Long.parseLong(parts[4]);
-                //判断是否存在数据库
-                int check = videoLikeMapper.checkLike(videoId, userId);
-                if (check==0){
-                    FsUserVideoLike map=new FsUserVideoLike();
-                    map.setVideoId(videoId);
-                    map.setUserId(userId);
-                    map.setCreateTime(new Date());
-                    videoLikeMapper.insertFsUserVideoLike(map);
-                }
-                //删除key
-                redisCache.deleteObject(key);
-            }
-        }
+        logger.debug("syncLikesToDatabase skipped: like is persisted on request");
     }
 
-    //同步取消点赞到数据库
+    /**
+     * 同步取消点赞到数据库。
+     * 已停用:业务不再写入 unlike:video:* 键。
+     */
     public void syncUnlikesToDatabase() {
-        Collection<String> keys = redisCache.scanKeys(UNLIKE_KEY_PREFIX + "*:user:*");
-        if (keys != null && !keys.isEmpty()) {
-            for (String key : keys) {
-                String[] parts = key.split(":");
-                Long videoId = Long.parseLong(parts[2]);
-                long userId = Long.parseLong(parts[4]);
-
-                // 从数据库中删除点赞记录
-                videoLikeMapper.deleteLike(videoId, userId);
-
-                // 从Redis中删除记录
-                redisCache.deleteObject(key);
-            }
-        }
+        logger.debug("syncUnlikesToDatabase skipped: unlike key is no longer used");
     }
 
-    //同步收藏到数据库
+    /**
+     * 同步收藏到数据库。
+     * 已停用全库 SCAN:收藏操作现已实时写库。
+     */
     public void syncFavoritesToDatabase() {
-        Collection<String> keys = redisCache.scanKeys(FAVORITE_KEY_PREFIX + "*:user:*");
-        if (keys != null && !keys.isEmpty()) {
-            for (String key : keys) {
-                String[] parts = key.split(":");
-                Long videoId = Long.parseLong(parts[2]);
-                long userId = Long.parseLong(parts[4]);
-                //判断是否存在数据库
-                int check = videoFavoriteMapper.checkFavorite(videoId, userId);
-                if (check==0){
-                    FsUserVideoFavorite map=new FsUserVideoFavorite();
-                    map.setVideoId(videoId);
-                    map.setUserId(userId);
-                    map.setCreateTime(new Date());
-                    videoFavoriteMapper.insertFsUserVideoFavorite(map);
-                }
-                //删除key
-                redisCache.deleteObject(key);
-            }
-        }
+        logger.debug("syncFavoritesToDatabase skipped: favorite is persisted on request");
     }
 
-    //同步取消收藏到数据库
+    /**
+     * 同步取消收藏到数据库。
+     * 已停用:业务不再写入 nofavorite:video:* 键。
+     */
     public void syncUnFavoritesToDatabase() {
-        Collection<String> keys = redisCache.scanKeys(NO_FAVORITE_KEY_PREFIX + "*:user:*");
-        if (keys != null && !keys.isEmpty()) {
-            for (String key : keys) {
-                String[] parts = key.split(":");
-                Long videoId = Long.parseLong(parts[2]);
-                long userId = Long.parseLong(parts[4]);
-
-                // 从数据库中删除点赞记录
-                videoFavoriteMapper.deleteFavorite(videoId, userId);
-
-                // 从Redis中删除记录
-                redisCache.deleteObject(key);
-            }
-        }
+        logger.debug("syncUnFavoritesToDatabase skipped: nofavorite key is no longer used");
     }
 
     //同步评论数量

+ 22 - 18
fs-service/src/main/java/com/fs/course/service/impl/FsUserVideoFavoriteServiceImpl.java

@@ -5,7 +5,6 @@ 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;
@@ -102,38 +101,43 @@ 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) {
-        String key = FAVORITE_KEY_PREFIX + videoId + ":user:" + userId;
+        String key = favoriteKey(videoId, userId);
         Boolean hasFavorite = redisTemplate.opsForValue().get(key);
-        if (hasFavorite != null && hasFavorite) {
+        if (Boolean.TRUE.equals(hasFavorite)) {
             return R.ok().put("isFavorite", 1);
-        } else {
-            return fsUserVideoFavoriteMapper.checkFavorite(videoId, userId) > 0
-                    ? R.ok().put("isFavorite", 1)
-                    : R.error().put("isFavorite", 0);
         }
+        if (Boolean.FALSE.equals(hasFavorite)) {
+            return R.error().put("isFavorite", 0);
+        }
+        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) {
-        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);
+        if (fsUserVideoFavoriteMapper.checkFavorite(videoId, userId) == 0) {
+            FsUserVideoFavorite favorite = new FsUserVideoFavorite();
+            favorite.setVideoId(videoId);
+            favorite.setUserId(userId);
+            favorite.setCreateTime(DateUtils.getNowDate());
+            fsUserVideoFavoriteMapper.insertFsUserVideoFavorite(favorite);
+        }
+        redisTemplate.opsForValue().set(favoriteKey(videoId, userId), true, 1, TimeUnit.DAYS);
     }
 
     @Override
     @Transactional
-    @Synchronized
     public void deleteFavorite(Long videoId, long 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);
+        fsUserVideoFavoriteMapper.deleteFavorite(videoId, userId);
+        redisTemplate.opsForValue().set(favoriteKey(videoId, userId), false, 1, TimeUnit.DAYS);
+    }
+
+    private static String favoriteKey(Long videoId, long userId) {
+        return FAVORITE_KEY_PREFIX + videoId + ":user:" + userId;
     }
 }

+ 22 - 18
fs-service/src/main/java/com/fs/course/service/impl/FsUserVideoLikeServiceImpl.java

@@ -5,7 +5,6 @@ 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;
@@ -104,38 +103,43 @@ public class FsUserVideoLikeServiceImpl implements IFsUserVideoLikeService
     }
 
     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) {
-        String key = LIKE_KEY_PREFIX + videoId + ":user:" + userId;
+        String key = likeKey(videoId, userId);
         Boolean hasLiked = redisTemplate.opsForValue().get(key);
-        if (hasLiked != null && hasLiked) {
+        if (Boolean.TRUE.equals(hasLiked)) {
             return R.ok().put("isLike", 1);
-        } else {
-            return fsUserVideoLikeMapper.checkLike(videoId, userId) > 0
-                    ? R.ok().put("isLike", 1)
-                    : R.error().put("isLike", 0);
         }
+        if (Boolean.FALSE.equals(hasLiked)) {
+            return R.error().put("isLike", 0);
+        }
+        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) {
-        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);
+        if (fsUserVideoLikeMapper.checkLike(videoId, userId) == 0) {
+            FsUserVideoLike like = new FsUserVideoLike();
+            like.setVideoId(videoId);
+            like.setUserId(userId);
+            like.setCreateTime(DateUtils.getNowDate());
+            fsUserVideoLikeMapper.insertFsUserVideoLike(like);
+        }
+        redisTemplate.opsForValue().set(likeKey(videoId, userId), true, 1, TimeUnit.DAYS);
     }
 
     @Override
     @Transactional
-    @Synchronized
     public void unlikeVideo(Long videoId, long 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);
+        fsUserVideoLikeMapper.deleteLike(videoId, userId);
+        redisTemplate.opsForValue().set(likeKey(videoId, userId), false, 1, TimeUnit.DAYS);
+    }
+
+    private static String likeKey(Long videoId, long userId) {
+        return LIKE_KEY_PREFIX + videoId + ":user:" + userId;
     }
 }