浏览代码

app视频点赞和我的收藏优化

xw 6 小时之前
父节点
当前提交
7fde3f4071

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

@@ -70,7 +70,7 @@ public class VideoTask {
 
     //同步点赞到数据库
     public void syncLikesToDatabase() {
-        Collection<String> keys = redisCache.keys(LIKE_KEY_PREFIX + "*:user:*");
+        Collection<String> keys = redisCache.scanKeys(LIKE_KEY_PREFIX + "*:user:*");
         if (keys != null && !keys.isEmpty()) {
             for (String key : keys) {
                 String[] parts = key.split(":");
@@ -93,7 +93,7 @@ public class VideoTask {
 
     //同步取消点赞到数据库
     public void syncUnlikesToDatabase() {
-        Collection<String> keys = redisCache.keys(UNLIKE_KEY_PREFIX + "*:user:*");
+        Collection<String> keys = redisCache.scanKeys(UNLIKE_KEY_PREFIX + "*:user:*");
         if (keys != null && !keys.isEmpty()) {
             for (String key : keys) {
                 String[] parts = key.split(":");
@@ -111,7 +111,7 @@ public class VideoTask {
 
     //同步收藏到数据库
     public void syncFavoritesToDatabase() {
-        Collection<String> keys = redisCache.keys(FAVORITE_KEY_PREFIX + "*:user:*");
+        Collection<String> keys = redisCache.scanKeys(FAVORITE_KEY_PREFIX + "*:user:*");
         if (keys != null && !keys.isEmpty()) {
             for (String key : keys) {
                 String[] parts = key.split(":");
@@ -134,7 +134,7 @@ public class VideoTask {
 
     //同步取消收藏到数据库
     public void syncUnFavoritesToDatabase() {
-        Collection<String> keys = redisCache.keys(NO_FAVORITE_KEY_PREFIX + "*:user:*");
+        Collection<String> keys = redisCache.scanKeys(NO_FAVORITE_KEY_PREFIX + "*:user:*");
         if (keys != null && !keys.isEmpty()) {
             for (String key : keys) {
                 String[] parts = key.split(":");

+ 36 - 0
fs-common/src/main/java/com/fs/common/core/redis/RedisCache.java

@@ -1,11 +1,15 @@
 package com.fs.common.core.redis;
 
+import java.io.IOException;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.connection.RedisConnection;
 import org.springframework.data.redis.core.BoundSetOperations;
+import org.springframework.data.redis.core.Cursor;
 import org.springframework.data.redis.core.HashOperations;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ScanOptions;
 import org.springframework.data.redis.core.ValueOperations;
 import org.springframework.stereotype.Component;
 
@@ -258,12 +262,44 @@ public class RedisCache
      *
      * @param pattern 字符串前缀
      * @return 对象列表
+     * @deprecated 生产环境请使用 {@link #scanKeys(String)},KEYS 会阻塞 Redis
      */
+    @Deprecated
     public Collection<String> keys(final String pattern)
     {
         return redisTemplate.keys(pattern);
     }
 
+    /**
+     * 使用 SCAN 迭代匹配 key,避免 KEYS 全库扫描阻塞 Redis
+     *
+     * @param pattern key 匹配模式,例如 "favorite:video:*:user:*"
+     * @return 匹配到的 key 集合
+     */
+    public Collection<String> scanKeys(final String pattern)
+    {
+        Set<String> keys = new HashSet<>();
+        ScanOptions options = ScanOptions.scanOptions()
+                .match(pattern)
+                .count(1000)
+                .build();
+        redisTemplate.execute((RedisConnection connection) -> {
+            try (Cursor<byte[]> cursor = connection.scan(options)) {
+                while (cursor.hasNext()) {
+                    byte[] rawKey = cursor.next();
+                    String key = (String) redisTemplate.getKeySerializer().deserialize(rawKey);
+                    if (key != null) {
+                        keys.add(key);
+                    }
+                }
+            } catch (IOException e) {
+                throw new RuntimeException("Redis SCAN failed, pattern: " + pattern, e);
+            }
+            return null;
+        });
+        return keys;
+    }
+
 
     public Boolean setIfAbsent(String key, String value, long timeout, TimeUnit unit) {
         return redisTemplate.opsForValue().setIfAbsent(key, value, timeout, unit);

+ 4 - 4
fs-service/src/main/java/com/fs/course/mapper/FsUserVideoMapper.java

@@ -152,7 +152,7 @@ public interface FsUserVideoMapper
     @Select({"<script> " +
             "select v.video_id as id,v.talent_id as talentId,t.user_id as userId,v.title,v.description as msg,t.nick_name as username,t.avatar as headImg, " +
             "v.thumbnail as cover,v.url as src,v.likes as likeNum,v.comments as smsNum,v.favorite_num," +
-            "v.create_time,v.views as playNumber,v.product_id,v.product_json,p.img_url,p.package_name,v.shares from fs_user_video_favorite f " +
+            "v.create_time,v.views as playNumber,v.product_id,v.product_json,p.img_url,p.package_name,v.shares,v.add_num from fs_user_video_favorite f " +
             "left join fs_user_video v on v.video_id = f.video_id " +
             "left join fs_user_talent t on t.talent_id = v.talent_id " +
             " left join fs_package p on p.package_id = v.product_id " +
@@ -165,7 +165,7 @@ public interface FsUserVideoMapper
     @Select({"<script> " +
             "select v.video_id as id,v.talent_id as talentId,t.user_id as userId,v.title,v.description as msg,t.nick_name as username,t.avatar as headImg, " +
             "v.thumbnail as cover,v.url as src,v.likes as likeNum,v.comments as smsNum,v.favorite_num," +
-            "v.create_time,v.views as playNumber,v.product_id,v.product_json,p.img_url,p.package_name,v.shares from fs_user_video_like l " +
+            "v.create_time,v.views as playNumber,v.product_id,v.product_json,p.img_url,p.package_name,v.shares,v.add_num from fs_user_video_like l " +
             "left join fs_user_video v on v.video_id = l.video_id " +
             "left join fs_user_talent t on t.talent_id = v.talent_id " +
             " left join fs_package p on p.package_id = v.product_id " +
@@ -178,7 +178,7 @@ public interface FsUserVideoMapper
     @Select({"<script> " +
             "select v.video_id as id,v.talent_id as talentId,t.user_id as userId,v.title,v.description as msg,t.nick_name as username,t.avatar as headImg, " +
             "v.thumbnail as cover,v.url as src,v.likes as likeNum,v.comments as smsNum,v.favorite_num," +
-            "v.create_time,v.views as playNumber,v.product_id,v.product_json,p.img_url,p.package_name,v.shares from fs_user_video_comment c " +
+            "v.create_time,v.views as playNumber,v.product_id,v.product_json,p.img_url,p.package_name,v.shares,v.add_num from fs_user_video_comment c " +
             "left join fs_user_video v on v.video_id = c.video_id " +
             "left join fs_user_talent t on t.talent_id = v.talent_id " +
             " left join fs_package p on p.package_id = v.product_id " +
@@ -207,7 +207,7 @@ public interface FsUserVideoMapper
     @Select({"<script> " +
             "select v.video_id as id,v.talent_id as talentId,t.user_id as userId,v.title,v.description as msg,t.nick_name as username,t.avatar as headImg, " +
             "v.thumbnail as cover,v.url as src,v.likes as likeNum,v.comments as smsNum,v.favorite_num," +
-            "v.create_time,v.views as playNumber,v.product_id,p.img_url,p.package_name,v.upload_type,v.shares from fs_user_video v " +
+            "v.create_time,v.views as playNumber,v.product_id,p.img_url,p.package_name,v.upload_type,v.shares,v.add_num from fs_user_video v " +
             "left join fs_user_talent t on t.talent_id = v.talent_id " +
             " left join fs_package p on p.package_id = v.product_id " +
             "where v.is_del = 0 and v.status = 1 and v.video_id = #{videoId} " +

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

@@ -346,6 +346,13 @@ public class FsUserVideoServiceImpl implements IFsUserVideoService {
                 int favoriteAddNum = 0;
                 int sharesAddNum = 0;
                 String addNum = vo.getAddNum();
+                if (StringUtils.isBlank(addNum)) {
+                    FsUserVideo video = fsUserVideoMapper.selectFsUserVideoByVideoId(vo.getId());
+                    if (video != null && StringUtils.isNotBlank(video.getAddNum())) {
+                        addNum = video.getAddNum();
+                        vo.setAddNum(addNum);
+                    }
+                }
                 Random random = new Random();
                 if (StringUtils.isNotBlank(addNum)) {
                     List<String> addNums = Arrays.asList(addNum.split(","));

+ 4 - 4
fs-user-app/src/main/java/com/fs/app/controller/VideoTestController.java

@@ -53,7 +53,7 @@ public class VideoTestController{
     @ApiOperation("同步点赞")
     @GetMapping("/syncLikes")
     public void syncLikesToDatabase() {
-        Collection<String> keys = redisCache.keys(LIKE_KEY_PREFIX + "*:user:*");
+        Collection<String> keys = redisCache.scanKeys(LIKE_KEY_PREFIX + "*:user:*");
         if (keys != null && !keys.isEmpty()) {
             for (String key : keys) {
                 String[] parts = key.split(":");
@@ -77,7 +77,7 @@ public class VideoTestController{
     //同步取消点赞到数据库
     @GetMapping("/syncUnlikes")
     public void syncUnlikesToDatabase() {
-        Collection<String> keys = redisCache.keys(UNLIKE_KEY_PREFIX + "*:user:*");
+        Collection<String> keys = redisCache.scanKeys(UNLIKE_KEY_PREFIX + "*:user:*");
         if (keys != null && !keys.isEmpty()) {
             for (String key : keys) {
                 String[] parts = key.split(":");
@@ -96,7 +96,7 @@ public class VideoTestController{
     //同步收藏到数据库
     @GetMapping("/syncFavorites")
     public void syncFavoritesToDatabase() {
-        Collection<String> keys = redisCache.keys(FAVORITE_KEY_PREFIX + "*:user:*");
+        Collection<String> keys = redisCache.scanKeys(FAVORITE_KEY_PREFIX + "*:user:*");
         if (keys != null && !keys.isEmpty()) {
             for (String key : keys) {
                 String[] parts = key.split(":");
@@ -120,7 +120,7 @@ public class VideoTestController{
     //同步取消收藏到数据库
     @GetMapping("/syncUnFavorites")
     public void syncUnFavoritesToDatabase() {
-        Collection<String> keys = redisCache.keys(NO_FAVORITE_KEY_PREFIX + "*:user:*");
+        Collection<String> keys = redisCache.scanKeys(NO_FAVORITE_KEY_PREFIX + "*:user:*");
         if (keys != null && !keys.isEmpty()) {
             for (String key : keys) {
                 String[] parts = key.split(":");