使用Redis实现点赞和生成根据点赞时间的点赞排行榜

  • Post author:
  • Post category:其他


1.实现一次点赞和取消点赞

对于这种业务,小白是这样想的:哎?直接让前端搞一个单点按钮不久好了,让前端来判断点赞,当然,前端确实可以实现这样的业务,但是,前端所做的一切,都是可以跳过的,核心还是后端对数据库的操作和判断,所以,后端对于该业务的实现,还是很有必要的。

点赞流程:

对于点赞,我们将每次点赞者都存放在redis中的

set集合

中,这样每次有人进行点赞请求,我们事先判断它是否在redis中有,如果有就是已经点赞了的,则直接结束

取消点赞:

取消点赞就是请求过来先通过redis看一下set集合中是否是已经点赞了的,只有点赞了的才可以进行取消点赞,判断资格完毕,就可以将该信息删除并更新数据库即可

2.实现点赞排行榜

对于点赞者,我们希望在自己作品里进行展示,并且按照时间顺序进行展示,就和微信朋友圈一样。

业务要求:

1.用户唯一

2.可排序

3.方便查找

那么,我们想一下redis中有没有这样一个数据类型,可以实现这样的功能呢?

找了一遍:

SortedSet

就可以实现


SortSet是元素带有score,并且按score排序的有序且元素唯一集合

实现步骤:

1.用户点赞时,将用户id和时间戳保存到SortSet中

2.通过range命令,即可获取到相应排名的用户id

3.之后再查数据库返回相应用户信息即可

    @Override
    public Result queryBlogLikes(Long id) {
        String key = BLOG_LIKED_KEY + id;
        // 1.查询top5的点赞用户 zrange key 0 4
        Set<String> top5 = stringRedisTemplate.opsForZSet().range(key, 0, 4);
        if (top5 == null || top5.isEmpty()) {
            return Result.ok(Collections.emptyList());
        }
        // 2.解析出其中的用户id
        List<Long> ids = top5.stream().map(Long::valueOf).collect(Collectors.toList());
        String idStr = StrUtil.join(",", ids);
        // 3.根据用户id查询用户 WHERE id IN ( 5 , 1 ) ORDER BY FIELD(id, 5, 1)
        List<UserDTO> userDTOS = userService.query()
                .in("id", ids).last("ORDER BY FIELD(id," + idStr + ")").list()
                .stream()
                .map(user -> BeanUtil.copyProperties(user, UserDTO.class))
                .collect(Collectors.toList());
        // 4.返回
        return Result.ok(userDTOS);
    }



版权声明:本文为leyasuzhou原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。