老师:你好。就是我这边在做关注与取消关注功能的时候,感觉在新增关注数据,或者取消关注,删除关注数据的时候,最好在执行功能之前,优先再使用一下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查询一遍粉丝和作者的关注关系,好像这个压力也挺大的。所以,想问一下,对于这块,老师这边还有什么建议么?
一课收获分布式系统开发,微服务核心技术和中间件企业生产落地
了解课程