这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记
继上一篇,本文继续写项目中对comment部分的实现。
用户添加或删除评论(CommentAction)
显然,从业务上来看,无论是发布评论还是删除评论都需要用户处于登陆状态,所以首先我们应该在中间件中根据token去check用户是否合法,并得到用户相应的userID。然后,判断客户端传来的action type是否合法,并且根据其值去调用对应的接口
- 用户添加评论(AddComment) 首先应该check客户端传来的comment内容是否合法,长度是否小于上界(防止太长的评论带来极大的存储负载以及恶意攻击)。然后,用雪花算法给此评论生成一个满足分布式单调递增的主键id。开启mysql事务,先将当前评论插入comment表,然后更新redis信息,如果redis写入失败则回滚。写入redis仍然是先检查key是否存在于缓存中,如果key存在则修改对应的value值,不存在则不做处理。key包括两个,一个是当前视频包括的评论id(有序集合),另一个则是videoID(comment_count加1)。之所以选用有序集合而不是列表做存储结构,主要的考虑是列表在高并发场景下插入容易存在一致性的问题。当一个线程发生缓存失效时,首先会先从mysql中读取数据,然后再将数据写入redis中。但这两个操作并非原子的,在不加锁的情况下(高并发场景加锁对性能影响较大,存在tradeoff),很难保证写入redis中的数据仍然是最新的。因为可能会有其他线程对此数据进行修改,很有可能写入redis中的数据是一个脏数据。虽然我们可能对一致性的要求并非那么高,但考虑到set可以去重,可能在此方面更胜于list。
(后续见下文)