内容一:要获取点赞排行榜,得设计好数据结构并存储相应得数据;SortedSet闪亮登场
内容二:为了减少二次加工和取值的方便,我们直接将"文章的标题"也一并塞进去...(备注,在Value中采用某个分隔符进行拼接)
PraiseService.java
//缓存点赞排行榜(数据结构zset;sortedSet)~score=点赞总数;value=文章id-文章标题 //需要同时适用于点赞和取消点赞的场景 private void cacheArticlePraiseRank(final PraiseDto dto,final Integer total){ final String value=dto.getArticleId()+SplitChar+dto.getTitle(); ZSetOperations<String,String> praiseSort=redisTemplate.opsForZSet(); //需要清除掉之前已经存储的值 praiseSort.remove(Constant.RedisArticlePraiseSortKey,value); //塞入最新的值 praiseSort.add(Constant.RedisArticlePraiseSortKey,value,total.doubleValue()); //改进之处:hash存储:key;field=文章id;value=文章标题 }然后在cachePraiseOn()和cachePraiseCancel()这两个方法中调用
//缓存点赞排行榜sortedSet this.cacheArticlePraiseRank(dto,uIds.size()); 缓存点赞排行榜sortedSet-点赞总数就是文章点赞用户集合的总个数为了在前台接受数据,创建一个ArticlePraiseRankDto.java
@Data @AllArgsConstructor @NoArgsConstructor @EqualsAndHashCode public class ArticlePraiseRankDto implements Serializable{ //文章id private String articleId; //文章标题 private String title; //点赞总数 private String total; private Double score; } //根据点赞数的高低得到排行榜 List<ArticlePraiseRankDto> ranks= Lists.newLinkedList(); ZSetOperations<String,String> praiseSort=redisTemplate.opsForZSet(); Long total=praiseSort.size(Constant.RedisArticlePraiseSortKey); Set<String> set=praiseSort.reverseRange(Constant.RedisArticlePraiseSortKey,0L,total); if (set!=null && !set.isEmpty()){ set.forEach(value -> { Double score=praiseSort.score(Constant.RedisArticlePraiseSortKey,value); if (score>0){ Integer pos=StringUtils.indexOf(value,SplitChar); if (pos>0){ //[0,pos)是id;[pos+1,~]剩下的为title String aId=StringUtils.substring(value,0,pos); String aTitle=StringUtils.substring(value,pos+1); ranks.add(new ArticlePraiseRankDto(aId,aTitle,score.toString(),score)); } } }); } resMap.put("PraiseArticleRanks~根据点赞数的高低从大排到小~排行榜",ranks); return resMap;