diff --git a/src/main/java/com/ai/da/common/utils/RedisUtil.java b/src/main/java/com/ai/da/common/utils/RedisUtil.java index 0d5c6153..902e50e0 100644 --- a/src/main/java/com/ai/da/common/utils/RedisUtil.java +++ b/src/main/java/com/ai/da/common/utils/RedisUtil.java @@ -7,10 +7,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -154,6 +151,8 @@ public class RedisUtil { return redisTemplate.keys(key); } + public Long getSize(String key){return redisTemplate.opsForSet().size(key);} + public List getMultiValue(Set keys){ return redisTemplate.opsForValue().multiGet(keys); } @@ -216,4 +215,17 @@ public class RedisUtil { return redisTemplate.opsForValue().increment(key, 0); } + public Long getViewCount(String key) { + Object value = redisTemplate.opsForValue().get(key); + if (value instanceof Integer) { + return Long.valueOf((Integer) value); + } else if (value instanceof Long) { + return (Long) value; + } else if (value instanceof String) { + return Long.valueOf((String) value); + } else { + throw new IllegalArgumentException("Unexpected value type"); + } + } + } diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index 295ac54b..0fba4ddb 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -8,6 +8,7 @@ import com.ai.da.common.utils.MinioUtil; import com.ai.da.common.utils.RedisUtil; import com.ai.da.mapper.primary.*; import com.ai.da.mapper.primary.entity.*; +import com.ai.da.mapper.primary.entity.Collection; import com.ai.da.model.dto.*; import com.ai.da.model.enums.Position; import com.ai.da.model.enums.Sex; @@ -20,21 +21,20 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.base.Function; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; -import sun.security.krb5.internal.crypto.Des; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.stream.Collectors; +@Slf4j @Service public class PortfolioServiceImpl extends ServiceImpl implements PortfolioService { @@ -60,8 +60,8 @@ public class PortfolioServiceImpl extends ServiceImpl likedPortfolioIdList = redisUtil.getLikedPortfolios(userHolder.getId()); if (!CollectionUtils.isEmpty(likedPortfolioIdList)) { qw.lambda().in(Portfolio::getId, likedPortfolioIdList); - }else { + } else { return PageBaseResponse.success(new Page<>()); } } + List topThree = new ArrayList<>(); + + if (query.getPage() == 1 && + (query.getGetMyPortfolio() != 1 || query.getGetLikePortfolio() != 1)) { + List topThreeLike = getTopThreeLikeFromRedis(RedisUtil.PORTFOLIO_LIKE_KEY); + log.info("top three like 的作品集的id : {}", topThreeLike); + List topThreeView = getTopThreeViewFromRedis(RedisUtil.PORTFOLIO_VIEW_KEY); + log.info("top three view 的作品集的id : {}", topThreeView); + QueryWrapper queryLike = new QueryWrapper<>(); + queryLike.in("id", topThreeLike); + QueryWrapper queryView = new QueryWrapper<>(); + queryView.in("id", topThreeView); + List topThreeLikePortfolio = baseMapper.selectList(queryLike); + List topThreeViewPortfolio = baseMapper.selectList(queryView); + topThree.addAll(topThreeLikePortfolio); + topThree.addAll(topThreeViewPortfolio); + } + qw.lambda().orderByDesc(Portfolio::getUpdateDate); - IPage page = portfolioMapper.selectPage(new Page<>(query.getPage(), query.getSize()),qw); + IPage page = portfolioMapper.selectPage(new Page<>(query.getPage(), query.getSize()), qw); + if (!topThree.isEmpty()) { + List records = page.getRecords(); + records.addAll(0, topThree); + page.setRecords(records); + } IPage convert = page.convert((Function) portfolio -> { if (portfolio != null) { PortfolioVO vo = CopyUtil.copyObject(portfolio, PortfolioVO.class); @@ -481,11 +504,11 @@ public class PortfolioServiceImpl extends ServiceImpl getSelectedQw = new QueryWrapper<>(); getSelectedQw.lambda().eq(UserLikeGroup::getAccountId, userHolder.getId()); @@ -520,7 +543,7 @@ public class PortfolioServiceImpl extends ServiceImpl userLikeGroups = userLikeGroupMapper.selectList(getSelectedQw); if (CollectionUtils.isEmpty(userLikeGroups)) { vo.setSelected(0); - }else { + } else { vo.setSelected(1); } } @@ -547,12 +570,12 @@ public class PortfolioServiceImpl extends ServiceImpl getTopThreeLikeFromRedis(String prefix) { + // 获取所有与 PORTFOLIO_LIKE_KEY 相关的 keys + Set keys = redisUtil.getKeysFromString(prefix + "*"); + + List> portfolioSizes = new ArrayList<>(); + + if (keys != null) { + for (String key : keys) { + // 获取 Set 的 size + Long size = redisUtil.getSize(key); + // 保存 key 和 size + portfolioSizes.add(new AbstractMap.SimpleEntry<>(key, size)); + } + // 按 size 倒序排序 + portfolioSizes.sort((e1, e2) -> e2.getValue().compareTo(e1.getValue())); + // 获取 size 最大的前三个 + List top3PortfolioIds = portfolioSizes.stream() + .limit(3) + .map(Map.Entry::getKey) + .map(key -> key.replace(prefix, "")) // 去掉前缀,获取 portfolioId + .map(Long::valueOf) + .collect(Collectors.toList()); + // 输出 top3PortfolioIds + top3PortfolioIds.forEach(System.out::println); + return top3PortfolioIds; + } + return null; + } + + private List getTopThreeViewFromRedis(String prefix) { + // Step 1: Get all keys with the specific prefix + Set keys = redisUtil.getKeysFromString(prefix + "*"); +// Step 2: Create a map to store portfolioId and its corresponding value + Map portfolioViews = new HashMap<>(); + if (keys != null) { + for (String key : keys) { + // Get the value associated with the key + Long value = redisUtil.getViewCount(key); + if (!Objects.isNull(value)) { + // Extract the portfolioId from the key (assuming the key structure is consistent) + Long portfolioId = Long.valueOf(key.replace(prefix, "")); + portfolioViews.put(portfolioId, value); + } + } + } +// Step 3: Find the top 3 portfolio IDs with the largest values + if (!portfolioViews.isEmpty()){ + List top3PortfolioIds = portfolioViews.entrySet().stream() + .sorted(Map.Entry.comparingByValue().reversed()) + .limit(3) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + + System.out.println("Top 3 Portfolio IDs: " + top3PortfolioIds); + return top3PortfolioIds; + } + return null; + } }