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

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);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值