项目持续更新中:
仿抖音短视频APP专栏
目录
关注短视频博主
Redis技术妙用
取消关注博主
在我们的主页中,刷视频时是可以在头像下方进行一个关注
点击头像,进入对方的主页也是可以进行关注的。
我们在这里会涉及到一张新的表,叫做粉丝表:
这里有三个字段,博主id,粉丝id,是否为朋友。
如果点击关注,那么我的表里面就会新增一条数据。
我们先来编写service:
接着实现:
@Service
public class FansServiceImpl extends BaseInfoProperties implements FansService {
@Resource
private FansMapper fansMapper;
@Autowired
private Sid sid;
@Override
public void doFollow(String myId, String vlogerId) {
String fid = sid.nextShort();
Fans fans = new Fans();
fans.setId(fid);
fans.setFanId(myId);
fans.setVlogerId(vlogerId);
fans.setIsFanFriendOfMine(1);
//判断对方是否关注我,如果关注我,那么双方都要互为朋友关注
Fans vloger = queryFansRelationship(vlogerId,myId);
if (vloger != null){
fans.setIsFanFriendOfMine(YesOrNo.YES.type);
vloger.setIsFanFriendOfMine(YesOrNo.YES.type);
fansMapper.updateByPrimaryKey(fans);
}else {
fans.setIsFanFriendOfMine(YesOrNo.NO.type);
}
fansMapper.insert(fans);
}
这里主要交换参数位置,来查询是否互为粉丝
public Fans queryFansRelationship(String fanId,String vlogerId){
Example example = new Example(Fans.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("vlogerId",fanId);
criteria.andEqualTo("fanId",vlogerId);
List list = fansMapper.selectByExample(example);
Fans fan = null;
if( list !=null && list.size() > 0 && !list.isEmpty()) {
fan = (Fans) list.get(0);
}
return fan;
}
接下来实现controller:
我们先打开前端查看:
这里是需要传入两个参数,一个是我的id,还有一个是博主的id。
我们在代码中:
@Slf4j
@Api(tags = "FansController 粉丝相关业务功能的接口" )
@RequestMapping("fans")
@RestController
public class FansController extends BaseInfoProperties{
@Autowired
private FansService fansService;
@Autowired
private UserService userService;
@PostMapping("follow")
public GraceJSONResult follow(@RequestParam String myId,
@RequestParam String vlogerId){
if(StringUtils.isNotBlank(myId)&&StringUtils.isNotBlank(vlogerId)){
return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR);
}
//判断当前用户,自己不能关注自己
if(myId.equalsIgnoreCase(vlogerId)){
return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR);
}
//判断两个id对应的用户是否存在
Users vloger = userService.getUser(vlogerId);
Users myInfo = userService.getUser(myId);
if(myInfo == null || vloger == null){
return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR);
}
//保存粉丝关系到数据库
fansService.doFollow(myId,vlogerId);
return GraceJSONResult.ok();
}
}
我们可以思考一下,两个用户id的数据库查询后的判断,是分开好?还是合并判断好?
随后重启当前的服务,
这个是我们的主页,这里已经是做了判断,我们这里是没有关注按钮的
我们滑到另一个用户的视频,
点击关注,我们可以返回数据库查看一下:
这个是我们的账户,
随后在粉丝表中搜索,这多了一条记录。这里是粉丝id,博主的id我们也可以拷贝查看一下
现在我们登录到这个咩咩羊的账户,也关注演示账号。
然后我们回到数据库
发现字段还是0,没有发送更改,我们回到controller:
发现了两个小问题,进行了一下修改。所以说我们平常要仔细一点。
我们重启,测试:
这里已经成功了。
我们在这个页面还没有实现相应的查询功能,
如果我们这里退出,重新关注,是会报错的。
假设我们查询粉丝关注总数,我们普遍来讲是用counts,在数据库中查询,但是在目前的互联网情
况下,高并发等,如果粉丝数达到千万,那么会有性能的影响。我们不能把所有的请求压力给我们
的数据库。我们在这里选择redis,它有一个技术功能:
我们设定一个key:
我们会发现它的步长是1,而且是单线程的。随着数值的增长,我们通过get 就能获得数值:
//博主的粉丝+1 ,我的关注+1;
redis.increment(REDIS_MY_FOLLOWS_COUNTS+":" + myId,1);
redis.increment(REDIS_MY_FANS_COUNTS+":"+ vlogerId,1);
//我和博主的关联关系,依赖redis,不要存储数据库,避免db的性能瓶颈
redis.set(REDIS_FANS_AND_VLOGGER_RELATIONSHIP+":"+myId+":"+":"+vlogerId,"1");
大家思考一下,我们的redis是放在controller处理好,还是service好。
现在我们重启,然后在redis中查看一下结果:
我们在这已经声明好了,后期如果有查询就可以使用redis。
我们这里做的基本都是和关注相反的操作。
在service层:
在service层实现:
@Transactional
@Override
public void doCancel(String myId, String vlogerId) {
//判断我们是否为朋友关系,如果是,则需要取消双方的关系
Fans fan =queryFansRelationship(myId,vlogerId);
if(fan !=null && fan.getIsFanFriendOfMine() == YesOrNo.YES.type){
//抹除双方的朋友关系,自己的关系删除即可
Fans pendingFan =queryFansRelationship(vlogerId,myId);
pendingFan.setIsFanFriendOfMine(YesOrNo.NO.type);
fansMapper.updateByPrimaryKey(pendingFan);
}
//删除自己的关注关联表记录
fansMapper.delete(fan);
}
查看我们的前端:
我们回到controller:
@PostMapping("cancel")
public GraceJSONResult cancel(@RequestParam String myId,
@RequestParam String vlogerId){
//删除业务的执行
fansService.doCancel(myId,vlogerId);
//博主的粉丝-1 ,我的关注-1;
redis.decrement(REDIS_MY_FOLLOWS_COUNTS+":" + myId,1);
redis.decrement(REDIS_MY_FANS_COUNTS+":"+ vlogerId,1);
//我和博主的关联关系,依赖redis,不要存储数据库,避免db的性能瓶颈
redis.del(REDIS_FANS_AND_VLOGGER_RELATIONSHIP+":"+myId+":"+":"+vlogerId);
return GraceJSONResult.ok();
}
这里建议redis的操作放到service层完成。
我们重启,测试:
打开页面,点击取消关注
这里记录少了一条。我们再点击关注:
这里就实现了我们的关注和取关。