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