老师:你好。就是我这边在做关注与取消关注功能的时候,感觉在新增关注数据,或者取消关注,删除关注数据的时候,最好在执行功能之前,优先再使用一下isMeFollowThisWriter()这个方法,先判别一下writerId与fanId之间,是否已经存在粉丝与作者直接的关联关系后,再进行后续的功能逻辑,更好一些。
具体的代码如下:
@Override
@Transactional
public void follow(String writerId, String fanId) {
// 首先,判断是否已经存在粉丝关注关系
if (isMeFollowThisWriter(writerId, fanId)) {
return;
}
String fanPkId = sid.nextShort();
Fans fan = new Fans();
fan.setId(fanPkId);
fan.setWriterId(writerId);
fan.setFanId(fanId);
AppUser fanInfo = userService.getUser(fanId);
fan.setFace(fanInfo.getFace());
fan.setFanNickname(fanInfo.getNickname());
fan.setSex(fanInfo.getSex());
fan.setProvince(fanInfo.getProvince());
// 数据库操作新增
fansMapper.insert(fan);
// 粉丝数更新
redis.increment(REDIS_WRITER_FANS_COUNTS + ":" + writerId, 1);
// 关注数更新
redis.increment(REDIS_MY_FOLLOW_COUNTS + ":" + fanId, 1);
}
@Override
@Transactional
public void unFollow(String writerId, String fanId) {
// 首先,判断是否已经存在粉丝关注关系
if (!isMeFollowThisWriter(writerId, fanId)) {
return;
}
Fans fan = new Fans();
fan.setWriterId(writerId);
fan.setFanId(fanId);
// 数据库操作删除
fansMapper.delete(fan);
// 粉丝数更新
redis.decrement(REDIS_WRITER_FANS_COUNTS + ":" + writerId, 1);
// 关注数更新
redis.decrement(REDIS_MY_FOLLOW_COUNTS + ":" + fanId, 1);
}因为实际操作的时候呢,可能存在同一个作者主页的页面,在多个端,多个浏览器,或者同一个浏览器的多个页签页面上同时打开的情形,那么就会存在页面静置的情况,我这边在测试的时候,就是将同一个作者主页页面,打开了3份,然后,逐一做了3遍添加关注和取消关注的操作。就发现,如果不在关注和取消关注的接口逻辑中,优先查一下writerId与fanId是否已经存在关注的关联关系的话,直接操作DB和Redis的数据更新,可能就会导致粉丝与作者的关注关系数据记录,粉丝数与关注数的重复增加,以及删减的时候呢,会重复扣减关注数与粉丝数,把关注数与粉丝数都扣减到一个负数值。但是,我也在想另外一个方面的问题,就是关注和取消关注一般也是流量比较高的接口,如果每次都在操作关注与取消关注之前,还得通过DB查询一遍粉丝和作者的关注关系,好像这个压力也挺大的。所以,想问一下,对于这块,老师这边还有什么建议么?
一课收获分布式系统开发,微服务核心技术和中间件企业生产落地
了解课程