论坛帖子(文章)点赞功能设计,采用springboot+redis+quartz来实现。
按惯例,源代码已上传:https://git.dev.tencent.com/louchengchun/giveALike.git
功能需求:如下图所描述,很明显,该需求的难点在于用户对于点赞和取消点赞状态的频繁转换操作。
如果我们按照常规方式直接操作db,对数据库的压力很大,由此引出了redis和quartz框架的使用。
实现思路:
1,用户的点赞(取消点赞)等信息先以map的形式保存到redis中;
2,使用redis提供的原子性操作,对点赞数进行加1减1的操作;
3,使用quartz框架,把redis中的数据定时更新到mysql(oracle)中
上面五个截图展示了关键的实现过程。
1,定义两个redis的key。我们要采用的是redis的map结构(由key名字也可以看出)第一个用来保存我们的点赞具体信息,第二个用来保存某文章被点赞数量。
2,我们根据文章id,即artId和用户id,即userId,拼接作为map集合中key的值(示例看图二)
3,我们根据用户的点赞状态(是点赞还是取消点赞)来调用不同的方法(图三)。当用户点赞时,根据第二点,map集合中的每一个key的组成形式都是文章id在前,用户id在后,即111111_222222的形式,对应存储的值为点赞状态的标识值(1,点赞,0,取消点赞/未点赞)。这样,我们就把所有的关键信息都以键值对的形式存储了。 假如文章id为1,用户id为1,用户进行点赞操作,那么我们存储的结果为:“1_1”: “1"的形式,如果进行取消点赞操作,那结果自然为"1_1”: “0"的形式。如下图所示,这样,把用户频繁的点赞取消操作放到redis中处理。
4,这里可以采用quartz提供的定时调度机制来定时的更新数据到关系数据库中。如果您开发框架也是springboot,那么直接让你的scheduler实现ApplicationRunner接口,重写其run方法,这样scheduler就会伴随着容器启动。
5,使用redisTemplate封装的scan,即扫描方法,遍历出map集合中所有的键值对,我们的键里面以111_222的形式封装的artId和userId,取出后以”_"标识拆开即可;而当前的值即代表点赞(取消点赞)的状态。这些信息保存到like对象中,然后把每一个like对象保存到一个list集合中返回即可。
具体思路大体如上面所述,一些具体的实现还有一些细节的地方在代码里面也完善了,但是仍有很多不足之处。
近期工作较忙,开头写了近一个月,正文一直没写,实在抱歉。
后期会在现有基础上继续优化,感谢阅读,欢迎讨论!