老师:你好。就是我这边在做关注与取消关注功能的时候,感觉在新增关注数据,或者取消关注,删除关注数据的时候,最好在执行功能之前,优先再使用一下isMeFollowThisWriter()这个方法,先判别一下writerId与fanId之间,是否已经存在粉丝与作者直接的关联关系后,再进行后续的功能逻辑,更好一些。
具体的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | @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查询一遍粉丝和作者的关注关系,好像这个压力也挺大的。所以,想问一下,对于这块,老师这边还有什么建议么?
一课收获分布式系统开发,微服务核心技术和中间件企业生产落地
了解课程