粉丝关注作者与取消关注作者的功能补充

来源:7-12 取消关注&粉丝累减【粉丝关注】

慕勒3498910

2023-01-25

老师:你好。就是我这边在做关注与取消关注功能的时候,感觉在新增关注数据,或者取消关注,删除关注数据的时候,最好在执行功能之前,优先再使用一下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查询一遍粉丝和作者的关注关系,好像这个压力也挺大的。所以,想问一下,对于这块,老师这边还有什么建议么?

写回答

1回答

风间影月

2023-01-25

当然可以啊,可以根据自己的情况适当改写代码优化哈

1
3
慕勒3498910
回复
风间影月
好的,答案和建议均收到。之前,就是感觉问题内容写得太简单,担心大家看到了问题,也不知道我具体是想问的什么点。嗯,我也随着课程学习的深入,不断提高自己各方面的能力,包括问题沟通能力哈,谢谢老师。
2023-01-25
共3条回复

Spring Cloud 进阶 Alibaba 微服务体系自媒体实战

一课收获分布式系统开发,微服务核心技术和中间件企业生产落地

1113 学习 · 896 问题

查看课程