ToB企服应用市场:ToB评测及商务社交产业平台

标题: Springboot实战——黑马点评之探店及关注 [打印本页]

作者: 石小疯    时间: 2024-9-24 13:13
标题: Springboot实战——黑马点评之探店及关注
黑马点评——达人探店及关注推送

1 探店业务实现

1.1 探店笔记发布

1)笔记blog字段属性


除此之外,在"搜索博客"接口实现中会涉及到向前端展示用户的部分信息,例如用户头像icon、用户昵称name、用户是否点赞该博客islike(用于对点赞按钮高亮作实现),在设计实体类时利用springboot注解@TableField(exist = false)来标记这些前端展示字段并不属于数据库库表中的真实字段

2)上传博客接口实现


上传图片接口单独实现


3)索引博客接口实现

1.2 笔记点赞实现

1)最简朴素现逻辑

将该博客的点赞数+1 即实行
update tb_blog set liked=liked+1 where id=?
2)针对重复点赞制止逻辑完善


为了制止同一用户对同一博客重复点赞,采取Redis中的set集合(利用set集合元素的唯一性)来存储对某一博客点赞用户id的记录。
联合以上数据布局,将点赞逻辑完善:
两种查询blog的业务也要做isLike判断来返回给前端,进而实现点赞按钮的高亮判断:
3)特定博客的点赞排行榜显示

在检察用户博客时应该在对应位置将点赞的用户信息(头像及昵称)同步显示出来,简朴的实现逻辑是按用户点赞时间从早到晚来排行显示,即越早点赞的用户显示越在前排。
所以该功能对应的数据布局需要满意:
考虑Redis中的三种集合数据布局:
综上所述,应该选择sortedSet来实现点赞列表缓存

所以,将ZSet缓存逻辑替换了上述的Set缓存逻辑,也就是更改增删改的Redis下令语句即可实现优化了。
so,利用sortedSet优化后的点赞排行榜实现逻辑变成:
利用range(key,begin,end)即可返回与key对应的value集合中从下标为begin到end的按时间戳排好序的记录,提取其中的userid,即可以查询到user列表返回前端了。
BUT,这么实现有个问题
返回的用户列表为想要返回的(begin,end)列表的倒序
原因在于:从Redis中查找返回的Zset中的idsList是正确次序的,但是当通过listByIds去数据库中查找对应用户信息时利用了
select icon,nick_name from tb_user where id IN(a,b,c,...)
其中(a,b,c...)原本是正确的次序,但查找的信息结果却是倒序的了

此处若将sql语句修改为
select icon,nick_name from tb_user where id IN(a,b,c,...) ORDER BY FIELD(id,a,b,c,...)
指定返回的次序按id指定的次序
学习一段代码:
  1. // 从set集合中提取出用户ids
  2.         List<Long> ids = rangeLikeSet.stream().map(Long::valueOf).collect(Collectors.toList());
  3.         // 【优化点】:解决mysql语句中in list返回的记录中默认按id的从小到大顺序的问题
  4.         
  5.         String idStr = StrUtil.join(",",ids);
  6.         List<UserDTO> userDTOs = userService.query()
  7.                 .in("id",ids).last("ORDER BY FIELD(id,"+ idStr +")").list()
  8.                 .stream()
  9.                 .map(user -> BeanUtil.copyProperties(user,UserDTO.class))
  10.                 .collect(Collectors.toList());
复制代码
2 关注及推送业务实现

关注与被关注是多-多的关系,借用中心表单来记录
2.1 建立中心表单来记录

1)用户-被关注用户表


实现关注功能时,需要考虑前端服务器的关注按钮高亮判断
需要实现两个接口:
2)用户间的共同关注列表

检索共同关注即检索用户关注列表中的交集,这就需要Redis缓存set数据布局来实现。
在实现关注功能时,同时将关注关系存入数据库和Redis-set中,求共同关注时利用Intersect方法来求用户Id交集
3)关注推送实现

几种推送方式对比


接口实现需求:
(先来实现最基本的推送功能)
滚动分页实现:

基于上述分页查询的利弊分析得到:
sortedSet中的按score范围查询的方法ZREVRANGEBYSCORE,需要两个可变参数:
1 上一次查询出来记录的最后一条score值;
2 上一次查询出来最小时间戳score值雷同的记录总数offSet
这两个指标可以由每次分页查询结果返回给前端
利用到sortedSet中的reversescorerange,该方法接收五个参数:
综上所述,每次查询返回给前端用于下一次查询的参数:
1)maxId
2)offSet
实现接口需要明确以下几个问题:
Q:分页查询是从哪里查?
A:从博主向粉丝的推送序列sortedSet中查,sortedSet的关键字是粉丝用户id,内容是(博客标识id,发布时间戳score),分页查询出的结果是由内容构成的元组序列。
Q:查询的结果要怎么向需要返回的结果转换
A:该接口返回的结果是博客本身、minTime、offSet,这三项内容可以封装到一个通用实体类ScrollResult中;博客序列由博客标识id到数据库中批量查找返回(前提是要提取出元组序列中的标识id);minTime直接在遍历元组序列时迭代赋值score即可获得;offSet初始值赋为1,遍历到score=minTime时则加1。
注意两点:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4